projax 3.3.54 → 3.3.56

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 (33) hide show
  1. package/coverage/core-bridge.ts.html +5 -2
  2. package/coverage/index.html +31 -31
  3. package/coverage/lcov-report/core-bridge.ts.html +5 -2
  4. package/coverage/lcov-report/index.html +31 -31
  5. package/coverage/lcov-report/port-extractor.ts.html +289 -289
  6. package/coverage/lcov-report/port-scanner.ts.html +1 -1
  7. package/coverage/lcov-report/port-utils.ts.html +1 -1
  8. package/coverage/lcov-report/script-runner.ts.html +1 -1
  9. package/coverage/lcov-report/test-parser.ts.html +163 -163
  10. package/coverage/lcov.info +344 -344
  11. package/coverage/port-extractor.ts.html +289 -289
  12. package/coverage/port-scanner.ts.html +1 -1
  13. package/coverage/port-utils.ts.html +1 -1
  14. package/coverage/script-runner.ts.html +1 -1
  15. package/coverage/test-parser.ts.html +163 -163
  16. package/dist/__tests__/core-bridge.test.d.ts +1 -0
  17. package/dist/__tests__/core-bridge.test.js +135 -0
  18. package/dist/__tests__/port-extractor.test.d.ts +1 -0
  19. package/dist/__tests__/port-extractor.test.js +407 -0
  20. package/dist/__tests__/test-parser.test.d.ts +1 -0
  21. package/dist/__tests__/test-parser.test.js +276 -0
  22. package/dist/api/__tests__/routes.test.js +10 -0
  23. package/dist/api/__tests__/routes.test.js.map +1 -1
  24. package/dist/api/core-bridge.d.ts.map +1 -1
  25. package/dist/api/core-bridge.js +20 -11
  26. package/dist/api/core-bridge.js.map +1 -1
  27. package/dist/core-bridge.d.ts +1 -1
  28. package/dist/core-bridge.js +2 -2
  29. package/dist/electron/renderer/assets/index-Cj4QON0s.js +66 -0
  30. package/dist/electron/renderer/index.html +1 -1
  31. package/dist/index.js +1 -1
  32. package/jest.config.js +4 -4
  33. package/package.json +1 -1
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">2.09% </span>
26
+ <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>3/143</span>
28
+ <span class='fraction'>143/143</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">98.38% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/62</span>
35
+ <span class='fraction'>61/62</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
- <span class='fraction'>0/9</span>
42
+ <span class='fraction'>9/9</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">2.18% </span>
47
+ <span class="strong">100% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>3/137</span>
49
+ <span class='fraction'>137/137</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
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -426,8 +426,8 @@
426
426
  <a name='L361'></a><a href='#L361'>361</a>
427
427
  <a name='L362'></a><a href='#L362'>362</a>
428
428
  <a name='L363'></a><a href='#L363'>363</a>
429
- <a name='L364'></a><a href='#L364'>364</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
430
- <span class="cline-any cline-yes">1x</span>
429
+ <a name='L364'></a><a href='#L364'>364</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
430
+ <span class="cline-any cline-yes">2x</span>
431
431
  <span class="cline-any cline-neutral">&nbsp;</span>
432
432
  <span class="cline-any cline-neutral">&nbsp;</span>
433
433
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -438,64 +438,64 @@
438
438
  <span class="cline-any cline-neutral">&nbsp;</span>
439
439
  <span class="cline-any cline-neutral">&nbsp;</span>
440
440
  <span class="cline-any cline-neutral">&nbsp;</span>
441
- <span class="cline-any cline-yes">1x</span>
442
- <span class="cline-any cline-no">&nbsp;</span>
441
+ <span class="cline-any cline-yes">2x</span>
442
+ <span class="cline-any cline-yes">28x</span>
443
443
  <span class="cline-any cline-neutral">&nbsp;</span>
444
444
  <span class="cline-any cline-neutral">&nbsp;</span>
445
- <span class="cline-any cline-no">&nbsp;</span>
446
- <span class="cline-any cline-no">&nbsp;</span>
445
+ <span class="cline-any cline-yes">28x</span>
446
+ <span class="cline-any cline-yes">28x</span>
447
447
  <span class="cline-any cline-neutral">&nbsp;</span>
448
448
  <span class="cline-any cline-neutral">&nbsp;</span>
449
- <span class="cline-any cline-no">&nbsp;</span>
450
- <span class="cline-any cline-no">&nbsp;</span>
449
+ <span class="cline-any cline-yes">28x</span>
450
+ <span class="cline-any cline-yes">28x</span>
451
451
  <span class="cline-any cline-neutral">&nbsp;</span>
452
452
  <span class="cline-any cline-neutral">&nbsp;</span>
453
- <span class="cline-any cline-no">&nbsp;</span>
454
- <span class="cline-any cline-no">&nbsp;</span>
453
+ <span class="cline-any cline-yes">28x</span>
454
+ <span class="cline-any cline-yes">28x</span>
455
455
  <span class="cline-any cline-neutral">&nbsp;</span>
456
456
  <span class="cline-any cline-neutral">&nbsp;</span>
457
- <span class="cline-any cline-no">&nbsp;</span>
458
- <span class="cline-any cline-no">&nbsp;</span>
457
+ <span class="cline-any cline-yes">28x</span>
458
+ <span class="cline-any cline-yes">28x</span>
459
459
  <span class="cline-any cline-neutral">&nbsp;</span>
460
460
  <span class="cline-any cline-neutral">&nbsp;</span>
461
- <span class="cline-any cline-no">&nbsp;</span>
462
- <span class="cline-any cline-no">&nbsp;</span>
461
+ <span class="cline-any cline-yes">28x</span>
462
+ <span class="cline-any cline-yes">28x</span>
463
463
  <span class="cline-any cline-neutral">&nbsp;</span>
464
464
  <span class="cline-any cline-neutral">&nbsp;</span>
465
- <span class="cline-any cline-no">&nbsp;</span>
466
- <span class="cline-any cline-no">&nbsp;</span>
465
+ <span class="cline-any cline-yes">28x</span>
466
+ <span class="cline-any cline-yes">28x</span>
467
467
  <span class="cline-any cline-neutral">&nbsp;</span>
468
468
  <span class="cline-any cline-neutral">&nbsp;</span>
469
- <span class="cline-any cline-no">&nbsp;</span>
470
- <span class="cline-any cline-no">&nbsp;</span>
469
+ <span class="cline-any cline-yes">28x</span>
470
+ <span class="cline-any cline-yes">28x</span>
471
471
  <span class="cline-any cline-neutral">&nbsp;</span>
472
472
  <span class="cline-any cline-neutral">&nbsp;</span>
473
- <span class="cline-any cline-no">&nbsp;</span>
474
- <span class="cline-any cline-no">&nbsp;</span>
473
+ <span class="cline-any cline-yes">28x</span>
474
+ <span class="cline-any cline-yes">23x</span>
475
475
  <span class="cline-any cline-neutral">&nbsp;</span>
476
476
  <span class="cline-any cline-neutral">&nbsp;</span>
477
- <span class="cline-any cline-no">&nbsp;</span>
477
+ <span class="cline-any cline-yes">28x</span>
478
478
  <span class="cline-any cline-neutral">&nbsp;</span>
479
479
  <span class="cline-any cline-neutral">&nbsp;</span>
480
480
  <span class="cline-any cline-neutral">&nbsp;</span>
481
481
  <span class="cline-any cline-neutral">&nbsp;</span>
482
482
  <span class="cline-any cline-neutral">&nbsp;</span>
483
483
  <span class="cline-any cline-neutral">&nbsp;</span>
484
- <span class="cline-any cline-no">&nbsp;</span>
485
- <span class="cline-any cline-no">&nbsp;</span>
484
+ <span class="cline-any cline-yes">28x</span>
485
+ <span class="cline-any cline-yes">28x</span>
486
486
  <span class="cline-any cline-neutral">&nbsp;</span>
487
- <span class="cline-any cline-no">&nbsp;</span>
488
- <span class="cline-any cline-no">&nbsp;</span>
487
+ <span class="cline-any cline-yes">28x</span>
488
+ <span class="cline-any cline-yes">17x</span>
489
489
  <span class="cline-any cline-neutral">&nbsp;</span>
490
490
  <span class="cline-any cline-neutral">&nbsp;</span>
491
- <span class="cline-any cline-no">&nbsp;</span>
492
- <span class="cline-any cline-no">&nbsp;</span>
493
- <span class="cline-any cline-no">&nbsp;</span>
491
+ <span class="cline-any cline-yes">11x</span>
492
+ <span class="cline-any cline-yes">11x</span>
493
+ <span class="cline-any cline-yes">10x</span>
494
494
  <span class="cline-any cline-neutral">&nbsp;</span>
495
- <span class="cline-any cline-no">&nbsp;</span>
496
- <span class="cline-any cline-no">&nbsp;</span>
495
+ <span class="cline-any cline-yes">10x</span>
496
+ <span class="cline-any cline-yes">10x</span>
497
497
  <span class="cline-any cline-neutral">&nbsp;</span>
498
- <span class="cline-any cline-no">&nbsp;</span>
498
+ <span class="cline-any cline-yes">10x</span>
499
499
  <span class="cline-any cline-neutral">&nbsp;</span>
500
500
  <span class="cline-any cline-neutral">&nbsp;</span>
501
501
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -504,17 +504,17 @@
504
504
  <span class="cline-any cline-neutral">&nbsp;</span>
505
505
  <span class="cline-any cline-neutral">&nbsp;</span>
506
506
  <span class="cline-any cline-neutral">&nbsp;</span>
507
- <span class="cline-any cline-no">&nbsp;</span>
508
- <span class="cline-any cline-no">&nbsp;</span>
509
- <span class="cline-any cline-no">&nbsp;</span>
510
- <span class="cline-any cline-no">&nbsp;</span>
511
- <span class="cline-any cline-no">&nbsp;</span>
512
- <span class="cline-any cline-no">&nbsp;</span>
507
+ <span class="cline-any cline-yes">10x</span>
508
+ <span class="cline-any cline-yes">25x</span>
509
+ <span class="cline-any cline-yes">25x</span>
510
+ <span class="cline-any cline-yes">10x</span>
511
+ <span class="cline-any cline-yes">10x</span>
512
+ <span class="cline-any cline-yes">8x</span>
513
513
  <span class="cline-any cline-neutral">&nbsp;</span>
514
514
  <span class="cline-any cline-neutral">&nbsp;</span>
515
515
  <span class="cline-any cline-neutral">&nbsp;</span>
516
516
  <span class="cline-any cline-neutral">&nbsp;</span>
517
- <span class="cline-any cline-no">&nbsp;</span>
517
+ <span class="cline-any cline-yes">8x</span>
518
518
  <span class="cline-any cline-neutral">&nbsp;</span>
519
519
  <span class="cline-any cline-neutral">&nbsp;</span>
520
520
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -524,47 +524,47 @@
524
524
  <span class="cline-any cline-neutral">&nbsp;</span>
525
525
  <span class="cline-any cline-neutral">&nbsp;</span>
526
526
  <span class="cline-any cline-neutral">&nbsp;</span>
527
- <span class="cline-any cline-no">&nbsp;</span>
527
+ <span class="cline-any cline-yes">11x</span>
528
528
  <span class="cline-any cline-neutral">&nbsp;</span>
529
529
  <span class="cline-any cline-neutral">&nbsp;</span>
530
530
  <span class="cline-any cline-neutral">&nbsp;</span>
531
531
  <span class="cline-any cline-neutral">&nbsp;</span>
532
532
  <span class="cline-any cline-neutral">&nbsp;</span>
533
533
  <span class="cline-any cline-neutral">&nbsp;</span>
534
- <span class="cline-any cline-no">&nbsp;</span>
535
- <span class="cline-any cline-no">&nbsp;</span>
534
+ <span class="cline-any cline-yes">28x</span>
535
+ <span class="cline-any cline-yes">28x</span>
536
536
  <span class="cline-any cline-neutral">&nbsp;</span>
537
537
  <span class="cline-any cline-neutral">&nbsp;</span>
538
538
  <span class="cline-any cline-neutral">&nbsp;</span>
539
539
  <span class="cline-any cline-neutral">&nbsp;</span>
540
540
  <span class="cline-any cline-neutral">&nbsp;</span>
541
541
  <span class="cline-any cline-neutral">&nbsp;</span>
542
- <span class="cline-any cline-no">&nbsp;</span>
543
- <span class="cline-any cline-no">&nbsp;</span>
544
- <span class="cline-any cline-no">&nbsp;</span>
542
+ <span class="cline-any cline-yes">28x</span>
543
+ <span class="cline-any cline-yes">112x</span>
544
+ <span class="cline-any cline-yes">112x</span>
545
545
  <span class="cline-any cline-neutral">&nbsp;</span>
546
- <span class="cline-any cline-no">&nbsp;</span>
547
- <span class="cline-any cline-no">&nbsp;</span>
546
+ <span class="cline-any cline-yes">3x</span>
547
+ <span class="cline-any cline-yes">3x</span>
548
548
  <span class="cline-any cline-neutral">&nbsp;</span>
549
549
  <span class="cline-any cline-neutral">&nbsp;</span>
550
- <span class="cline-any cline-no">&nbsp;</span>
550
+ <span class="cline-any cline-yes">3x</span>
551
551
  <span class="cline-any cline-neutral">&nbsp;</span>
552
552
  <span class="cline-any cline-neutral">&nbsp;</span>
553
553
  <span class="cline-any cline-neutral">&nbsp;</span>
554
554
  <span class="cline-any cline-neutral">&nbsp;</span>
555
555
  <span class="cline-any cline-neutral">&nbsp;</span>
556
556
  <span class="cline-any cline-neutral">&nbsp;</span>
557
- <span class="cline-any cline-no">&nbsp;</span>
558
- <span class="cline-any cline-no">&nbsp;</span>
559
- <span class="cline-any cline-no">&nbsp;</span>
560
- <span class="cline-any cline-no">&nbsp;</span>
561
- <span class="cline-any cline-no">&nbsp;</span>
562
- <span class="cline-any cline-no">&nbsp;</span>
557
+ <span class="cline-any cline-yes">3x</span>
558
+ <span class="cline-any cline-yes">3x</span>
559
+ <span class="cline-any cline-yes">3x</span>
560
+ <span class="cline-any cline-yes">3x</span>
561
+ <span class="cline-any cline-yes">3x</span>
562
+ <span class="cline-any cline-yes">3x</span>
563
563
  <span class="cline-any cline-neutral">&nbsp;</span>
564
564
  <span class="cline-any cline-neutral">&nbsp;</span>
565
565
  <span class="cline-any cline-neutral">&nbsp;</span>
566
566
  <span class="cline-any cline-neutral">&nbsp;</span>
567
- <span class="cline-any cline-no">&nbsp;</span>
567
+ <span class="cline-any cline-yes">3x</span>
568
568
  <span class="cline-any cline-neutral">&nbsp;</span>
569
569
  <span class="cline-any cline-neutral">&nbsp;</span>
570
570
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -573,40 +573,40 @@
573
573
  <span class="cline-any cline-neutral">&nbsp;</span>
574
574
  <span class="cline-any cline-neutral">&nbsp;</span>
575
575
  <span class="cline-any cline-neutral">&nbsp;</span>
576
- <span class="cline-any cline-no">&nbsp;</span>
576
+ <span class="cline-any cline-yes">28x</span>
577
577
  <span class="cline-any cline-neutral">&nbsp;</span>
578
578
  <span class="cline-any cline-neutral">&nbsp;</span>
579
579
  <span class="cline-any cline-neutral">&nbsp;</span>
580
580
  <span class="cline-any cline-neutral">&nbsp;</span>
581
581
  <span class="cline-any cline-neutral">&nbsp;</span>
582
582
  <span class="cline-any cline-neutral">&nbsp;</span>
583
- <span class="cline-any cline-no">&nbsp;</span>
584
- <span class="cline-any cline-no">&nbsp;</span>
583
+ <span class="cline-any cline-yes">28x</span>
584
+ <span class="cline-any cline-yes">28x</span>
585
585
  <span class="cline-any cline-neutral">&nbsp;</span>
586
- <span class="cline-any cline-no">&nbsp;</span>
587
- <span class="cline-any cline-no">&nbsp;</span>
588
- <span class="cline-any cline-no">&nbsp;</span>
586
+ <span class="cline-any cline-yes">28x</span>
587
+ <span class="cline-any cline-yes">84x</span>
588
+ <span class="cline-any cline-yes">84x</span>
589
589
  <span class="cline-any cline-neutral">&nbsp;</span>
590
- <span class="cline-any cline-no">&nbsp;</span>
591
- <span class="cline-any cline-no">&nbsp;</span>
590
+ <span class="cline-any cline-yes">1x</span>
591
+ <span class="cline-any cline-yes">1x</span>
592
592
  <span class="cline-any cline-neutral">&nbsp;</span>
593
593
  <span class="cline-any cline-neutral">&nbsp;</span>
594
- <span class="cline-any cline-no">&nbsp;</span>
594
+ <span class="cline-any cline-yes">1x</span>
595
595
  <span class="cline-any cline-neutral">&nbsp;</span>
596
596
  <span class="cline-any cline-neutral">&nbsp;</span>
597
597
  <span class="cline-any cline-neutral">&nbsp;</span>
598
598
  <span class="cline-any cline-neutral">&nbsp;</span>
599
- <span class="cline-any cline-no">&nbsp;</span>
600
- <span class="cline-any cline-no">&nbsp;</span>
601
- <span class="cline-any cline-no">&nbsp;</span>
602
- <span class="cline-any cline-no">&nbsp;</span>
603
- <span class="cline-any cline-no">&nbsp;</span>
604
- <span class="cline-any cline-no">&nbsp;</span>
599
+ <span class="cline-any cline-yes">1x</span>
600
+ <span class="cline-any cline-yes">1x</span>
601
+ <span class="cline-any cline-yes">1x</span>
602
+ <span class="cline-any cline-yes">1x</span>
603
+ <span class="cline-any cline-yes">1x</span>
604
+ <span class="cline-any cline-yes">1x</span>
605
605
  <span class="cline-any cline-neutral">&nbsp;</span>
606
606
  <span class="cline-any cline-neutral">&nbsp;</span>
607
607
  <span class="cline-any cline-neutral">&nbsp;</span>
608
608
  <span class="cline-any cline-neutral">&nbsp;</span>
609
- <span class="cline-any cline-no">&nbsp;</span>
609
+ <span class="cline-any cline-yes">1x</span>
610
610
  <span class="cline-any cline-neutral">&nbsp;</span>
611
611
  <span class="cline-any cline-neutral">&nbsp;</span>
612
612
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -615,40 +615,40 @@
615
615
  <span class="cline-any cline-neutral">&nbsp;</span>
616
616
  <span class="cline-any cline-neutral">&nbsp;</span>
617
617
  <span class="cline-any cline-neutral">&nbsp;</span>
618
- <span class="cline-any cline-no">&nbsp;</span>
618
+ <span class="cline-any cline-yes">28x</span>
619
619
  <span class="cline-any cline-neutral">&nbsp;</span>
620
620
  <span class="cline-any cline-neutral">&nbsp;</span>
621
621
  <span class="cline-any cline-neutral">&nbsp;</span>
622
622
  <span class="cline-any cline-neutral">&nbsp;</span>
623
623
  <span class="cline-any cline-neutral">&nbsp;</span>
624
624
  <span class="cline-any cline-neutral">&nbsp;</span>
625
- <span class="cline-any cline-no">&nbsp;</span>
626
- <span class="cline-any cline-no">&nbsp;</span>
625
+ <span class="cline-any cline-yes">28x</span>
626
+ <span class="cline-any cline-yes">28x</span>
627
627
  <span class="cline-any cline-neutral">&nbsp;</span>
628
- <span class="cline-any cline-no">&nbsp;</span>
629
- <span class="cline-any cline-no">&nbsp;</span>
630
- <span class="cline-any cline-no">&nbsp;</span>
628
+ <span class="cline-any cline-yes">28x</span>
629
+ <span class="cline-any cline-yes">56x</span>
630
+ <span class="cline-any cline-yes">56x</span>
631
631
  <span class="cline-any cline-neutral">&nbsp;</span>
632
- <span class="cline-any cline-no">&nbsp;</span>
633
- <span class="cline-any cline-no">&nbsp;</span>
632
+ <span class="cline-any cline-yes">1x</span>
633
+ <span class="cline-any cline-yes">1x</span>
634
634
  <span class="cline-any cline-neutral">&nbsp;</span>
635
635
  <span class="cline-any cline-neutral">&nbsp;</span>
636
- <span class="cline-any cline-no">&nbsp;</span>
636
+ <span class="cline-any cline-yes">1x</span>
637
637
  <span class="cline-any cline-neutral">&nbsp;</span>
638
638
  <span class="cline-any cline-neutral">&nbsp;</span>
639
639
  <span class="cline-any cline-neutral">&nbsp;</span>
640
640
  <span class="cline-any cline-neutral">&nbsp;</span>
641
- <span class="cline-any cline-no">&nbsp;</span>
642
- <span class="cline-any cline-no">&nbsp;</span>
643
- <span class="cline-any cline-no">&nbsp;</span>
644
- <span class="cline-any cline-no">&nbsp;</span>
645
- <span class="cline-any cline-no">&nbsp;</span>
646
- <span class="cline-any cline-no">&nbsp;</span>
641
+ <span class="cline-any cline-yes">1x</span>
642
+ <span class="cline-any cline-yes">1x</span>
643
+ <span class="cline-any cline-yes">1x</span>
644
+ <span class="cline-any cline-yes">1x</span>
645
+ <span class="cline-any cline-yes">1x</span>
646
+ <span class="cline-any cline-yes">1x</span>
647
647
  <span class="cline-any cline-neutral">&nbsp;</span>
648
648
  <span class="cline-any cline-neutral">&nbsp;</span>
649
649
  <span class="cline-any cline-neutral">&nbsp;</span>
650
650
  <span class="cline-any cline-neutral">&nbsp;</span>
651
- <span class="cline-any cline-no">&nbsp;</span>
651
+ <span class="cline-any cline-yes">1x</span>
652
652
  <span class="cline-any cline-neutral">&nbsp;</span>
653
653
  <span class="cline-any cline-neutral">&nbsp;</span>
654
654
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -657,32 +657,32 @@
657
657
  <span class="cline-any cline-neutral">&nbsp;</span>
658
658
  <span class="cline-any cline-neutral">&nbsp;</span>
659
659
  <span class="cline-any cline-neutral">&nbsp;</span>
660
- <span class="cline-any cline-no">&nbsp;</span>
660
+ <span class="cline-any cline-yes">28x</span>
661
661
  <span class="cline-any cline-neutral">&nbsp;</span>
662
662
  <span class="cline-any cline-neutral">&nbsp;</span>
663
663
  <span class="cline-any cline-neutral">&nbsp;</span>
664
664
  <span class="cline-any cline-neutral">&nbsp;</span>
665
665
  <span class="cline-any cline-neutral">&nbsp;</span>
666
666
  <span class="cline-any cline-neutral">&nbsp;</span>
667
- <span class="cline-any cline-no">&nbsp;</span>
668
- <span class="cline-any cline-no">&nbsp;</span>
667
+ <span class="cline-any cline-yes">28x</span>
668
+ <span class="cline-any cline-yes">28x</span>
669
669
  <span class="cline-any cline-neutral">&nbsp;</span>
670
- <span class="cline-any cline-no">&nbsp;</span>
671
- <span class="cline-any cline-no">&nbsp;</span>
670
+ <span class="cline-any cline-yes">28x</span>
671
+ <span class="cline-any cline-yes">26x</span>
672
672
  <span class="cline-any cline-neutral">&nbsp;</span>
673
673
  <span class="cline-any cline-neutral">&nbsp;</span>
674
- <span class="cline-any cline-no">&nbsp;</span>
675
- <span class="cline-any cline-no">&nbsp;</span>
674
+ <span class="cline-any cline-yes">2x</span>
675
+ <span class="cline-any cline-yes">2x</span>
676
676
  <span class="cline-any cline-neutral">&nbsp;</span>
677
677
  <span class="cline-any cline-neutral">&nbsp;</span>
678
- <span class="cline-any cline-no">&nbsp;</span>
679
- <span class="cline-any cline-no">&nbsp;</span>
680
- <span class="cline-any cline-no">&nbsp;</span>
681
- <span class="cline-any cline-no">&nbsp;</span>
682
- <span class="cline-any cline-no">&nbsp;</span>
683
- <span class="cline-any cline-no">&nbsp;</span>
684
- <span class="cline-any cline-no">&nbsp;</span>
685
- <span class="cline-any cline-no">&nbsp;</span>
678
+ <span class="cline-any cline-yes">1x</span>
679
+ <span class="cline-any cline-yes">1x</span>
680
+ <span class="cline-any cline-yes">1x</span>
681
+ <span class="cline-any cline-yes">1x</span>
682
+ <span class="cline-any cline-yes">1x</span>
683
+ <span class="cline-any cline-yes">1x</span>
684
+ <span class="cline-any cline-yes">1x</span>
685
+ <span class="cline-any cline-yes">1x</span>
686
686
  <span class="cline-any cline-neutral">&nbsp;</span>
687
687
  <span class="cline-any cline-neutral">&nbsp;</span>
688
688
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -694,40 +694,40 @@
694
694
  <span class="cline-any cline-neutral">&nbsp;</span>
695
695
  <span class="cline-any cline-neutral">&nbsp;</span>
696
696
  <span class="cline-any cline-neutral">&nbsp;</span>
697
- <span class="cline-any cline-no">&nbsp;</span>
697
+ <span class="cline-any cline-yes">2x</span>
698
698
  <span class="cline-any cline-neutral">&nbsp;</span>
699
699
  <span class="cline-any cline-neutral">&nbsp;</span>
700
700
  <span class="cline-any cline-neutral">&nbsp;</span>
701
701
  <span class="cline-any cline-neutral">&nbsp;</span>
702
702
  <span class="cline-any cline-neutral">&nbsp;</span>
703
703
  <span class="cline-any cline-neutral">&nbsp;</span>
704
- <span class="cline-any cline-no">&nbsp;</span>
705
- <span class="cline-any cline-no">&nbsp;</span>
704
+ <span class="cline-any cline-yes">28x</span>
705
+ <span class="cline-any cline-yes">28x</span>
706
706
  <span class="cline-any cline-neutral">&nbsp;</span>
707
- <span class="cline-any cline-no">&nbsp;</span>
708
- <span class="cline-any cline-no">&nbsp;</span>
709
- <span class="cline-any cline-no">&nbsp;</span>
707
+ <span class="cline-any cline-yes">28x</span>
708
+ <span class="cline-any cline-yes">56x</span>
709
+ <span class="cline-any cline-yes">56x</span>
710
710
  <span class="cline-any cline-neutral">&nbsp;</span>
711
- <span class="cline-any cline-no">&nbsp;</span>
712
- <span class="cline-any cline-no">&nbsp;</span>
711
+ <span class="cline-any cline-yes">2x</span>
712
+ <span class="cline-any cline-yes">2x</span>
713
713
  <span class="cline-any cline-neutral">&nbsp;</span>
714
714
  <span class="cline-any cline-neutral">&nbsp;</span>
715
- <span class="cline-any cline-no">&nbsp;</span>
715
+ <span class="cline-any cline-yes">2x</span>
716
716
  <span class="cline-any cline-neutral">&nbsp;</span>
717
717
  <span class="cline-any cline-neutral">&nbsp;</span>
718
718
  <span class="cline-any cline-neutral">&nbsp;</span>
719
719
  <span class="cline-any cline-neutral">&nbsp;</span>
720
- <span class="cline-any cline-no">&nbsp;</span>
721
- <span class="cline-any cline-no">&nbsp;</span>
722
- <span class="cline-any cline-no">&nbsp;</span>
723
- <span class="cline-any cline-no">&nbsp;</span>
724
- <span class="cline-any cline-no">&nbsp;</span>
725
- <span class="cline-any cline-no">&nbsp;</span>
720
+ <span class="cline-any cline-yes">2x</span>
721
+ <span class="cline-any cline-yes">2x</span>
722
+ <span class="cline-any cline-yes">2x</span>
723
+ <span class="cline-any cline-yes">2x</span>
724
+ <span class="cline-any cline-yes">2x</span>
725
+ <span class="cline-any cline-yes">2x</span>
726
726
  <span class="cline-any cline-neutral">&nbsp;</span>
727
727
  <span class="cline-any cline-neutral">&nbsp;</span>
728
728
  <span class="cline-any cline-neutral">&nbsp;</span>
729
729
  <span class="cline-any cline-neutral">&nbsp;</span>
730
- <span class="cline-any cline-no">&nbsp;</span>
730
+ <span class="cline-any cline-yes">2x</span>
731
731
  <span class="cline-any cline-neutral">&nbsp;</span>
732
732
  <span class="cline-any cline-neutral">&nbsp;</span>
733
733
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -736,47 +736,47 @@
736
736
  <span class="cline-any cline-neutral">&nbsp;</span>
737
737
  <span class="cline-any cline-neutral">&nbsp;</span>
738
738
  <span class="cline-any cline-neutral">&nbsp;</span>
739
- <span class="cline-any cline-no">&nbsp;</span>
739
+ <span class="cline-any cline-yes">28x</span>
740
740
  <span class="cline-any cline-neutral">&nbsp;</span>
741
741
  <span class="cline-any cline-neutral">&nbsp;</span>
742
742
  <span class="cline-any cline-neutral">&nbsp;</span>
743
743
  <span class="cline-any cline-neutral">&nbsp;</span>
744
744
  <span class="cline-any cline-neutral">&nbsp;</span>
745
745
  <span class="cline-any cline-neutral">&nbsp;</span>
746
- <span class="cline-any cline-no">&nbsp;</span>
747
- <span class="cline-any cline-no">&nbsp;</span>
746
+ <span class="cline-any cline-yes">28x</span>
747
+ <span class="cline-any cline-yes">28x</span>
748
748
  <span class="cline-any cline-neutral">&nbsp;</span>
749
- <span class="cline-any cline-no">&nbsp;</span>
750
- <span class="cline-any cline-no">&nbsp;</span>
751
- <span class="cline-any cline-no">&nbsp;</span>
749
+ <span class="cline-any cline-yes">28x</span>
750
+ <span class="cline-any cline-yes">112x</span>
751
+ <span class="cline-any cline-yes">112x</span>
752
752
  <span class="cline-any cline-neutral">&nbsp;</span>
753
- <span class="cline-any cline-no">&nbsp;</span>
754
- <span class="cline-any cline-no">&nbsp;</span>
755
- <span class="cline-any cline-no">&nbsp;</span>
753
+ <span class="cline-any cline-yes">7x</span>
754
+ <span class="cline-any cline-yes">7x</span>
755
+ <span class="cline-any cline-yes">7x</span>
756
756
  <span class="cline-any cline-neutral">&nbsp;</span>
757
- <span class="cline-any cline-no">&nbsp;</span>
757
+ <span class="cline-any cline-yes">7x</span>
758
758
  <span class="cline-any cline-neutral">&nbsp;</span>
759
- <span class="cline-any cline-no">&nbsp;</span>
759
+ <span class="cline-any cline-yes">14x</span>
760
760
  <span class="cline-any cline-neutral">&nbsp;</span>
761
761
  <span class="cline-any cline-neutral">&nbsp;</span>
762
- <span class="cline-any cline-no">&nbsp;</span>
762
+ <span class="cline-any cline-yes">12x</span>
763
763
  <span class="cline-any cline-neutral">&nbsp;</span>
764
764
  <span class="cline-any cline-neutral">&nbsp;</span>
765
765
  <span class="cline-any cline-neutral">&nbsp;</span>
766
766
  <span class="cline-any cline-neutral">&nbsp;</span>
767
767
  <span class="cline-any cline-neutral">&nbsp;</span>
768
768
  <span class="cline-any cline-neutral">&nbsp;</span>
769
- <span class="cline-any cline-no">&nbsp;</span>
770
- <span class="cline-any cline-no">&nbsp;</span>
771
- <span class="cline-any cline-no">&nbsp;</span>
772
- <span class="cline-any cline-no">&nbsp;</span>
773
- <span class="cline-any cline-no">&nbsp;</span>
774
- <span class="cline-any cline-no">&nbsp;</span>
769
+ <span class="cline-any cline-yes">12x</span>
770
+ <span class="cline-any cline-yes">31x</span>
771
+ <span class="cline-any cline-yes">31x</span>
772
+ <span class="cline-any cline-yes">7x</span>
773
+ <span class="cline-any cline-yes">7x</span>
774
+ <span class="cline-any cline-yes">7x</span>
775
775
  <span class="cline-any cline-neutral">&nbsp;</span>
776
776
  <span class="cline-any cline-neutral">&nbsp;</span>
777
777
  <span class="cline-any cline-neutral">&nbsp;</span>
778
778
  <span class="cline-any cline-neutral">&nbsp;</span>
779
- <span class="cline-any cline-no">&nbsp;</span>
779
+ <span class="cline-any cline-yes">7x</span>
780
780
  <span class="cline-any cline-neutral">&nbsp;</span>
781
781
  <span class="cline-any cline-neutral">&nbsp;</span>
782
782
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -786,7 +786,7 @@
786
786
  <span class="cline-any cline-neutral">&nbsp;</span>
787
787
  <span class="cline-any cline-neutral">&nbsp;</span>
788
788
  <span class="cline-any cline-neutral">&nbsp;</span>
789
- <span class="cline-any cline-no">&nbsp;</span>
789
+ <span class="cline-any cline-yes">28x</span>
790
790
  <span class="cline-any cline-neutral">&nbsp;</span>
791
791
  <span class="cline-any cline-neutral">&nbsp;</span>
792
792
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import * as fs from 'fs';
@@ -801,64 +801,64 @@ export interface PortInfo {
801
801
  /**
802
802
  * Extract ports from a project's configuration files
803
803
  */
804
- export async function <span class="fstat-no" title="function not covered" >extractPortsFromProject(</span>projectPath: string): Promise&lt;PortInfo[]&gt; {
805
- const ports: PortInfo[] = <span class="cstat-no" title="statement not covered" >[];</span>
804
+ export async function extractPortsFromProject(projectPath: string): Promise&lt;PortInfo[]&gt; {
805
+ const ports: PortInfo[] = [];
806
806
  &nbsp;
807
807
  // Extract from package.json scripts
808
- const packageJsonPorts = <span class="cstat-no" title="statement not covered" >extractPortsFromPackageJson(projectPath);</span>
809
- <span class="cstat-no" title="statement not covered" > ports.push(...packageJsonPorts);</span>
808
+ const packageJsonPorts = extractPortsFromPackageJson(projectPath);
809
+ ports.push(...packageJsonPorts);
810
810
  &nbsp;
811
811
  // Extract from vite.config.js/ts
812
- const vitePorts = <span class="cstat-no" title="statement not covered" >extractPortsFromViteConfig(projectPath);</span>
813
- <span class="cstat-no" title="statement not covered" > ports.push(...vitePorts);</span>
812
+ const vitePorts = extractPortsFromViteConfig(projectPath);
813
+ ports.push(...vitePorts);
814
814
  &nbsp;
815
815
  // Extract from next.config.js/ts
816
- const nextPorts = <span class="cstat-no" title="statement not covered" >extractPortsFromNextConfig(projectPath);</span>
817
- <span class="cstat-no" title="statement not covered" > ports.push(...nextPorts);</span>
816
+ const nextPorts = extractPortsFromNextConfig(projectPath);
817
+ ports.push(...nextPorts);
818
818
  &nbsp;
819
819
  // Extract from webpack.config.js
820
- const webpackPorts = <span class="cstat-no" title="statement not covered" >extractPortsFromWebpackConfig(projectPath);</span>
821
- <span class="cstat-no" title="statement not covered" > ports.push(...webpackPorts);</span>
820
+ const webpackPorts = extractPortsFromWebpackConfig(projectPath);
821
+ ports.push(...webpackPorts);
822
822
  &nbsp;
823
823
  // Extract from angular.json
824
- const angularPorts = <span class="cstat-no" title="statement not covered" >extractPortsFromAngularConfig(projectPath);</span>
825
- <span class="cstat-no" title="statement not covered" > ports.push(...angularPorts);</span>
824
+ const angularPorts = extractPortsFromAngularConfig(projectPath);
825
+ ports.push(...angularPorts);
826
826
  &nbsp;
827
827
  // Extract from nuxt.config.js/ts
828
- const nuxtPorts = <span class="cstat-no" title="statement not covered" >extractPortsFromNuxtConfig(projectPath);</span>
829
- <span class="cstat-no" title="statement not covered" > ports.push(...nuxtPorts);</span>
828
+ const nuxtPorts = extractPortsFromNuxtConfig(projectPath);
829
+ ports.push(...nuxtPorts);
830
830
  &nbsp;
831
831
  // Extract from .env files
832
- const envPorts = <span class="cstat-no" title="statement not covered" >extractPortsFromEnvFiles(projectPath);</span>
833
- <span class="cstat-no" title="statement not covered" > ports.push(...envPorts);</span>
832
+ const envPorts = extractPortsFromEnvFiles(projectPath);
833
+ ports.push(...envPorts);
834
834
  &nbsp;
835
835
  // Remove duplicates (same port and script)
836
- const uniquePorts = <span class="cstat-no" title="statement not covered" >Array.from(</span>
837
- new Map(ports.map(<span class="fstat-no" title="function not covered" >p </span>=&gt; <span class="cstat-no" title="statement not covered" >[`${p.port}-${p.script || ''}`, p])</span>).values()
836
+ const uniquePorts = Array.from(
837
+ new Map(ports.map(p =&gt; [`${p.port}-${p.script || ''}`, p])).values()
838
838
  );
839
839
  &nbsp;
840
- <span class="cstat-no" title="statement not covered" > return uniquePorts;</span>
840
+ return uniquePorts;
841
841
  }
842
842
  &nbsp;
843
843
  /**
844
844
  * Extract ports from package.json scripts
845
845
  */
846
- function <span class="fstat-no" title="function not covered" >extractPortsFromPackageJson(</span>projectPath: string): PortInfo[] {
847
- const ports: PortInfo[] = <span class="cstat-no" title="statement not covered" >[];</span>
848
- const packageJsonPath = <span class="cstat-no" title="statement not covered" >path.join(projectPath, 'package.json');</span>
846
+ function extractPortsFromPackageJson(projectPath: string): PortInfo[] {
847
+ const ports: PortInfo[] = [];
848
+ const packageJsonPath = path.join(projectPath, 'package.json');
849
849
  &nbsp;
850
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!fs.existsSync(packageJsonPath)) {</span>
851
- <span class="cstat-no" title="statement not covered" > return ports;</span>
850
+ if (!fs.existsSync(packageJsonPath)) {
851
+ return ports;
852
852
  }
853
853
  &nbsp;
854
- <span class="cstat-no" title="statement not covered" > try {</span>
855
- const packageJson = <span class="cstat-no" title="statement not covered" >JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));</span>
856
- const scripts = <span class="cstat-no" title="statement not covered" >packageJson.scripts || {};</span>
854
+ try {
855
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
856
+ const scripts = packageJson.scripts || {};
857
857
  &nbsp;
858
- <span class="cstat-no" title="statement not covered" > for (const [scriptName, scriptCommand] of Object.entries(scripts)) {</span>
859
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof scriptCommand === 'string') {</span>
858
+ for (const [scriptName, scriptCommand] of Object.entries(scripts)) {
859
+ if (typeof scriptCommand === 'string') {
860
860
  // Look for --port, -p, PORT= patterns
861
- const portPatterns = <span class="cstat-no" title="statement not covered" >[</span>
861
+ const portPatterns = [
862
862
  /--port\s+(\d+)/i,
863
863
  /-p\s+(\d+)/i,
864
864
  /PORT\s*=\s*(\d+)/i,
@@ -867,17 +867,17 @@ function <span class="fstat-no" title="function not covered" >extractPortsFromPa
867
867
  /PORT=(\d+)/i,
868
868
  ];
869
869
  &nbsp;
870
- <span class="cstat-no" title="statement not covered" > for (const pattern of portPatterns) {</span>
871
- const match = <span class="cstat-no" title="statement not covered" >scriptCommand.match(pattern);</span>
872
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (match &amp;&amp; match[1]) {</span>
873
- const port = <span class="cstat-no" title="statement not covered" >parseInt(match[1], 10);</span>
874
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isNaN(port) &amp;&amp; port &gt; 0 &amp;&amp; port &lt;= 65535) {</span>
875
- <span class="cstat-no" title="statement not covered" > ports.push({</span>
870
+ for (const pattern of portPatterns) {
871
+ const match = scriptCommand.match(pattern);
872
+ if (match &amp;&amp; match[1]) {
873
+ const port = parseInt(match[1], 10);
874
+ if (!isNaN(port) &amp;&amp; port &gt; 0 &amp;&amp; port &lt;= 65535) {
875
+ ports.push({
876
876
  port,
877
877
  script: scriptName,
878
878
  source: 'package.json',
879
879
  });
880
- <span class="cstat-no" title="statement not covered" > break; </span>// Only add once per script
880
+ break; // Only add once per script
881
881
  }
882
882
  }
883
883
  }
@@ -887,47 +887,47 @@ function <span class="fstat-no" title="function not covered" >extractPortsFromPa
887
887
  // Ignore parsing errors
888
888
  }
889
889
  &nbsp;
890
- <span class="cstat-no" title="statement not covered" > return ports;</span>
890
+ return ports;
891
891
  }
892
892
  &nbsp;
893
893
  /**
894
894
  * Extract ports from vite.config.js/ts
895
895
  */
896
- function <span class="fstat-no" title="function not covered" >extractPortsFromViteConfig(</span>projectPath: string): PortInfo[] {
897
- const ports: PortInfo[] = <span class="cstat-no" title="statement not covered" >[];</span>
898
- const configFiles = <span class="cstat-no" title="statement not covered" >[</span>
896
+ function extractPortsFromViteConfig(projectPath: string): PortInfo[] {
897
+ const ports: PortInfo[] = [];
898
+ const configFiles = [
899
899
  'vite.config.js',
900
900
  'vite.config.ts',
901
901
  'vite.config.mjs',
902
902
  'vite.config.cjs',
903
903
  ];
904
904
  &nbsp;
905
- <span class="cstat-no" title="statement not covered" > for (const configFile of configFiles) {</span>
906
- const configPath = <span class="cstat-no" title="statement not covered" >path.join(projectPath, configFile);</span>
907
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!fs.existsSync(configPath)) <span class="cstat-no" title="statement not covered" >continue;</span></span>
905
+ for (const configFile of configFiles) {
906
+ const configPath = path.join(projectPath, configFile);
907
+ if (!fs.existsSync(configPath)) continue;
908
908
  &nbsp;
909
- <span class="cstat-no" title="statement not covered" > try {</span>
910
- const content = <span class="cstat-no" title="statement not covered" >fs.readFileSync(configPath, 'utf-8');</span>
909
+ try {
910
+ const content = fs.readFileSync(configPath, 'utf-8');
911
911
 
912
912
  // Try to extract from server.port
913
- const patterns = <span class="cstat-no" title="statement not covered" >[</span>
913
+ const patterns = [
914
914
  /server\s*:\s*\{[^}]*port\s*:\s*(\d+)/i,
915
915
  /server\s*:\s*\{[^}]*port\s*:\s*['"](\d+)['"]/i,
916
916
  /port\s*:\s*(\d+)/i,
917
917
  /port\s*:\s*['"](\d+)['"]/i,
918
918
  ];
919
919
  &nbsp;
920
- <span class="cstat-no" title="statement not covered" > for (const pattern of patterns) {</span>
921
- const match = <span class="cstat-no" title="statement not covered" >content.match(pattern);</span>
922
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (match &amp;&amp; match[1]) {</span>
923
- const port = <span class="cstat-no" title="statement not covered" >parseInt(match[1], 10);</span>
924
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isNaN(port) &amp;&amp; port &gt; 0 &amp;&amp; port &lt;= 65535) {</span>
925
- <span class="cstat-no" title="statement not covered" > ports.push({</span>
920
+ for (const pattern of patterns) {
921
+ const match = content.match(pattern);
922
+ if (match &amp;&amp; match[1]) {
923
+ const port = parseInt(match[1], 10);
924
+ if (!isNaN(port) &amp;&amp; port &gt; 0 &amp;&amp; port &lt;= 65535) {
925
+ ports.push({
926
926
  port,
927
927
  script: null,
928
928
  source: configFile,
929
929
  });
930
- <span class="cstat-no" title="statement not covered" > break;</span>
930
+ break;
931
931
  }
932
932
  }
933
933
  }
@@ -936,40 +936,40 @@ function <span class="fstat-no" title="function not covered" >extractPortsFromVi
936
936
  }
937
937
  }
938
938
  &nbsp;
939
- <span class="cstat-no" title="statement not covered" > return ports;</span>
939
+ return ports;
940
940
  }
941
941
  &nbsp;
942
942
  /**
943
943
  * Extract ports from next.config.js/ts
944
944
  */
945
- function <span class="fstat-no" title="function not covered" >extractPortsFromNextConfig(</span>projectPath: string): PortInfo[] {
946
- const ports: PortInfo[] = <span class="cstat-no" title="statement not covered" >[];</span>
947
- const configFiles = <span class="cstat-no" title="statement not covered" >['next.config.js', 'next.config.ts', 'next.config.mjs'];</span>
945
+ function extractPortsFromNextConfig(projectPath: string): PortInfo[] {
946
+ const ports: PortInfo[] = [];
947
+ const configFiles = ['next.config.js', 'next.config.ts', 'next.config.mjs'];
948
948
  &nbsp;
949
- <span class="cstat-no" title="statement not covered" > for (const configFile of configFiles) {</span>
950
- const configPath = <span class="cstat-no" title="statement not covered" >path.join(projectPath, configFile);</span>
951
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!fs.existsSync(configPath)) <span class="cstat-no" title="statement not covered" >continue;</span></span>
949
+ for (const configFile of configFiles) {
950
+ const configPath = path.join(projectPath, configFile);
951
+ if (!fs.existsSync(configPath)) continue;
952
952
  &nbsp;
953
- <span class="cstat-no" title="statement not covered" > try {</span>
954
- const content = <span class="cstat-no" title="statement not covered" >fs.readFileSync(configPath, 'utf-8');</span>
953
+ try {
954
+ const content = fs.readFileSync(configPath, 'utf-8');
955
955
 
956
956
  // Next.js doesn't typically configure port in config, but check for devServer
957
- const patterns = <span class="cstat-no" title="statement not covered" >[</span>
957
+ const patterns = [
958
958
  /devServer\s*:\s*\{[^}]*port\s*:\s*(\d+)/i,
959
959
  /port\s*:\s*(\d+)/i,
960
960
  ];
961
961
  &nbsp;
962
- <span class="cstat-no" title="statement not covered" > for (const pattern of patterns) {</span>
963
- const match = <span class="cstat-no" title="statement not covered" >content.match(pattern);</span>
964
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (match &amp;&amp; match[1]) {</span>
965
- const port = <span class="cstat-no" title="statement not covered" >parseInt(match[1], 10);</span>
966
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isNaN(port) &amp;&amp; port &gt; 0 &amp;&amp; port &lt;= 65535) {</span>
967
- <span class="cstat-no" title="statement not covered" > ports.push({</span>
962
+ for (const pattern of patterns) {
963
+ const match = content.match(pattern);
964
+ if (match &amp;&amp; match[1]) {
965
+ const port = parseInt(match[1], 10);
966
+ if (!isNaN(port) &amp;&amp; port &gt; 0 &amp;&amp; port &lt;= 65535) {
967
+ ports.push({
968
968
  port,
969
969
  script: null,
970
970
  source: configFile,
971
971
  });
972
- <span class="cstat-no" title="statement not covered" > break;</span>
972
+ break;
973
973
  }
974
974
  }
975
975
  }
@@ -978,40 +978,40 @@ function <span class="fstat-no" title="function not covered" >extractPortsFromNe
978
978
  }
979
979
  }
980
980
  &nbsp;
981
- <span class="cstat-no" title="statement not covered" > return ports;</span>
981
+ return ports;
982
982
  }
983
983
  &nbsp;
984
984
  /**
985
985
  * Extract ports from webpack.config.js
986
986
  */
987
- function <span class="fstat-no" title="function not covered" >extractPortsFromWebpackConfig(</span>projectPath: string): PortInfo[] {
988
- const ports: PortInfo[] = <span class="cstat-no" title="statement not covered" >[];</span>
989
- const configFiles = <span class="cstat-no" title="statement not covered" >['webpack.config.js', 'webpack.config.ts'];</span>
987
+ function extractPortsFromWebpackConfig(projectPath: string): PortInfo[] {
988
+ const ports: PortInfo[] = [];
989
+ const configFiles = ['webpack.config.js', 'webpack.config.ts'];
990
990
  &nbsp;
991
- <span class="cstat-no" title="statement not covered" > for (const configFile of configFiles) {</span>
992
- const configPath = <span class="cstat-no" title="statement not covered" >path.join(projectPath, configFile);</span>
993
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!fs.existsSync(configPath)) <span class="cstat-no" title="statement not covered" >continue;</span></span>
991
+ for (const configFile of configFiles) {
992
+ const configPath = path.join(projectPath, configFile);
993
+ if (!fs.existsSync(configPath)) continue;
994
994
  &nbsp;
995
- <span class="cstat-no" title="statement not covered" > try {</span>
996
- const content = <span class="cstat-no" title="statement not covered" >fs.readFileSync(configPath, 'utf-8');</span>
995
+ try {
996
+ const content = fs.readFileSync(configPath, 'utf-8');
997
997
 
998
998
  // Look for devServer.port
999
- const patterns = <span class="cstat-no" title="statement not covered" >[</span>
999
+ const patterns = [
1000
1000
  /devServer\s*:\s*\{[^}]*port\s*:\s*(\d+)/i,
1001
1001
  /devServer\s*:\s*\{[^}]*port\s*:\s*['"](\d+)['"]/i,
1002
1002
  ];
1003
1003
  &nbsp;
1004
- <span class="cstat-no" title="statement not covered" > for (const pattern of patterns) {</span>
1005
- const match = <span class="cstat-no" title="statement not covered" >content.match(pattern);</span>
1006
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (match &amp;&amp; match[1]) {</span>
1007
- const port = <span class="cstat-no" title="statement not covered" >parseInt(match[1], 10);</span>
1008
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isNaN(port) &amp;&amp; port &gt; 0 &amp;&amp; port &lt;= 65535) {</span>
1009
- <span class="cstat-no" title="statement not covered" > ports.push({</span>
1004
+ for (const pattern of patterns) {
1005
+ const match = content.match(pattern);
1006
+ if (match &amp;&amp; match[1]) {
1007
+ const port = parseInt(match[1], 10);
1008
+ if (!isNaN(port) &amp;&amp; port &gt; 0 &amp;&amp; port &lt;= 65535) {
1009
+ ports.push({
1010
1010
  port,
1011
1011
  script: null,
1012
1012
  source: configFile,
1013
1013
  });
1014
- <span class="cstat-no" title="statement not covered" > break;</span>
1014
+ break;
1015
1015
  }
1016
1016
  }
1017
1017
  }
@@ -1020,32 +1020,32 @@ function <span class="fstat-no" title="function not covered" >extractPortsFromWe
1020
1020
  }
1021
1021
  }
1022
1022
  &nbsp;
1023
- <span class="cstat-no" title="statement not covered" > return ports;</span>
1023
+ return ports;
1024
1024
  }
1025
1025
  &nbsp;
1026
1026
  /**
1027
1027
  * Extract ports from angular.json
1028
1028
  */
1029
- function <span class="fstat-no" title="function not covered" >extractPortsFromAngularConfig(</span>projectPath: string): PortInfo[] {
1030
- const ports: PortInfo[] = <span class="cstat-no" title="statement not covered" >[];</span>
1031
- const configPath = <span class="cstat-no" title="statement not covered" >path.join(projectPath, 'angular.json');</span>
1029
+ function extractPortsFromAngularConfig(projectPath: string): PortInfo[] {
1030
+ const ports: PortInfo[] = [];
1031
+ const configPath = path.join(projectPath, 'angular.json');
1032
1032
  &nbsp;
1033
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!fs.existsSync(configPath)) {</span>
1034
- <span class="cstat-no" title="statement not covered" > return ports;</span>
1033
+ if (!fs.existsSync(configPath)) {
1034
+ return ports;
1035
1035
  }
1036
1036
  &nbsp;
1037
- <span class="cstat-no" title="statement not covered" > try {</span>
1038
- const angularJson = <span class="cstat-no" title="statement not covered" >JSON.parse(fs.readFileSync(configPath, 'utf-8'));</span>
1037
+ try {
1038
+ const angularJson = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
1039
1039
 
1040
1040
  // Navigate through projects -&gt; architect -&gt; serve -&gt; options -&gt; port
1041
- const projects = <span class="cstat-no" title="statement not covered" >angularJson.projects || {};</span>
1042
- <span class="cstat-no" title="statement not covered" > for (const projectName of Object.keys(projects)) {</span>
1043
- const project = <span class="cstat-no" title="statement not covered" >projects[projectName];</span>
1044
- const serve = <span class="cstat-no" title="statement not covered" >project?.architect?.serve;</span>
1045
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (serve?.options?.port) {</span>
1046
- const port = <span class="cstat-no" title="statement not covered" >parseInt(serve.options.port, 10);</span>
1047
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isNaN(port) &amp;&amp; port &gt; 0 &amp;&amp; port &lt;= 65535) {</span>
1048
- <span class="cstat-no" title="statement not covered" > ports.push({</span>
1041
+ const projects = angularJson.projects || <span class="branch-1 cbranch-no" title="branch not covered" >{};</span>
1042
+ for (const projectName of Object.keys(projects)) {
1043
+ const project = projects[projectName];
1044
+ const serve = project?.architect?.serve;
1045
+ if (serve?.options?.port) {
1046
+ const port = parseInt(serve.options.port, 10);
1047
+ if (!isNaN(port) &amp;&amp; port &gt; 0 &amp;&amp; port &lt;= 65535) {
1048
+ ports.push({
1049
1049
  port,
1050
1050
  script: null,
1051
1051
  source: 'angular.json',
@@ -1057,40 +1057,40 @@ function <span class="fstat-no" title="function not covered" >extractPortsFromAn
1057
1057
  // Ignore parsing errors
1058
1058
  }
1059
1059
  &nbsp;
1060
- <span class="cstat-no" title="statement not covered" > return ports;</span>
1060
+ return ports;
1061
1061
  }
1062
1062
  &nbsp;
1063
1063
  /**
1064
1064
  * Extract ports from nuxt.config.js/ts
1065
1065
  */
1066
- function <span class="fstat-no" title="function not covered" >extractPortsFromNuxtConfig(</span>projectPath: string): PortInfo[] {
1067
- const ports: PortInfo[] = <span class="cstat-no" title="statement not covered" >[];</span>
1068
- const configFiles = <span class="cstat-no" title="statement not covered" >['nuxt.config.js', 'nuxt.config.ts'];</span>
1066
+ function extractPortsFromNuxtConfig(projectPath: string): PortInfo[] {
1067
+ const ports: PortInfo[] = [];
1068
+ const configFiles = ['nuxt.config.js', 'nuxt.config.ts'];
1069
1069
  &nbsp;
1070
- <span class="cstat-no" title="statement not covered" > for (const configFile of configFiles) {</span>
1071
- const configPath = <span class="cstat-no" title="statement not covered" >path.join(projectPath, configFile);</span>
1072
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!fs.existsSync(configPath)) <span class="cstat-no" title="statement not covered" >continue;</span></span>
1070
+ for (const configFile of configFiles) {
1071
+ const configPath = path.join(projectPath, configFile);
1072
+ if (!fs.existsSync(configPath)) continue;
1073
1073
  &nbsp;
1074
- <span class="cstat-no" title="statement not covered" > try {</span>
1075
- const content = <span class="cstat-no" title="statement not covered" >fs.readFileSync(configPath, 'utf-8');</span>
1074
+ try {
1075
+ const content = fs.readFileSync(configPath, 'utf-8');
1076
1076
 
1077
1077
  // Look for server.port
1078
- const patterns = <span class="cstat-no" title="statement not covered" >[</span>
1078
+ const patterns = [
1079
1079
  /server\s*:\s*\{[^}]*port\s*:\s*(\d+)/i,
1080
1080
  /server\s*:\s*\{[^}]*port\s*:\s*['"](\d+)['"]/i,
1081
1081
  ];
1082
1082
  &nbsp;
1083
- <span class="cstat-no" title="statement not covered" > for (const pattern of patterns) {</span>
1084
- const match = <span class="cstat-no" title="statement not covered" >content.match(pattern);</span>
1085
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (match &amp;&amp; match[1]) {</span>
1086
- const port = <span class="cstat-no" title="statement not covered" >parseInt(match[1], 10);</span>
1087
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isNaN(port) &amp;&amp; port &gt; 0 &amp;&amp; port &lt;= 65535) {</span>
1088
- <span class="cstat-no" title="statement not covered" > ports.push({</span>
1083
+ for (const pattern of patterns) {
1084
+ const match = content.match(pattern);
1085
+ if (match &amp;&amp; match[1]) {
1086
+ const port = parseInt(match[1], 10);
1087
+ if (!isNaN(port) &amp;&amp; port &gt; 0 &amp;&amp; port &lt;= 65535) {
1088
+ ports.push({
1089
1089
  port,
1090
1090
  script: null,
1091
1091
  source: configFile,
1092
1092
  });
1093
- <span class="cstat-no" title="statement not covered" > break;</span>
1093
+ break;
1094
1094
  }
1095
1095
  }
1096
1096
  }
@@ -1099,47 +1099,47 @@ function <span class="fstat-no" title="function not covered" >extractPortsFromNu
1099
1099
  }
1100
1100
  }
1101
1101
  &nbsp;
1102
- <span class="cstat-no" title="statement not covered" > return ports;</span>
1102
+ return ports;
1103
1103
  }
1104
1104
  &nbsp;
1105
1105
  /**
1106
1106
  * Extract ports from .env files
1107
1107
  */
1108
- function <span class="fstat-no" title="function not covered" >extractPortsFromEnvFiles(</span>projectPath: string): PortInfo[] {
1109
- const ports: PortInfo[] = <span class="cstat-no" title="statement not covered" >[];</span>
1110
- const envFiles = <span class="cstat-no" title="statement not covered" >['.env', '.env.local', '.env.development', '.env.production'];</span>
1108
+ function extractPortsFromEnvFiles(projectPath: string): PortInfo[] {
1109
+ const ports: PortInfo[] = [];
1110
+ const envFiles = ['.env', '.env.local', '.env.development', '.env.production'];
1111
1111
  &nbsp;
1112
- <span class="cstat-no" title="statement not covered" > for (const envFile of envFiles) {</span>
1113
- const envPath = <span class="cstat-no" title="statement not covered" >path.join(projectPath, envFile);</span>
1114
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!fs.existsSync(envPath)) <span class="cstat-no" title="statement not covered" >continue;</span></span>
1112
+ for (const envFile of envFiles) {
1113
+ const envPath = path.join(projectPath, envFile);
1114
+ if (!fs.existsSync(envPath)) continue;
1115
1115
  &nbsp;
1116
- <span class="cstat-no" title="statement not covered" > try {</span>
1117
- const content = <span class="cstat-no" title="statement not covered" >fs.readFileSync(envPath, 'utf-8');</span>
1118
- const lines = <span class="cstat-no" title="statement not covered" >content.split('\n');</span>
1116
+ try {
1117
+ const content = fs.readFileSync(envPath, 'utf-8');
1118
+ const lines = content.split('\n');
1119
1119
  &nbsp;
1120
- <span class="cstat-no" title="statement not covered" > for (const line of lines) {</span>
1120
+ for (const line of lines) {
1121
1121
  // Skip comments
1122
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (line.trim().startsWith('#')) <span class="cstat-no" title="statement not covered" >continue;</span></span>
1122
+ if (line.trim().startsWith('#')) continue;
1123
1123
  &nbsp;
1124
1124
  // Look for PORT=, VITE_PORT=, NEXT_PORT=, etc.
1125
- const patterns = <span class="cstat-no" title="statement not covered" >[</span>
1125
+ const patterns = [
1126
1126
  /^PORT\s*=\s*(\d+)/i,
1127
1127
  /^VITE_PORT\s*=\s*(\d+)/i,
1128
1128
  /^NEXT_PORT\s*=\s*(\d+)/i,
1129
1129
  /^REACT_APP_PORT\s*=\s*(\d+)/i,
1130
1130
  ];
1131
1131
  &nbsp;
1132
- <span class="cstat-no" title="statement not covered" > for (const pattern of patterns) {</span>
1133
- const match = <span class="cstat-no" title="statement not covered" >line.match(pattern);</span>
1134
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (match &amp;&amp; match[1]) {</span>
1135
- const port = <span class="cstat-no" title="statement not covered" >parseInt(match[1], 10);</span>
1136
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!isNaN(port) &amp;&amp; port &gt; 0 &amp;&amp; port &lt;= 65535) {</span>
1137
- <span class="cstat-no" title="statement not covered" > ports.push({</span>
1132
+ for (const pattern of patterns) {
1133
+ const match = line.match(pattern);
1134
+ if (match &amp;&amp; match[1]) {
1135
+ const port = parseInt(match[1], 10);
1136
+ if (!isNaN(port) &amp;&amp; port &gt; 0 &amp;&amp; port &lt;= 65535) {
1137
+ ports.push({
1138
1138
  port,
1139
1139
  script: null,
1140
1140
  source: envFile,
1141
1141
  });
1142
- <span class="cstat-no" title="statement not covered" > break;</span>
1142
+ break;
1143
1143
  }
1144
1144
  }
1145
1145
  }
@@ -1149,7 +1149,7 @@ function <span class="fstat-no" title="function not covered" >extractPortsFromEn
1149
1149
  }
1150
1150
  }
1151
1151
  &nbsp;
1152
- <span class="cstat-no" title="statement not covered" > return ports;</span>
1152
+ return ports;
1153
1153
  }
1154
1154
  &nbsp;
1155
1155
  &nbsp;</pre></td></tr></table></pre>
@@ -1159,7 +1159,7 @@ function <span class="fstat-no" title="function not covered" >extractPortsFromEn
1159
1159
  <div class='footer quiet pad2 space-top1 center small'>
1160
1160
  Code coverage generated by
1161
1161
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1162
- at 2026-01-08T01:22:23.516Z
1162
+ at 2026-01-08T07:29:04.471Z
1163
1163
  </div>
1164
1164
  <script src="prettify.js"></script>
1165
1165
  <script>