@contractkit/plugin-typescript 0.17.5 → 0.19.0
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/.turbo/turbo-build$colon$ci.log +7 -7
- package/.turbo/turbo-test$colon$ci.log +15 -15
- package/CHANGELOG.md +21 -0
- package/README.md +10 -1
- package/coverage/clover.xml +795 -573
- package/coverage/coverage-final.json +6 -6
- package/coverage/index.html +19 -19
- package/coverage/src/codegen-contract.ts.html +3 -3
- package/coverage/src/codegen-operation.ts.html +1 -1
- package/coverage/src/codegen-plain-types.ts.html +1 -1
- package/coverage/src/codegen-sdk.ts.html +989 -236
- package/coverage/src/index.html +39 -39
- package/coverage/src/index.ts.html +1386 -306
- package/coverage/src/path-utils.ts.html +51 -51
- package/coverage/src/ts-render.ts.html +4 -4
- package/coverage/tests/helpers.ts.html +15 -15
- package/coverage/tests/index.html +1 -1
- package/dist/codegen-sdk.d.ts +96 -2
- package/dist/codegen-sdk.d.ts.map +1 -1
- package/dist/index.d.ts +8 -36
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +685 -137
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/codegen-sdk.ts +258 -7
- package/src/index.ts +556 -196
- package/tests/codegen-sdk.test.ts +188 -16
- package/tests/codegen-server.test.ts +101 -1
|
@@ -23,30 +23,30 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">58.17% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>185/318</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">47.22% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>68/144</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">
|
|
40
|
+
<span class="strong">63.04% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>29/46</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">62.78% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>167/266</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
|
|
64
|
+
<div class='status-line medium'></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>
|
|
@@ -488,7 +488,367 @@
|
|
|
488
488
|
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
489
|
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
490
|
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
-
<a name='L426'></a><a href='#L426'>426</a
|
|
491
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
+
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
+
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
+
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
+
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
+
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
+
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
+
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
+
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
+
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
+
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
+
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
+
<a name='L438'></a><a href='#L438'>438</a>
|
|
504
|
+
<a name='L439'></a><a href='#L439'>439</a>
|
|
505
|
+
<a name='L440'></a><a href='#L440'>440</a>
|
|
506
|
+
<a name='L441'></a><a href='#L441'>441</a>
|
|
507
|
+
<a name='L442'></a><a href='#L442'>442</a>
|
|
508
|
+
<a name='L443'></a><a href='#L443'>443</a>
|
|
509
|
+
<a name='L444'></a><a href='#L444'>444</a>
|
|
510
|
+
<a name='L445'></a><a href='#L445'>445</a>
|
|
511
|
+
<a name='L446'></a><a href='#L446'>446</a>
|
|
512
|
+
<a name='L447'></a><a href='#L447'>447</a>
|
|
513
|
+
<a name='L448'></a><a href='#L448'>448</a>
|
|
514
|
+
<a name='L449'></a><a href='#L449'>449</a>
|
|
515
|
+
<a name='L450'></a><a href='#L450'>450</a>
|
|
516
|
+
<a name='L451'></a><a href='#L451'>451</a>
|
|
517
|
+
<a name='L452'></a><a href='#L452'>452</a>
|
|
518
|
+
<a name='L453'></a><a href='#L453'>453</a>
|
|
519
|
+
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
|
+
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
|
+
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
+
<a name='L457'></a><a href='#L457'>457</a>
|
|
523
|
+
<a name='L458'></a><a href='#L458'>458</a>
|
|
524
|
+
<a name='L459'></a><a href='#L459'>459</a>
|
|
525
|
+
<a name='L460'></a><a href='#L460'>460</a>
|
|
526
|
+
<a name='L461'></a><a href='#L461'>461</a>
|
|
527
|
+
<a name='L462'></a><a href='#L462'>462</a>
|
|
528
|
+
<a name='L463'></a><a href='#L463'>463</a>
|
|
529
|
+
<a name='L464'></a><a href='#L464'>464</a>
|
|
530
|
+
<a name='L465'></a><a href='#L465'>465</a>
|
|
531
|
+
<a name='L466'></a><a href='#L466'>466</a>
|
|
532
|
+
<a name='L467'></a><a href='#L467'>467</a>
|
|
533
|
+
<a name='L468'></a><a href='#L468'>468</a>
|
|
534
|
+
<a name='L469'></a><a href='#L469'>469</a>
|
|
535
|
+
<a name='L470'></a><a href='#L470'>470</a>
|
|
536
|
+
<a name='L471'></a><a href='#L471'>471</a>
|
|
537
|
+
<a name='L472'></a><a href='#L472'>472</a>
|
|
538
|
+
<a name='L473'></a><a href='#L473'>473</a>
|
|
539
|
+
<a name='L474'></a><a href='#L474'>474</a>
|
|
540
|
+
<a name='L475'></a><a href='#L475'>475</a>
|
|
541
|
+
<a name='L476'></a><a href='#L476'>476</a>
|
|
542
|
+
<a name='L477'></a><a href='#L477'>477</a>
|
|
543
|
+
<a name='L478'></a><a href='#L478'>478</a>
|
|
544
|
+
<a name='L479'></a><a href='#L479'>479</a>
|
|
545
|
+
<a name='L480'></a><a href='#L480'>480</a>
|
|
546
|
+
<a name='L481'></a><a href='#L481'>481</a>
|
|
547
|
+
<a name='L482'></a><a href='#L482'>482</a>
|
|
548
|
+
<a name='L483'></a><a href='#L483'>483</a>
|
|
549
|
+
<a name='L484'></a><a href='#L484'>484</a>
|
|
550
|
+
<a name='L485'></a><a href='#L485'>485</a>
|
|
551
|
+
<a name='L486'></a><a href='#L486'>486</a>
|
|
552
|
+
<a name='L487'></a><a href='#L487'>487</a>
|
|
553
|
+
<a name='L488'></a><a href='#L488'>488</a>
|
|
554
|
+
<a name='L489'></a><a href='#L489'>489</a>
|
|
555
|
+
<a name='L490'></a><a href='#L490'>490</a>
|
|
556
|
+
<a name='L491'></a><a href='#L491'>491</a>
|
|
557
|
+
<a name='L492'></a><a href='#L492'>492</a>
|
|
558
|
+
<a name='L493'></a><a href='#L493'>493</a>
|
|
559
|
+
<a name='L494'></a><a href='#L494'>494</a>
|
|
560
|
+
<a name='L495'></a><a href='#L495'>495</a>
|
|
561
|
+
<a name='L496'></a><a href='#L496'>496</a>
|
|
562
|
+
<a name='L497'></a><a href='#L497'>497</a>
|
|
563
|
+
<a name='L498'></a><a href='#L498'>498</a>
|
|
564
|
+
<a name='L499'></a><a href='#L499'>499</a>
|
|
565
|
+
<a name='L500'></a><a href='#L500'>500</a>
|
|
566
|
+
<a name='L501'></a><a href='#L501'>501</a>
|
|
567
|
+
<a name='L502'></a><a href='#L502'>502</a>
|
|
568
|
+
<a name='L503'></a><a href='#L503'>503</a>
|
|
569
|
+
<a name='L504'></a><a href='#L504'>504</a>
|
|
570
|
+
<a name='L505'></a><a href='#L505'>505</a>
|
|
571
|
+
<a name='L506'></a><a href='#L506'>506</a>
|
|
572
|
+
<a name='L507'></a><a href='#L507'>507</a>
|
|
573
|
+
<a name='L508'></a><a href='#L508'>508</a>
|
|
574
|
+
<a name='L509'></a><a href='#L509'>509</a>
|
|
575
|
+
<a name='L510'></a><a href='#L510'>510</a>
|
|
576
|
+
<a name='L511'></a><a href='#L511'>511</a>
|
|
577
|
+
<a name='L512'></a><a href='#L512'>512</a>
|
|
578
|
+
<a name='L513'></a><a href='#L513'>513</a>
|
|
579
|
+
<a name='L514'></a><a href='#L514'>514</a>
|
|
580
|
+
<a name='L515'></a><a href='#L515'>515</a>
|
|
581
|
+
<a name='L516'></a><a href='#L516'>516</a>
|
|
582
|
+
<a name='L517'></a><a href='#L517'>517</a>
|
|
583
|
+
<a name='L518'></a><a href='#L518'>518</a>
|
|
584
|
+
<a name='L519'></a><a href='#L519'>519</a>
|
|
585
|
+
<a name='L520'></a><a href='#L520'>520</a>
|
|
586
|
+
<a name='L521'></a><a href='#L521'>521</a>
|
|
587
|
+
<a name='L522'></a><a href='#L522'>522</a>
|
|
588
|
+
<a name='L523'></a><a href='#L523'>523</a>
|
|
589
|
+
<a name='L524'></a><a href='#L524'>524</a>
|
|
590
|
+
<a name='L525'></a><a href='#L525'>525</a>
|
|
591
|
+
<a name='L526'></a><a href='#L526'>526</a>
|
|
592
|
+
<a name='L527'></a><a href='#L527'>527</a>
|
|
593
|
+
<a name='L528'></a><a href='#L528'>528</a>
|
|
594
|
+
<a name='L529'></a><a href='#L529'>529</a>
|
|
595
|
+
<a name='L530'></a><a href='#L530'>530</a>
|
|
596
|
+
<a name='L531'></a><a href='#L531'>531</a>
|
|
597
|
+
<a name='L532'></a><a href='#L532'>532</a>
|
|
598
|
+
<a name='L533'></a><a href='#L533'>533</a>
|
|
599
|
+
<a name='L534'></a><a href='#L534'>534</a>
|
|
600
|
+
<a name='L535'></a><a href='#L535'>535</a>
|
|
601
|
+
<a name='L536'></a><a href='#L536'>536</a>
|
|
602
|
+
<a name='L537'></a><a href='#L537'>537</a>
|
|
603
|
+
<a name='L538'></a><a href='#L538'>538</a>
|
|
604
|
+
<a name='L539'></a><a href='#L539'>539</a>
|
|
605
|
+
<a name='L540'></a><a href='#L540'>540</a>
|
|
606
|
+
<a name='L541'></a><a href='#L541'>541</a>
|
|
607
|
+
<a name='L542'></a><a href='#L542'>542</a>
|
|
608
|
+
<a name='L543'></a><a href='#L543'>543</a>
|
|
609
|
+
<a name='L544'></a><a href='#L544'>544</a>
|
|
610
|
+
<a name='L545'></a><a href='#L545'>545</a>
|
|
611
|
+
<a name='L546'></a><a href='#L546'>546</a>
|
|
612
|
+
<a name='L547'></a><a href='#L547'>547</a>
|
|
613
|
+
<a name='L548'></a><a href='#L548'>548</a>
|
|
614
|
+
<a name='L549'></a><a href='#L549'>549</a>
|
|
615
|
+
<a name='L550'></a><a href='#L550'>550</a>
|
|
616
|
+
<a name='L551'></a><a href='#L551'>551</a>
|
|
617
|
+
<a name='L552'></a><a href='#L552'>552</a>
|
|
618
|
+
<a name='L553'></a><a href='#L553'>553</a>
|
|
619
|
+
<a name='L554'></a><a href='#L554'>554</a>
|
|
620
|
+
<a name='L555'></a><a href='#L555'>555</a>
|
|
621
|
+
<a name='L556'></a><a href='#L556'>556</a>
|
|
622
|
+
<a name='L557'></a><a href='#L557'>557</a>
|
|
623
|
+
<a name='L558'></a><a href='#L558'>558</a>
|
|
624
|
+
<a name='L559'></a><a href='#L559'>559</a>
|
|
625
|
+
<a name='L560'></a><a href='#L560'>560</a>
|
|
626
|
+
<a name='L561'></a><a href='#L561'>561</a>
|
|
627
|
+
<a name='L562'></a><a href='#L562'>562</a>
|
|
628
|
+
<a name='L563'></a><a href='#L563'>563</a>
|
|
629
|
+
<a name='L564'></a><a href='#L564'>564</a>
|
|
630
|
+
<a name='L565'></a><a href='#L565'>565</a>
|
|
631
|
+
<a name='L566'></a><a href='#L566'>566</a>
|
|
632
|
+
<a name='L567'></a><a href='#L567'>567</a>
|
|
633
|
+
<a name='L568'></a><a href='#L568'>568</a>
|
|
634
|
+
<a name='L569'></a><a href='#L569'>569</a>
|
|
635
|
+
<a name='L570'></a><a href='#L570'>570</a>
|
|
636
|
+
<a name='L571'></a><a href='#L571'>571</a>
|
|
637
|
+
<a name='L572'></a><a href='#L572'>572</a>
|
|
638
|
+
<a name='L573'></a><a href='#L573'>573</a>
|
|
639
|
+
<a name='L574'></a><a href='#L574'>574</a>
|
|
640
|
+
<a name='L575'></a><a href='#L575'>575</a>
|
|
641
|
+
<a name='L576'></a><a href='#L576'>576</a>
|
|
642
|
+
<a name='L577'></a><a href='#L577'>577</a>
|
|
643
|
+
<a name='L578'></a><a href='#L578'>578</a>
|
|
644
|
+
<a name='L579'></a><a href='#L579'>579</a>
|
|
645
|
+
<a name='L580'></a><a href='#L580'>580</a>
|
|
646
|
+
<a name='L581'></a><a href='#L581'>581</a>
|
|
647
|
+
<a name='L582'></a><a href='#L582'>582</a>
|
|
648
|
+
<a name='L583'></a><a href='#L583'>583</a>
|
|
649
|
+
<a name='L584'></a><a href='#L584'>584</a>
|
|
650
|
+
<a name='L585'></a><a href='#L585'>585</a>
|
|
651
|
+
<a name='L586'></a><a href='#L586'>586</a>
|
|
652
|
+
<a name='L587'></a><a href='#L587'>587</a>
|
|
653
|
+
<a name='L588'></a><a href='#L588'>588</a>
|
|
654
|
+
<a name='L589'></a><a href='#L589'>589</a>
|
|
655
|
+
<a name='L590'></a><a href='#L590'>590</a>
|
|
656
|
+
<a name='L591'></a><a href='#L591'>591</a>
|
|
657
|
+
<a name='L592'></a><a href='#L592'>592</a>
|
|
658
|
+
<a name='L593'></a><a href='#L593'>593</a>
|
|
659
|
+
<a name='L594'></a><a href='#L594'>594</a>
|
|
660
|
+
<a name='L595'></a><a href='#L595'>595</a>
|
|
661
|
+
<a name='L596'></a><a href='#L596'>596</a>
|
|
662
|
+
<a name='L597'></a><a href='#L597'>597</a>
|
|
663
|
+
<a name='L598'></a><a href='#L598'>598</a>
|
|
664
|
+
<a name='L599'></a><a href='#L599'>599</a>
|
|
665
|
+
<a name='L600'></a><a href='#L600'>600</a>
|
|
666
|
+
<a name='L601'></a><a href='#L601'>601</a>
|
|
667
|
+
<a name='L602'></a><a href='#L602'>602</a>
|
|
668
|
+
<a name='L603'></a><a href='#L603'>603</a>
|
|
669
|
+
<a name='L604'></a><a href='#L604'>604</a>
|
|
670
|
+
<a name='L605'></a><a href='#L605'>605</a>
|
|
671
|
+
<a name='L606'></a><a href='#L606'>606</a>
|
|
672
|
+
<a name='L607'></a><a href='#L607'>607</a>
|
|
673
|
+
<a name='L608'></a><a href='#L608'>608</a>
|
|
674
|
+
<a name='L609'></a><a href='#L609'>609</a>
|
|
675
|
+
<a name='L610'></a><a href='#L610'>610</a>
|
|
676
|
+
<a name='L611'></a><a href='#L611'>611</a>
|
|
677
|
+
<a name='L612'></a><a href='#L612'>612</a>
|
|
678
|
+
<a name='L613'></a><a href='#L613'>613</a>
|
|
679
|
+
<a name='L614'></a><a href='#L614'>614</a>
|
|
680
|
+
<a name='L615'></a><a href='#L615'>615</a>
|
|
681
|
+
<a name='L616'></a><a href='#L616'>616</a>
|
|
682
|
+
<a name='L617'></a><a href='#L617'>617</a>
|
|
683
|
+
<a name='L618'></a><a href='#L618'>618</a>
|
|
684
|
+
<a name='L619'></a><a href='#L619'>619</a>
|
|
685
|
+
<a name='L620'></a><a href='#L620'>620</a>
|
|
686
|
+
<a name='L621'></a><a href='#L621'>621</a>
|
|
687
|
+
<a name='L622'></a><a href='#L622'>622</a>
|
|
688
|
+
<a name='L623'></a><a href='#L623'>623</a>
|
|
689
|
+
<a name='L624'></a><a href='#L624'>624</a>
|
|
690
|
+
<a name='L625'></a><a href='#L625'>625</a>
|
|
691
|
+
<a name='L626'></a><a href='#L626'>626</a>
|
|
692
|
+
<a name='L627'></a><a href='#L627'>627</a>
|
|
693
|
+
<a name='L628'></a><a href='#L628'>628</a>
|
|
694
|
+
<a name='L629'></a><a href='#L629'>629</a>
|
|
695
|
+
<a name='L630'></a><a href='#L630'>630</a>
|
|
696
|
+
<a name='L631'></a><a href='#L631'>631</a>
|
|
697
|
+
<a name='L632'></a><a href='#L632'>632</a>
|
|
698
|
+
<a name='L633'></a><a href='#L633'>633</a>
|
|
699
|
+
<a name='L634'></a><a href='#L634'>634</a>
|
|
700
|
+
<a name='L635'></a><a href='#L635'>635</a>
|
|
701
|
+
<a name='L636'></a><a href='#L636'>636</a>
|
|
702
|
+
<a name='L637'></a><a href='#L637'>637</a>
|
|
703
|
+
<a name='L638'></a><a href='#L638'>638</a>
|
|
704
|
+
<a name='L639'></a><a href='#L639'>639</a>
|
|
705
|
+
<a name='L640'></a><a href='#L640'>640</a>
|
|
706
|
+
<a name='L641'></a><a href='#L641'>641</a>
|
|
707
|
+
<a name='L642'></a><a href='#L642'>642</a>
|
|
708
|
+
<a name='L643'></a><a href='#L643'>643</a>
|
|
709
|
+
<a name='L644'></a><a href='#L644'>644</a>
|
|
710
|
+
<a name='L645'></a><a href='#L645'>645</a>
|
|
711
|
+
<a name='L646'></a><a href='#L646'>646</a>
|
|
712
|
+
<a name='L647'></a><a href='#L647'>647</a>
|
|
713
|
+
<a name='L648'></a><a href='#L648'>648</a>
|
|
714
|
+
<a name='L649'></a><a href='#L649'>649</a>
|
|
715
|
+
<a name='L650'></a><a href='#L650'>650</a>
|
|
716
|
+
<a name='L651'></a><a href='#L651'>651</a>
|
|
717
|
+
<a name='L652'></a><a href='#L652'>652</a>
|
|
718
|
+
<a name='L653'></a><a href='#L653'>653</a>
|
|
719
|
+
<a name='L654'></a><a href='#L654'>654</a>
|
|
720
|
+
<a name='L655'></a><a href='#L655'>655</a>
|
|
721
|
+
<a name='L656'></a><a href='#L656'>656</a>
|
|
722
|
+
<a name='L657'></a><a href='#L657'>657</a>
|
|
723
|
+
<a name='L658'></a><a href='#L658'>658</a>
|
|
724
|
+
<a name='L659'></a><a href='#L659'>659</a>
|
|
725
|
+
<a name='L660'></a><a href='#L660'>660</a>
|
|
726
|
+
<a name='L661'></a><a href='#L661'>661</a>
|
|
727
|
+
<a name='L662'></a><a href='#L662'>662</a>
|
|
728
|
+
<a name='L663'></a><a href='#L663'>663</a>
|
|
729
|
+
<a name='L664'></a><a href='#L664'>664</a>
|
|
730
|
+
<a name='L665'></a><a href='#L665'>665</a>
|
|
731
|
+
<a name='L666'></a><a href='#L666'>666</a>
|
|
732
|
+
<a name='L667'></a><a href='#L667'>667</a>
|
|
733
|
+
<a name='L668'></a><a href='#L668'>668</a>
|
|
734
|
+
<a name='L669'></a><a href='#L669'>669</a>
|
|
735
|
+
<a name='L670'></a><a href='#L670'>670</a>
|
|
736
|
+
<a name='L671'></a><a href='#L671'>671</a>
|
|
737
|
+
<a name='L672'></a><a href='#L672'>672</a>
|
|
738
|
+
<a name='L673'></a><a href='#L673'>673</a>
|
|
739
|
+
<a name='L674'></a><a href='#L674'>674</a>
|
|
740
|
+
<a name='L675'></a><a href='#L675'>675</a>
|
|
741
|
+
<a name='L676'></a><a href='#L676'>676</a>
|
|
742
|
+
<a name='L677'></a><a href='#L677'>677</a>
|
|
743
|
+
<a name='L678'></a><a href='#L678'>678</a>
|
|
744
|
+
<a name='L679'></a><a href='#L679'>679</a>
|
|
745
|
+
<a name='L680'></a><a href='#L680'>680</a>
|
|
746
|
+
<a name='L681'></a><a href='#L681'>681</a>
|
|
747
|
+
<a name='L682'></a><a href='#L682'>682</a>
|
|
748
|
+
<a name='L683'></a><a href='#L683'>683</a>
|
|
749
|
+
<a name='L684'></a><a href='#L684'>684</a>
|
|
750
|
+
<a name='L685'></a><a href='#L685'>685</a>
|
|
751
|
+
<a name='L686'></a><a href='#L686'>686</a>
|
|
752
|
+
<a name='L687'></a><a href='#L687'>687</a>
|
|
753
|
+
<a name='L688'></a><a href='#L688'>688</a>
|
|
754
|
+
<a name='L689'></a><a href='#L689'>689</a>
|
|
755
|
+
<a name='L690'></a><a href='#L690'>690</a>
|
|
756
|
+
<a name='L691'></a><a href='#L691'>691</a>
|
|
757
|
+
<a name='L692'></a><a href='#L692'>692</a>
|
|
758
|
+
<a name='L693'></a><a href='#L693'>693</a>
|
|
759
|
+
<a name='L694'></a><a href='#L694'>694</a>
|
|
760
|
+
<a name='L695'></a><a href='#L695'>695</a>
|
|
761
|
+
<a name='L696'></a><a href='#L696'>696</a>
|
|
762
|
+
<a name='L697'></a><a href='#L697'>697</a>
|
|
763
|
+
<a name='L698'></a><a href='#L698'>698</a>
|
|
764
|
+
<a name='L699'></a><a href='#L699'>699</a>
|
|
765
|
+
<a name='L700'></a><a href='#L700'>700</a>
|
|
766
|
+
<a name='L701'></a><a href='#L701'>701</a>
|
|
767
|
+
<a name='L702'></a><a href='#L702'>702</a>
|
|
768
|
+
<a name='L703'></a><a href='#L703'>703</a>
|
|
769
|
+
<a name='L704'></a><a href='#L704'>704</a>
|
|
770
|
+
<a name='L705'></a><a href='#L705'>705</a>
|
|
771
|
+
<a name='L706'></a><a href='#L706'>706</a>
|
|
772
|
+
<a name='L707'></a><a href='#L707'>707</a>
|
|
773
|
+
<a name='L708'></a><a href='#L708'>708</a>
|
|
774
|
+
<a name='L709'></a><a href='#L709'>709</a>
|
|
775
|
+
<a name='L710'></a><a href='#L710'>710</a>
|
|
776
|
+
<a name='L711'></a><a href='#L711'>711</a>
|
|
777
|
+
<a name='L712'></a><a href='#L712'>712</a>
|
|
778
|
+
<a name='L713'></a><a href='#L713'>713</a>
|
|
779
|
+
<a name='L714'></a><a href='#L714'>714</a>
|
|
780
|
+
<a name='L715'></a><a href='#L715'>715</a>
|
|
781
|
+
<a name='L716'></a><a href='#L716'>716</a>
|
|
782
|
+
<a name='L717'></a><a href='#L717'>717</a>
|
|
783
|
+
<a name='L718'></a><a href='#L718'>718</a>
|
|
784
|
+
<a name='L719'></a><a href='#L719'>719</a>
|
|
785
|
+
<a name='L720'></a><a href='#L720'>720</a>
|
|
786
|
+
<a name='L721'></a><a href='#L721'>721</a>
|
|
787
|
+
<a name='L722'></a><a href='#L722'>722</a>
|
|
788
|
+
<a name='L723'></a><a href='#L723'>723</a>
|
|
789
|
+
<a name='L724'></a><a href='#L724'>724</a>
|
|
790
|
+
<a name='L725'></a><a href='#L725'>725</a>
|
|
791
|
+
<a name='L726'></a><a href='#L726'>726</a>
|
|
792
|
+
<a name='L727'></a><a href='#L727'>727</a>
|
|
793
|
+
<a name='L728'></a><a href='#L728'>728</a>
|
|
794
|
+
<a name='L729'></a><a href='#L729'>729</a>
|
|
795
|
+
<a name='L730'></a><a href='#L730'>730</a>
|
|
796
|
+
<a name='L731'></a><a href='#L731'>731</a>
|
|
797
|
+
<a name='L732'></a><a href='#L732'>732</a>
|
|
798
|
+
<a name='L733'></a><a href='#L733'>733</a>
|
|
799
|
+
<a name='L734'></a><a href='#L734'>734</a>
|
|
800
|
+
<a name='L735'></a><a href='#L735'>735</a>
|
|
801
|
+
<a name='L736'></a><a href='#L736'>736</a>
|
|
802
|
+
<a name='L737'></a><a href='#L737'>737</a>
|
|
803
|
+
<a name='L738'></a><a href='#L738'>738</a>
|
|
804
|
+
<a name='L739'></a><a href='#L739'>739</a>
|
|
805
|
+
<a name='L740'></a><a href='#L740'>740</a>
|
|
806
|
+
<a name='L741'></a><a href='#L741'>741</a>
|
|
807
|
+
<a name='L742'></a><a href='#L742'>742</a>
|
|
808
|
+
<a name='L743'></a><a href='#L743'>743</a>
|
|
809
|
+
<a name='L744'></a><a href='#L744'>744</a>
|
|
810
|
+
<a name='L745'></a><a href='#L745'>745</a>
|
|
811
|
+
<a name='L746'></a><a href='#L746'>746</a>
|
|
812
|
+
<a name='L747'></a><a href='#L747'>747</a>
|
|
813
|
+
<a name='L748'></a><a href='#L748'>748</a>
|
|
814
|
+
<a name='L749'></a><a href='#L749'>749</a>
|
|
815
|
+
<a name='L750'></a><a href='#L750'>750</a>
|
|
816
|
+
<a name='L751'></a><a href='#L751'>751</a>
|
|
817
|
+
<a name='L752'></a><a href='#L752'>752</a>
|
|
818
|
+
<a name='L753'></a><a href='#L753'>753</a>
|
|
819
|
+
<a name='L754'></a><a href='#L754'>754</a>
|
|
820
|
+
<a name='L755'></a><a href='#L755'>755</a>
|
|
821
|
+
<a name='L756'></a><a href='#L756'>756</a>
|
|
822
|
+
<a name='L757'></a><a href='#L757'>757</a>
|
|
823
|
+
<a name='L758'></a><a href='#L758'>758</a>
|
|
824
|
+
<a name='L759'></a><a href='#L759'>759</a>
|
|
825
|
+
<a name='L760'></a><a href='#L760'>760</a>
|
|
826
|
+
<a name='L761'></a><a href='#L761'>761</a>
|
|
827
|
+
<a name='L762'></a><a href='#L762'>762</a>
|
|
828
|
+
<a name='L763'></a><a href='#L763'>763</a>
|
|
829
|
+
<a name='L764'></a><a href='#L764'>764</a>
|
|
830
|
+
<a name='L765'></a><a href='#L765'>765</a>
|
|
831
|
+
<a name='L766'></a><a href='#L766'>766</a>
|
|
832
|
+
<a name='L767'></a><a href='#L767'>767</a>
|
|
833
|
+
<a name='L768'></a><a href='#L768'>768</a>
|
|
834
|
+
<a name='L769'></a><a href='#L769'>769</a>
|
|
835
|
+
<a name='L770'></a><a href='#L770'>770</a>
|
|
836
|
+
<a name='L771'></a><a href='#L771'>771</a>
|
|
837
|
+
<a name='L772'></a><a href='#L772'>772</a>
|
|
838
|
+
<a name='L773'></a><a href='#L773'>773</a>
|
|
839
|
+
<a name='L774'></a><a href='#L774'>774</a>
|
|
840
|
+
<a name='L775'></a><a href='#L775'>775</a>
|
|
841
|
+
<a name='L776'></a><a href='#L776'>776</a>
|
|
842
|
+
<a name='L777'></a><a href='#L777'>777</a>
|
|
843
|
+
<a name='L778'></a><a href='#L778'>778</a>
|
|
844
|
+
<a name='L779'></a><a href='#L779'>779</a>
|
|
845
|
+
<a name='L780'></a><a href='#L780'>780</a>
|
|
846
|
+
<a name='L781'></a><a href='#L781'>781</a>
|
|
847
|
+
<a name='L782'></a><a href='#L782'>782</a>
|
|
848
|
+
<a name='L783'></a><a href='#L783'>783</a>
|
|
849
|
+
<a name='L784'></a><a href='#L784'>784</a>
|
|
850
|
+
<a name='L785'></a><a href='#L785'>785</a>
|
|
851
|
+
<a name='L786'></a><a href='#L786'>786</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
492
852
|
<span class="cline-any cline-neutral"> </span>
|
|
493
853
|
<span class="cline-any cline-neutral"> </span>
|
|
494
854
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -587,9 +947,157 @@
|
|
|
587
947
|
<span class="cline-any cline-neutral"> </span>
|
|
588
948
|
<span class="cline-any cline-neutral"> </span>
|
|
589
949
|
<span class="cline-any cline-neutral"> </span>
|
|
950
|
+
<span class="cline-any cline-yes">1x</span>
|
|
951
|
+
<span class="cline-any cline-neutral"> </span>
|
|
952
|
+
<span class="cline-any cline-yes">1x</span>
|
|
953
|
+
<span class="cline-any cline-neutral"> </span>
|
|
954
|
+
<span class="cline-any cline-neutral"> </span>
|
|
955
|
+
<span class="cline-any cline-neutral"> </span>
|
|
956
|
+
<span class="cline-any cline-yes">1x</span>
|
|
957
|
+
<span class="cline-any cline-neutral"> </span>
|
|
958
|
+
<span class="cline-any cline-neutral"> </span>
|
|
959
|
+
<span class="cline-any cline-yes">1x</span>
|
|
960
|
+
<span class="cline-any cline-yes">1x</span>
|
|
961
|
+
<span class="cline-any cline-neutral"> </span>
|
|
962
|
+
<span class="cline-any cline-neutral"> </span>
|
|
963
|
+
<span class="cline-any cline-neutral"> </span>
|
|
964
|
+
<span class="cline-any cline-neutral"> </span>
|
|
965
|
+
<span class="cline-any cline-neutral"> </span>
|
|
966
|
+
<span class="cline-any cline-neutral"> </span>
|
|
967
|
+
<span class="cline-any cline-neutral"> </span>
|
|
968
|
+
<span class="cline-any cline-yes">17x</span>
|
|
969
|
+
<span class="cline-any cline-neutral"> </span>
|
|
970
|
+
<span class="cline-any cline-neutral"> </span>
|
|
971
|
+
<span class="cline-any cline-yes">17x</span>
|
|
972
|
+
<span class="cline-any cline-neutral"> </span>
|
|
973
|
+
<span class="cline-any cline-neutral"> </span>
|
|
974
|
+
<span class="cline-any cline-neutral"> </span>
|
|
975
|
+
<span class="cline-any cline-neutral"> </span>
|
|
976
|
+
<span class="cline-any cline-neutral"> </span>
|
|
977
|
+
<span class="cline-any cline-neutral"> </span>
|
|
978
|
+
<span class="cline-any cline-neutral"> </span>
|
|
979
|
+
<span class="cline-any cline-neutral"> </span>
|
|
980
|
+
<span class="cline-any cline-neutral"> </span>
|
|
981
|
+
<span class="cline-any cline-neutral"> </span>
|
|
982
|
+
<span class="cline-any cline-neutral"> </span>
|
|
983
|
+
<span class="cline-any cline-neutral"> </span>
|
|
984
|
+
<span class="cline-any cline-neutral"> </span>
|
|
985
|
+
<span class="cline-any cline-neutral"> </span>
|
|
986
|
+
<span class="cline-any cline-neutral"> </span>
|
|
987
|
+
<span class="cline-any cline-neutral"> </span>
|
|
988
|
+
<span class="cline-any cline-neutral"> </span>
|
|
989
|
+
<span class="cline-any cline-neutral"> </span>
|
|
990
|
+
<span class="cline-any cline-yes">18x</span>
|
|
991
|
+
<span class="cline-any cline-yes">18x</span>
|
|
992
|
+
<span class="cline-any cline-neutral"> </span>
|
|
993
|
+
<span class="cline-any cline-yes">18x</span>
|
|
994
|
+
<span class="cline-any cline-yes">18x</span>
|
|
995
|
+
<span class="cline-any cline-neutral"> </span>
|
|
996
|
+
<span class="cline-any cline-yes">18x</span>
|
|
997
|
+
<span class="cline-any cline-yes">18x</span>
|
|
998
|
+
<span class="cline-any cline-yes">18x</span>
|
|
999
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1000
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1001
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1002
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1003
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1004
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1005
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1006
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1007
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1008
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1009
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1010
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1011
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1012
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1013
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1014
|
+
<span class="cline-any cline-yes">49x</span>
|
|
1015
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1016
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1017
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1018
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1019
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1020
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1021
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1022
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1023
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1024
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1025
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1026
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1027
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1028
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1029
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1030
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1031
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1032
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1033
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1034
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1035
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1036
|
+
<span class="cline-any cline-no"> </span>
|
|
1037
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1038
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1039
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1040
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1041
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1042
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1043
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1044
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1045
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1046
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1047
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1048
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1049
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1050
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1051
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1052
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1053
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1054
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1055
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1056
|
+
<span class="cline-any cline-no"> </span>
|
|
1057
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1058
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1059
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1060
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1061
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1062
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1063
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1064
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1065
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1066
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1067
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1068
|
+
<span class="cline-any cline-no"> </span>
|
|
1069
|
+
<span class="cline-any cline-no"> </span>
|
|
1070
|
+
<span class="cline-any cline-no"> </span>
|
|
1071
|
+
<span class="cline-any cline-no"> </span>
|
|
1072
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1073
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1074
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1075
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1076
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1077
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1078
|
+
<span class="cline-any cline-yes">19x</span>
|
|
1079
|
+
<span class="cline-any cline-yes">19x</span>
|
|
1080
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1081
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1082
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1083
|
+
<span class="cline-any cline-no"> </span>
|
|
1084
|
+
<span class="cline-any cline-no"> </span>
|
|
1085
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1086
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1087
|
+
<span class="cline-any cline-no"> </span>
|
|
1088
|
+
<span class="cline-any cline-no"> </span>
|
|
1089
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1090
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1091
|
+
<span class="cline-any cline-yes">19x</span>
|
|
1092
|
+
<span class="cline-any cline-neutral"> </span>
|
|
590
1093
|
<span class="cline-any cline-neutral"> </span>
|
|
591
1094
|
<span class="cline-any cline-neutral"> </span>
|
|
592
1095
|
<span class="cline-any cline-neutral"> </span>
|
|
1096
|
+
<span class="cline-any cline-yes">38x</span>
|
|
1097
|
+
<span class="cline-any cline-yes">38x</span>
|
|
1098
|
+
<span class="cline-any cline-no"> </span>
|
|
1099
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1100
|
+
<span class="cline-any cline-yes">38x</span>
|
|
593
1101
|
<span class="cline-any cline-neutral"> </span>
|
|
594
1102
|
<span class="cline-any cline-neutral"> </span>
|
|
595
1103
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -605,17 +1113,15 @@
|
|
|
605
1113
|
<span class="cline-any cline-yes">14x</span>
|
|
606
1114
|
<span class="cline-any cline-yes">14x</span>
|
|
607
1115
|
<span class="cline-any cline-yes">14x</span>
|
|
1116
|
+
<span class="cline-any cline-yes">14x</span>
|
|
1117
|
+
<span class="cline-any cline-yes">14x</span>
|
|
608
1118
|
<span class="cline-any cline-neutral"> </span>
|
|
609
1119
|
<span class="cline-any cline-neutral"> </span>
|
|
610
1120
|
<span class="cline-any cline-neutral"> </span>
|
|
611
1121
|
<span class="cline-any cline-neutral"> </span>
|
|
612
1122
|
<span class="cline-any cline-yes">14x</span>
|
|
613
|
-
<span class="cline-any cline-neutral"> </span>
|
|
614
1123
|
<span class="cline-any cline-yes">14x</span>
|
|
615
|
-
<span class="cline-any cline-yes">
|
|
616
|
-
<span class="cline-any cline-neutral"> </span>
|
|
617
|
-
<span class="cline-any cline-neutral"> </span>
|
|
618
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1124
|
+
<span class="cline-any cline-yes">14x</span>
|
|
619
1125
|
<span class="cline-any cline-yes">3x</span>
|
|
620
1126
|
<span class="cline-any cline-yes">3x</span>
|
|
621
1127
|
<span class="cline-any cline-yes">3x</span>
|
|
@@ -623,26 +1129,48 @@
|
|
|
623
1129
|
<span class="cline-any cline-yes">3x</span>
|
|
624
1130
|
<span class="cline-any cline-yes">3x</span>
|
|
625
1131
|
<span class="cline-any cline-yes">3x</span>
|
|
626
|
-
<span class="cline-any cline-no"> </span>
|
|
627
1132
|
<span class="cline-any cline-neutral"> </span>
|
|
1133
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1134
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1135
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1136
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1137
|
+
<span class="cline-any cline-yes">14x</span>
|
|
628
1138
|
<span class="cline-any cline-yes">3x</span>
|
|
629
|
-
<span class="cline-any cline-
|
|
1139
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1140
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1141
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1142
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1143
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1144
|
+
<span class="cline-any cline-neutral"> </span>
|
|
630
1145
|
<span class="cline-any cline-neutral"> </span>
|
|
631
1146
|
<span class="cline-any cline-neutral"> </span>
|
|
632
1147
|
<span class="cline-any cline-neutral"> </span>
|
|
633
1148
|
<span class="cline-any cline-neutral"> </span>
|
|
634
1149
|
<span class="cline-any cline-neutral"> </span>
|
|
635
1150
|
<span class="cline-any cline-yes">3x</span>
|
|
1151
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1152
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1153
|
+
<span class="cline-any cline-neutral"> </span>
|
|
636
1154
|
<span class="cline-any cline-yes">3x</span>
|
|
1155
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1156
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1157
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1158
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1159
|
+
<span class="cline-any cline-neutral"> </span>
|
|
637
1160
|
<span class="cline-any cline-yes">3x</span>
|
|
638
1161
|
<span class="cline-any cline-yes">3x</span>
|
|
639
1162
|
<span class="cline-any cline-neutral"> </span>
|
|
640
1163
|
<span class="cline-any cline-neutral"> </span>
|
|
641
1164
|
<span class="cline-any cline-neutral"> </span>
|
|
642
1165
|
<span class="cline-any cline-neutral"> </span>
|
|
1166
|
+
<span class="cline-any cline-neutral"> </span>
|
|
643
1167
|
<span class="cline-any cline-yes">14x</span>
|
|
644
1168
|
<span class="cline-any cline-yes">13x</span>
|
|
645
1169
|
<span class="cline-any cline-yes">13x</span>
|
|
1170
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1171
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1172
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1173
|
+
<span class="cline-any cline-neutral"> </span>
|
|
646
1174
|
<span class="cline-any cline-neutral"> </span>
|
|
647
1175
|
<span class="cline-any cline-neutral"> </span>
|
|
648
1176
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -650,6 +1178,11 @@
|
|
|
650
1178
|
<span class="cline-any cline-neutral"> </span>
|
|
651
1179
|
<span class="cline-any cline-neutral"> </span>
|
|
652
1180
|
<span class="cline-any cline-neutral"> </span>
|
|
1181
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1182
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1183
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1184
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1185
|
+
<span class="cline-any cline-neutral"> </span>
|
|
653
1186
|
<span class="cline-any cline-yes">13x</span>
|
|
654
1187
|
<span class="cline-any cline-neutral"> </span>
|
|
655
1188
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -662,77 +1195,246 @@
|
|
|
662
1195
|
<span class="cline-any cline-neutral"> </span>
|
|
663
1196
|
<span class="cline-any cline-neutral"> </span>
|
|
664
1197
|
<span class="cline-any cline-neutral"> </span>
|
|
1198
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1199
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1200
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1201
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1202
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1203
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1204
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1205
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1206
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1207
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1208
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1209
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1210
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1211
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1212
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1213
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1214
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1215
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1216
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1217
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1218
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1219
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1220
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1221
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1222
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1223
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1224
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1225
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1226
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1227
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1228
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1229
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1230
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1231
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1232
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1233
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1234
|
+
<span class="cline-any cline-no"> </span>
|
|
1235
|
+
<span class="cline-any cline-no"> </span>
|
|
1236
|
+
<span class="cline-any cline-no"> </span>
|
|
1237
|
+
<span class="cline-any cline-no"> </span>
|
|
1238
|
+
<span class="cline-any cline-no"> </span>
|
|
1239
|
+
<span class="cline-any cline-no"> </span>
|
|
1240
|
+
<span class="cline-any cline-no"> </span>
|
|
665
1241
|
<span class="cline-any cline-no"> </span>
|
|
666
1242
|
<span class="cline-any cline-no"> </span>
|
|
667
1243
|
<span class="cline-any cline-no"> </span>
|
|
668
1244
|
<span class="cline-any cline-no"> </span>
|
|
669
1245
|
<span class="cline-any cline-neutral"> </span>
|
|
670
1246
|
<span class="cline-any cline-neutral"> </span>
|
|
671
|
-
<span class="cline-any cline-no"> </span>
|
|
672
1247
|
<span class="cline-any cline-neutral"> </span>
|
|
673
|
-
<span class="cline-any cline-
|
|
1248
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1249
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1250
|
+
<span class="cline-any cline-yes">4x</span>
|
|
674
1251
|
<span class="cline-any cline-no"> </span>
|
|
675
1252
|
<span class="cline-any cline-no"> </span>
|
|
676
1253
|
<span class="cline-any cline-no"> </span>
|
|
677
1254
|
<span class="cline-any cline-neutral"> </span>
|
|
1255
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1256
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1257
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1258
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1259
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1260
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1261
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1262
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1263
|
+
<span class="cline-any cline-neutral"> </span>
|
|
678
1264
|
<span class="cline-any cline-no"> </span>
|
|
1265
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1266
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1267
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1268
|
+
<span class="cline-any cline-neutral"> </span>
|
|
679
1269
|
<span class="cline-any cline-no"> </span>
|
|
680
1270
|
<span class="cline-any cline-no"> </span>
|
|
681
1271
|
<span class="cline-any cline-neutral"> </span>
|
|
682
1272
|
<span class="cline-any cline-neutral"> </span>
|
|
1273
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1274
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1275
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1276
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1277
|
+
<span class="cline-any cline-no"> </span>
|
|
683
1278
|
<span class="cline-any cline-no"> </span>
|
|
684
1279
|
<span class="cline-any cline-no"> </span>
|
|
1280
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1281
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1282
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1283
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1284
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1285
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1286
|
+
<span class="cline-any cline-neutral"> </span>
|
|
685
1287
|
<span class="cline-any cline-no"> </span>
|
|
686
1288
|
<span class="cline-any cline-neutral"> </span>
|
|
687
|
-
<span class="cline-any cline-no"> </span>
|
|
688
|
-
<span class="cline-any cline-no"> </span>
|
|
689
|
-
<span class="cline-any cline-no"> </span>
|
|
690
|
-
<span class="cline-any cline-no"> </span>
|
|
691
|
-
<span class="cline-any cline-no"> </span>
|
|
692
|
-
<span class="cline-any cline-no"> </span>
|
|
693
|
-
<span class="cline-any cline-no"> </span>
|
|
694
|
-
<span class="cline-any cline-no"> </span>
|
|
695
|
-
<span class="cline-any cline-no"> </span>
|
|
696
|
-
<span class="cline-any cline-no"> </span>
|
|
697
|
-
<span class="cline-any cline-no"> </span>
|
|
698
1289
|
<span class="cline-any cline-neutral"> </span>
|
|
699
1290
|
<span class="cline-any cline-neutral"> </span>
|
|
700
1291
|
<span class="cline-any cline-neutral"> </span>
|
|
701
|
-
<span class="cline-any cline-no"> </span>
|
|
702
1292
|
<span class="cline-any cline-neutral"> </span>
|
|
703
|
-
<span class="cline-any cline-no"> </span>
|
|
704
|
-
<span class="cline-any cline-no"> </span>
|
|
705
1293
|
<span class="cline-any cline-neutral"> </span>
|
|
706
1294
|
<span class="cline-any cline-neutral"> </span>
|
|
707
1295
|
<span class="cline-any cline-neutral"> </span>
|
|
708
1296
|
<span class="cline-any cline-neutral"> </span>
|
|
1297
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1298
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1299
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1300
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1301
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1302
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1303
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1304
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1305
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1306
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1307
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1308
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1309
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1310
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1311
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1312
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1313
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1314
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1315
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1316
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1317
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1318
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1319
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1320
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1321
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1322
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1323
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1324
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1325
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1326
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1327
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1328
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1329
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1330
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1331
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1332
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1333
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1334
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1335
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1336
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1337
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1338
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1339
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1340
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1341
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1342
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1343
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1344
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1345
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1346
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1347
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1348
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1349
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1350
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1351
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1352
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1353
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1354
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1355
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1356
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1357
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1358
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1359
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1360
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1361
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1362
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1363
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1364
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1365
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1366
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1367
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1368
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1369
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1370
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1371
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1372
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1373
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1374
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1375
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1376
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1377
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1378
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1379
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1380
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1381
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1382
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1383
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1384
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1385
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1386
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1387
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1388
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1389
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1390
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1391
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1392
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1393
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1394
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1395
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1396
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1397
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1398
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1399
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1400
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1401
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1402
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1403
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1404
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1405
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1406
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1407
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1408
|
+
<span class="cline-any cline-yes">4x</span>
|
|
709
1409
|
<span class="cline-any cline-neutral"> </span>
|
|
710
1410
|
<span class="cline-any cline-neutral"> </span>
|
|
711
1411
|
<span class="cline-any cline-no"> </span>
|
|
712
|
-
<span class="cline-any cline-no"> </span>
|
|
713
|
-
<span class="cline-any cline-no"> </span>
|
|
714
1412
|
<span class="cline-any cline-neutral"> </span>
|
|
715
1413
|
<span class="cline-any cline-neutral"> </span>
|
|
716
1414
|
<span class="cline-any cline-neutral"> </span>
|
|
1415
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1416
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1417
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1418
|
+
<span class="cline-any cline-yes">2x</span>
|
|
717
1419
|
<span class="cline-any cline-neutral"> </span>
|
|
718
1420
|
<span class="cline-any cline-neutral"> </span>
|
|
1421
|
+
<span class="cline-any cline-yes">4x</span>
|
|
719
1422
|
<span class="cline-any cline-neutral"> </span>
|
|
720
1423
|
<span class="cline-any cline-neutral"> </span>
|
|
721
|
-
<span class="cline-any cline-no"> </span>
|
|
722
1424
|
<span class="cline-any cline-neutral"> </span>
|
|
1425
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1426
|
+
<span class="cline-any cline-yes">1x</span>
|
|
723
1427
|
<span class="cline-any cline-neutral"> </span>
|
|
724
1428
|
<span class="cline-any cline-neutral"> </span>
|
|
725
1429
|
<span class="cline-any cline-neutral"> </span>
|
|
1430
|
+
<span class="cline-any cline-yes">4x</span>
|
|
726
1431
|
<span class="cline-any cline-no"> </span>
|
|
727
|
-
<span class="cline-any cline-
|
|
728
|
-
<span class="cline-any cline-no"> </span>
|
|
729
|
-
<span class="cline-any cline-no"> </span>
|
|
730
|
-
<span class="cline-any cline-no"> </span>
|
|
1432
|
+
<span class="cline-any cline-yes">3x</span>
|
|
731
1433
|
<span class="cline-any cline-neutral"> </span>
|
|
1434
|
+
<span class="cline-any cline-yes">2x</span>
|
|
732
1435
|
<span class="cline-any cline-neutral"> </span>
|
|
733
1436
|
<span class="cline-any cline-neutral"> </span>
|
|
734
1437
|
<span class="cline-any cline-neutral"> </span>
|
|
735
|
-
<span class="cline-any cline-no"> </span>
|
|
736
1438
|
<span class="cline-any cline-neutral"> </span>
|
|
737
1439
|
<span class="cline-any cline-neutral"> </span>
|
|
738
1440
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -742,52 +1444,43 @@
|
|
|
742
1444
|
<span class="cline-any cline-neutral"> </span>
|
|
743
1445
|
<span class="cline-any cline-neutral"> </span>
|
|
744
1446
|
<span class="cline-any cline-neutral"> </span>
|
|
1447
|
+
<span class="cline-any cline-no"> </span>
|
|
1448
|
+
<span class="cline-any cline-yes">2x</span>
|
|
745
1449
|
<span class="cline-any cline-neutral"> </span>
|
|
746
1450
|
<span class="cline-any cline-neutral"> </span>
|
|
747
1451
|
<span class="cline-any cline-neutral"> </span>
|
|
748
1452
|
<span class="cline-any cline-neutral"> </span>
|
|
749
1453
|
<span class="cline-any cline-neutral"> </span>
|
|
750
1454
|
<span class="cline-any cline-neutral"> </span>
|
|
751
|
-
<span class="cline-any cline-no"> </span>
|
|
752
1455
|
<span class="cline-any cline-neutral"> </span>
|
|
753
1456
|
<span class="cline-any cline-neutral"> </span>
|
|
754
|
-
<span class="cline-any cline-no"> </span>
|
|
755
|
-
<span class="cline-any cline-no"> </span>
|
|
756
|
-
<span class="cline-any cline-no"> </span>
|
|
757
|
-
<span class="cline-any cline-no"> </span>
|
|
758
|
-
<span class="cline-any cline-no"> </span>
|
|
759
|
-
<span class="cline-any cline-no"> </span>
|
|
760
1457
|
<span class="cline-any cline-neutral"> </span>
|
|
761
|
-
<span class="cline-any cline-
|
|
762
|
-
<span class="cline-any cline-no"> </span>
|
|
1458
|
+
<span class="cline-any cline-yes">4x</span>
|
|
763
1459
|
<span class="cline-any cline-neutral"> </span>
|
|
764
1460
|
<span class="cline-any cline-neutral"> </span>
|
|
765
|
-
<span class="cline-any cline-no"> </span>
|
|
766
1461
|
<span class="cline-any cline-neutral"> </span>
|
|
767
1462
|
<span class="cline-any cline-neutral"> </span>
|
|
768
|
-
<span class="cline-any cline-no"> </span>
|
|
769
1463
|
<span class="cline-any cline-neutral"> </span>
|
|
1464
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1465
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1466
|
+
<span class="cline-any cline-yes">4x</span>
|
|
770
1467
|
<span class="cline-any cline-neutral"> </span>
|
|
1468
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1469
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1470
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1471
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1472
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1473
|
+
<span class="cline-any cline-yes">3x</span>
|
|
771
1474
|
<span class="cline-any cline-neutral"> </span>
|
|
1475
|
+
<span class="cline-any cline-yes">4x</span>
|
|
772
1476
|
<span class="cline-any cline-no"> </span>
|
|
773
1477
|
<span class="cline-any cline-no"> </span>
|
|
774
1478
|
<span class="cline-any cline-no"> </span>
|
|
775
1479
|
<span class="cline-any cline-neutral"> </span>
|
|
776
|
-
<span class="cline-any cline-
|
|
777
|
-
<span class="cline-any cline-no"> </span>
|
|
778
|
-
<span class="cline-any cline-no"> </span>
|
|
1480
|
+
<span class="cline-any cline-yes">4x</span>
|
|
779
1481
|
<span class="cline-any cline-neutral"> </span>
|
|
780
|
-
<span class="cline-any cline-no"> </span>
|
|
781
|
-
<span class="cline-any cline-no"> </span>
|
|
782
|
-
<span class="cline-any cline-no"> </span>
|
|
783
|
-
<span class="cline-any cline-no"> </span>
|
|
784
1482
|
<span class="cline-any cline-neutral"> </span>
|
|
785
|
-
<span class="cline-any cline-no"> </span>
|
|
786
|
-
<span class="cline-any cline-no"> </span>
|
|
787
|
-
<span class="cline-any cline-no"> </span>
|
|
788
|
-
<span class="cline-any cline-no"> </span>
|
|
789
1483
|
<span class="cline-any cline-neutral"> </span>
|
|
790
|
-
<span class="cline-any cline-no"> </span>
|
|
791
1484
|
<span class="cline-any cline-neutral"> </span>
|
|
792
1485
|
<span class="cline-any cline-neutral"> </span>
|
|
793
1486
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -803,7 +1496,8 @@
|
|
|
803
1496
|
<span class="cline-any cline-no"> </span>
|
|
804
1497
|
<span class="cline-any cline-no"> </span>
|
|
805
1498
|
<span class="cline-any cline-no"> </span>
|
|
806
|
-
<span class="cline-any cline-
|
|
1499
|
+
<span class="cline-any cline-no"> </span>
|
|
1500
|
+
<span class="cline-any cline-no"> </span>
|
|
807
1501
|
<span class="cline-any cline-neutral"> </span>
|
|
808
1502
|
<span class="cline-any cline-no"> </span>
|
|
809
1503
|
<span class="cline-any cline-no"> </span>
|
|
@@ -819,11 +1513,20 @@
|
|
|
819
1513
|
<span class="cline-any cline-neutral"> </span>
|
|
820
1514
|
<span class="cline-any cline-no"> </span>
|
|
821
1515
|
<span class="cline-any cline-no"> </span>
|
|
1516
|
+
<span class="cline-any cline-no"> </span>
|
|
1517
|
+
<span class="cline-any cline-no"> </span>
|
|
1518
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1519
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1520
|
+
<span class="cline-any cline-neutral"> </span>
|
|
822
1521
|
<span class="cline-any cline-neutral"> </span>
|
|
823
1522
|
<span class="cline-any cline-neutral"> </span>
|
|
824
1523
|
<span class="cline-any cline-neutral"> </span>
|
|
825
1524
|
<span class="cline-any cline-neutral"> </span>
|
|
826
1525
|
<span class="cline-any cline-neutral"> </span>
|
|
1526
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1527
|
+
<span class="cline-any cline-no"> </span>
|
|
1528
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1529
|
+
<span class="cline-any cline-neutral"> </span>
|
|
827
1530
|
<span class="cline-any cline-no"> </span>
|
|
828
1531
|
<span class="cline-any cline-neutral"> </span>
|
|
829
1532
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -836,12 +1539,19 @@
|
|
|
836
1539
|
<span class="cline-any cline-neutral"> </span>
|
|
837
1540
|
<span class="cline-any cline-neutral"> </span>
|
|
838
1541
|
<span class="cline-any cline-neutral"> </span>
|
|
1542
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1543
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1544
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1545
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1546
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1547
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1548
|
+
<span class="cline-any cline-no"> </span>
|
|
1549
|
+
<span class="cline-any cline-no"> </span>
|
|
839
1550
|
<span class="cline-any cline-no"> </span>
|
|
840
1551
|
<span class="cline-any cline-no"> </span>
|
|
841
1552
|
<span class="cline-any cline-no"> </span>
|
|
842
1553
|
<span class="cline-any cline-no"> </span>
|
|
843
1554
|
<span class="cline-any cline-no"> </span>
|
|
844
|
-
<span class="cline-any cline-neutral"> </span>
|
|
845
1555
|
<span class="cline-any cline-neutral"> </span>
|
|
846
1556
|
<span class="cline-any cline-no"> </span>
|
|
847
1557
|
<span class="cline-any cline-no"> </span>
|
|
@@ -857,73 +1567,106 @@
|
|
|
857
1567
|
<span class="cline-any cline-neutral"> </span>
|
|
858
1568
|
<span class="cline-any cline-no"> </span>
|
|
859
1569
|
<span class="cline-any cline-no"> </span>
|
|
1570
|
+
<span class="cline-any cline-no"> </span>
|
|
1571
|
+
<span class="cline-any cline-no"> </span>
|
|
860
1572
|
<span class="cline-any cline-neutral"> </span>
|
|
861
1573
|
<span class="cline-any cline-neutral"> </span>
|
|
862
1574
|
<span class="cline-any cline-neutral"> </span>
|
|
863
1575
|
<span class="cline-any cline-neutral"> </span>
|
|
864
1576
|
<span class="cline-any cline-neutral"> </span>
|
|
865
|
-
<span class="cline-any cline-no"> </span>
|
|
866
1577
|
<span class="cline-any cline-neutral"> </span>
|
|
867
1578
|
<span class="cline-any cline-neutral"> </span>
|
|
868
1579
|
<span class="cline-any cline-neutral"> </span>
|
|
869
1580
|
<span class="cline-any cline-neutral"> </span>
|
|
1581
|
+
<span class="cline-any cline-no"> </span>
|
|
870
1582
|
<span class="cline-any cline-neutral"> </span>
|
|
871
|
-
<span class="cline-any cline-yes">1x</span>
|
|
872
1583
|
<span class="cline-any cline-neutral"> </span>
|
|
1584
|
+
<span class="cline-any cline-no"> </span>
|
|
873
1585
|
<span class="cline-any cline-neutral"> </span>
|
|
874
1586
|
<span class="cline-any cline-neutral"> </span>
|
|
875
|
-
<span class="cline-any cline-yes">1x</span>
|
|
876
1587
|
<span class="cline-any cline-neutral"> </span>
|
|
877
|
-
<span class="cline-any cline-yes">1x</span>
|
|
878
|
-
<span class="cline-any cline-yes">1x</span>
|
|
879
1588
|
<span class="cline-any cline-neutral"> </span>
|
|
880
|
-
<span class="cline-any cline-yes">1x</span>
|
|
881
|
-
<span class="cline-any cline-no"> </span>
|
|
882
1589
|
<span class="cline-any cline-neutral"> </span>
|
|
883
|
-
<span class="cline-any cline-yes">1x</span>
|
|
884
|
-
<span class="cline-any cline-no"> </span>
|
|
885
1590
|
<span class="cline-any cline-neutral"> </span>
|
|
886
|
-
<span class="cline-any cline-yes">1x</span>
|
|
887
|
-
<span class="cline-any cline-no"> </span>
|
|
888
1591
|
<span class="cline-any cline-neutral"> </span>
|
|
889
1592
|
<span class="cline-any cline-neutral"> </span>
|
|
890
1593
|
<span class="cline-any cline-neutral"> </span>
|
|
891
1594
|
<span class="cline-any cline-neutral"> </span>
|
|
892
1595
|
<span class="cline-any cline-neutral"> </span>
|
|
893
1596
|
<span class="cline-any cline-neutral"> </span>
|
|
1597
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1598
|
+
<span class="cline-any cline-no"> </span>
|
|
1599
|
+
<span class="cline-any cline-no"> </span>
|
|
894
1600
|
<span class="cline-any cline-neutral"> </span>
|
|
1601
|
+
<span class="cline-any cline-no"> </span>
|
|
895
1602
|
<span class="cline-any cline-neutral"> </span>
|
|
896
1603
|
<span class="cline-any cline-neutral"> </span>
|
|
897
|
-
<span class="cline-any cline-yes">13x</span>
|
|
898
1604
|
<span class="cline-any cline-neutral"> </span>
|
|
899
1605
|
<span class="cline-any cline-neutral"> </span>
|
|
1606
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1607
|
+
<span class="cline-any cline-no"> </span>
|
|
1608
|
+
<span class="cline-any cline-no"> </span>
|
|
1609
|
+
<span class="cline-any cline-no"> </span>
|
|
1610
|
+
<span class="cline-any cline-no"> </span>
|
|
1611
|
+
<span class="cline-any cline-no"> </span>
|
|
1612
|
+
<span class="cline-any cline-neutral"> </span>
|
|
900
1613
|
<span class="cline-any cline-neutral"> </span>
|
|
901
|
-
<span class="cline-any cline-yes">13x</span>
|
|
902
|
-
<span class="cline-any cline-yes">13x</span>
|
|
903
1614
|
<span class="cline-any cline-neutral"> </span>
|
|
904
|
-
<span class="cline-any cline-
|
|
1615
|
+
<span class="cline-any cline-no"> </span>
|
|
1616
|
+
<span class="cline-any cline-no"> </span>
|
|
1617
|
+
<span class="cline-any cline-no"> </span>
|
|
1618
|
+
<span class="cline-any cline-no"> </span>
|
|
1619
|
+
<span class="cline-any cline-no"> </span>
|
|
1620
|
+
<span class="cline-any cline-no"> </span>
|
|
905
1621
|
<span class="cline-any cline-no"> </span>
|
|
906
1622
|
<span class="cline-any cline-neutral"> </span>
|
|
907
|
-
<span class="cline-any cline-yes">13x</span>
|
|
908
1623
|
<span class="cline-any cline-no"> </span>
|
|
909
1624
|
<span class="cline-any cline-neutral"> </span>
|
|
910
|
-
<span class="cline-any cline-
|
|
1625
|
+
<span class="cline-any cline-neutral"> </span>
|
|
911
1626
|
<span class="cline-any cline-no"> </span>
|
|
912
1627
|
<span class="cline-any cline-neutral"> </span>
|
|
913
1628
|
<span class="cline-any cline-neutral"> </span>
|
|
914
1629
|
<span class="cline-any cline-neutral"> </span>
|
|
915
1630
|
<span class="cline-any cline-neutral"> </span>
|
|
1631
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1632
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1633
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1634
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1635
|
+
<span class="cline-any cline-neutral"> </span>
|
|
916
1636
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { resolve, join, relative, dirname, basename } from 'node:path';
|
|
1637
|
+
import { existsSync, readFileSync, rmSync, readdirSync, rmdirSync } from 'node:fs';
|
|
917
1638
|
import { generateContract } from './codegen-contract.js';
|
|
918
1639
|
import { generateOp } from './codegen-operation.js';
|
|
919
|
-
import type {
|
|
1640
|
+
import type {
|
|
1641
|
+
ContractKitPlugin,
|
|
1642
|
+
PluginContext,
|
|
1643
|
+
ContractRootNode,
|
|
1644
|
+
OpRootNode,
|
|
1645
|
+
ModelNode,
|
|
1646
|
+
IncrementalManifest,
|
|
1647
|
+
IncrementalUnit,
|
|
1648
|
+
IncrementalOutputFile,
|
|
1649
|
+
} from '@contractkit/core';
|
|
1650
|
+
import {
|
|
1651
|
+
runIncrementalCodegen,
|
|
1652
|
+
parseIncrementalManifest,
|
|
1653
|
+
emptyIncrementalManifest,
|
|
1654
|
+
hashFingerprint,
|
|
1655
|
+
collectTransitiveModelRefs,
|
|
1656
|
+
collectTypeRefs,
|
|
1657
|
+
} from '@contractkit/core';
|
|
920
1658
|
import {
|
|
921
1659
|
generateSdk,
|
|
922
1660
|
generateSdkOptions,
|
|
923
1661
|
generateSdkAggregator,
|
|
924
1662
|
deriveClientClassName,
|
|
925
1663
|
deriveClientPropertyName,
|
|
1664
|
+
deriveSubareaClientClassName,
|
|
1665
|
+
deriveSubareaPropertyName,
|
|
1666
|
+
getAreaSubarea,
|
|
926
1667
|
hasPublicOperations,
|
|
1668
|
+
type SdkClientInfo,
|
|
1669
|
+
type SdkAreaInfo,
|
|
927
1670
|
} from './codegen-sdk.js';
|
|
928
1671
|
import { generatePlainTypes } from './codegen-plain-types.js';
|
|
929
1672
|
import {
|
|
@@ -943,173 +1686,337 @@ import {
|
|
|
943
1686
|
export interface ServerConfig {
|
|
944
1687
|
/** Directory (relative to rootDir) where server files are written. Default: rootDir. */
|
|
945
1688
|
baseDir?: string;
|
|
946
|
-
/**
|
|
947
|
-
* When true, `output.types` emits Zod schema files (via `generateContract`).
|
|
948
|
-
* When false/omitted, `output.types` emits plain TypeScript interfaces.
|
|
949
|
-
*/
|
|
1689
|
+
/** When true, `output.types` emits Zod schema files (via `generateContract`). When false/omitted, emits plain TypeScript. */
|
|
950
1690
|
zod?: boolean;
|
|
951
1691
|
output?: {
|
|
952
|
-
/** Path template for Koa router files. Supports {filename}, {dir}, {area}.
|
|
1692
|
+
/** Path template for Koa router files. Supports {filename}, {dir}, {area}. */
|
|
953
1693
|
routes?: string;
|
|
954
|
-
/**
|
|
955
|
-
* Path template for type/schema files. Supports {filename}, {dir}, {area}.
|
|
956
|
-
* Generates Zod schemas when `zod: true`, otherwise plain TypeScript interfaces.
|
|
957
|
-
*/
|
|
1694
|
+
/** Path template for type/schema files. Supports {filename}, {dir}, {area}. */
|
|
958
1695
|
types?: string;
|
|
959
1696
|
};
|
|
960
|
-
/** Import path template for service implementations.
|
|
1697
|
+
/** Import path template for service implementations. */
|
|
961
1698
|
servicePathTemplate?: string;
|
|
962
|
-
/**
|
|
963
|
-
* Whether to emit handlers for operations marked `internal`. Defaults to `true` —
|
|
964
|
-
* the server still needs routes for internal endpoints. Set to `false` to omit them.
|
|
965
|
-
*/
|
|
1699
|
+
/** Whether to emit handlers for `internal` operations. Default true. */
|
|
966
1700
|
includeInternal?: boolean;
|
|
967
1701
|
}
|
|
968
1702
|
|
|
969
1703
|
export interface SdkConfig {
|
|
970
|
-
/** Directory (relative to rootDir) where SDK files are written. Default: rootDir. */
|
|
971
1704
|
baseDir?: string;
|
|
972
|
-
/** Name used for the aggregator SDK class (e.g. "homegrown" → `HomegrownSdk`). */
|
|
973
1705
|
name?: string;
|
|
974
|
-
/**
|
|
975
|
-
* When true, `output.types` emits Zod schema files (via `generateContract`).
|
|
976
|
-
* When false/omitted, `output.types` emits plain TypeScript interfaces.
|
|
977
|
-
*/
|
|
978
1706
|
zod?: boolean;
|
|
979
1707
|
output?: {
|
|
980
|
-
/** Path template for the SDK aggregator file. Supports {name}. Default: `sdk.ts`. */
|
|
981
1708
|
sdk?: string;
|
|
982
|
-
/** Path template for SDK type files. Supports {filename}, {dir}, {area}. */
|
|
983
1709
|
types?: string;
|
|
984
|
-
/** Path template for client class files. Supports {filename}, {dir}, {area}. */
|
|
985
1710
|
clients?: string;
|
|
986
1711
|
};
|
|
987
|
-
/**
|
|
988
|
-
* Whether to emit SDK methods for operations marked `internal`. Defaults to `false` —
|
|
989
|
-
* internal ops are omitted from the SDK so consumers don't pick them up. Set to `true`
|
|
990
|
-
* for an internal-use SDK that should expose them.
|
|
991
|
-
*/
|
|
992
1712
|
includeInternal?: boolean;
|
|
993
1713
|
}
|
|
994
1714
|
|
|
995
1715
|
export interface ZodConfig {
|
|
996
|
-
/** Directory (relative to rootDir) where Zod schema files are written. Default: rootDir. */
|
|
997
1716
|
baseDir?: string;
|
|
998
|
-
/** Output path template. Supports {filename}, {dir}. Default: `{filename}.schema.ts` alongside source. */
|
|
999
1717
|
output?: string;
|
|
1000
1718
|
}
|
|
1001
1719
|
|
|
1002
1720
|
export interface TypesConfig {
|
|
1003
|
-
/** Directory (relative to rootDir) where plain TypeScript type files are written. Default: rootDir. */
|
|
1004
1721
|
baseDir?: string;
|
|
1005
|
-
/** Output path template. Supports {filename}, {dir}. Default: `{filename}.types.ts` alongside source. */
|
|
1006
1722
|
output?: string;
|
|
1007
1723
|
}
|
|
1008
1724
|
|
|
1009
1725
|
export interface TypescriptPluginConfig {
|
|
1010
|
-
/** Generate Koa router files from `operation` declarations. */
|
|
1011
1726
|
server?: ServerConfig;
|
|
1012
|
-
/** Generate TypeScript SDK client files from `operation` declarations. */
|
|
1013
1727
|
sdk?: SdkConfig;
|
|
1014
|
-
/** Generate Zod schema files from `contract` declarations. */
|
|
1015
1728
|
zod?: ZodConfig;
|
|
1016
|
-
/** Generate plain TypeScript interface/type files from `contract` declarations (no Zod runtime). */
|
|
1017
1729
|
types?: TypesConfig;
|
|
1018
1730
|
}
|
|
1019
1731
|
|
|
1020
|
-
// ───
|
|
1732
|
+
// ─── Caching constants ─────────────────────────────────────────────────────
|
|
1733
|
+
|
|
1734
|
+
/** Bumped when the codegen output shape changes in a way that should bust every per-file fingerprint. */
|
|
1735
|
+
export const TYPESCRIPT_CODEGEN_VERSION = '1';
|
|
1736
|
+
|
|
1737
|
+
const MANIFEST_FILENAME = '.contractkit-typescript-manifest.json';
|
|
1738
|
+
|
|
1739
|
+
// ─── Plugin entry points ──────────────────────────────────────────────────
|
|
1740
|
+
|
|
1741
|
+
const plugin: ContractKitPlugin = {
|
|
1742
|
+
name: 'typescript',
|
|
1743
|
+
async generateTargets(inputs, ctx) {
|
|
1744
|
+
const config = ctx.options as TypescriptPluginConfig;
|
|
1745
|
+
await runTypescriptCodegen(inputs, ctx, config, ctx.rootDir);
|
|
1746
|
+
},
|
|
1747
|
+
};
|
|
1748
|
+
|
|
1749
|
+
export default plugin;
|
|
1750
|
+
|
|
1751
|
+
/** Build a `@contractkit/plugin-typescript` instance with explicit configuration, for programmatic use. */
|
|
1752
|
+
export function createTypescriptPlugin(config: TypescriptPluginConfig, rootDir: string): ContractKitPlugin {
|
|
1753
|
+
return {
|
|
1754
|
+
name: 'typescript',
|
|
1755
|
+
async generateTargets(inputs, ctx) {
|
|
1756
|
+
await runTypescriptCodegen(inputs, ctx, config, rootDir);
|
|
1757
|
+
},
|
|
1758
|
+
};
|
|
1759
|
+
}
|
|
1760
|
+
|
|
1761
|
+
/**
|
|
1762
|
+
* Shared orchestration. Each sub-generator (server / sdk / zod / types) contributes a
|
|
1763
|
+
* set of cacheable units (per-file fingerprints) plus a set of always-regenerated global
|
|
1764
|
+
* files (aggregators, barrels, sdk-options). Units share a single manifest so the cache
|
|
1765
|
+
* survives cross-cutting reads — the manifest lives at `<rootDir>/.contractkit-typescript-manifest.json`.
|
|
1766
|
+
*
|
|
1767
|
+
* Honors `ctx.cacheEnabled` — `--force` bypasses the manifest entirely.
|
|
1768
|
+
*/
|
|
1769
|
+
async function runTypescriptCodegen(
|
|
1770
|
+
inputs: Parameters<NonNullable<ContractKitPlugin['generateTargets']>>[0],
|
|
1771
|
+
ctx: PluginContext,
|
|
1772
|
+
config: TypescriptPluginConfig,
|
|
1773
|
+
rootDir: string,
|
|
1774
|
+
): Promise<void> {
|
|
1775
|
+
const manifestPath = resolve(rootDir, MANIFEST_FILENAME);
|
|
1776
|
+
const prevManifest: IncrementalManifest = ctx.cacheEnabled ? readManifest(<span class="branch-1 cbranch-no" title="branch not covered" >manifestPath) : emptyIncrementalManifest(TYPESCRIPT_CODEGEN_VERSION);</span>
|
|
1777
|
+
|
|
1778
|
+
const units: IncrementalUnit[] = [];
|
|
1779
|
+
const globalFiles: IncrementalOutputFile[] = [];
|
|
1780
|
+
|
|
1781
|
+
if (config.server) collectServerOutput(config.server, rootDir, inputs, units);
|
|
1782
|
+
if (config.sdk) collectSdkOutput(config.sdk, rootDir, inputs, units, globalFiles);
|
|
1783
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (config.zod) <span class="cstat-no" title="statement not covered" >collectZodOutput(config.zod, rootDir, inputs, units);</span>
|
|
1784
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (config.types) <span class="cstat-no" title="statement not covered" >collectTypesOutput(config.types, rootDir, inputs, units);</span>
|
|
1785
|
+
|
|
1786
|
+
const result = runIncrementalCodegen({
|
|
1787
|
+
codegenVersion: TYPESCRIPT_CODEGEN_VERSION,
|
|
1788
|
+
manifestFilename: manifestPath,
|
|
1789
|
+
prevManifest,
|
|
1790
|
+
globalFiles,
|
|
1791
|
+
units,
|
|
1792
|
+
// Paths are absolute, so existsSync works directly.
|
|
1793
|
+
fileExists: existsSync,
|
|
1794
|
+
});
|
|
1795
|
+
|
|
1796
|
+
deleteStalePaths(result.deletedPaths);
|
|
1797
|
+
|
|
1798
|
+
for (const { relativePath, content } of result.filesToWrite) {
|
|
1799
|
+
ctx.emitFile(relativePath, content);
|
|
1800
|
+
}
|
|
1801
|
+
}
|
|
1802
|
+
|
|
1803
|
+
// ─── Cross-file dependency analysis ────────────────────────────────────────
|
|
1804
|
+
|
|
1805
|
+
/** Build a quick lookup from model name → its definition. */
|
|
1806
|
+
function buildModelMap(contractRoots: readonly ContractRootNode[]): Map<string, ModelNode> {
|
|
1807
|
+
const map = new Map<string, ModelNode>();
|
|
1808
|
+
for (const root of contractRoots) {
|
|
1809
|
+
for (const model of root.models) map.set(model.name, model);
|
|
1810
|
+
}
|
|
1811
|
+
return map;
|
|
1812
|
+
}
|
|
1813
|
+
|
|
1814
|
+
/** Collect every model referenced by this contract root (own models' fields + bases). Used to slice cross-file fingerprint inputs to just what this file actually depends on. */
|
|
1815
|
+
function collectContractRootRefs(root: ContractRootNode, modelMap: Map<string, ModelNode>): Set<string> {
|
|
1816
|
+
const seeds: Parameters<typeof collectTypeRefs>[0][] = [];
|
|
1817
|
+
for (const m of root.models) {
|
|
1818
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (m.type) <span class="cstat-no" title="statement not covered" >seeds.push(m.type);</span>
|
|
1819
|
+
for (const f of m.fields) seeds.push(f.type);
|
|
1820
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (m.bases) {
|
|
1821
|
+
<span class="cstat-no" title="statement not covered" > for (const b of m.bases) <span class="cstat-no" title="statement not covered" >seeds.push({ kind: 'ref', name: b } as Parameters<typeof collectTypeRefs>[0]);</span></span>
|
|
1822
|
+
}
|
|
1823
|
+
}
|
|
1824
|
+
return collectTransitiveModelRefs(seeds, modelMap);
|
|
1825
|
+
}
|
|
1826
|
+
|
|
1827
|
+
/** Collect every model referenced by an op root's routes/operations (transitive). */
|
|
1828
|
+
function collectOpRootRefs(root: OpRootNode, modelMap: Map<string, ModelNode>): Set<string> {
|
|
1829
|
+
const seeds: Parameters<typeof collectTypeRefs>[0][] = [];
|
|
1830
|
+
for (const route of root.routes) {
|
|
1831
|
+
if (route.params) seeds.push(...paramSourceTypes(route.params));
|
|
1832
|
+
for (const op of route.operations) {
|
|
1833
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (op.query) <span class="cstat-no" title="statement not covered" >seeds.push(...paramSourceTypes(op.query));</span>
|
|
1834
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (op.headers) <span class="cstat-no" title="statement not covered" >seeds.push(...paramSourceTypes(op.headers));</span>
|
|
1835
|
+
if (op.request) {
|
|
1836
|
+
for (const body of op.request.bodies) seeds.push(body.bodyType);
|
|
1837
|
+
}
|
|
1838
|
+
for (const resp of op.responses) {
|
|
1839
|
+
if (resp.bodyType) seeds.push(resp.bodyType);
|
|
1840
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (resp.headers) {
|
|
1841
|
+
<span class="cstat-no" title="statement not covered" > for (const h of resp.headers) <span class="cstat-no" title="statement not covered" >seeds.push(h.type);</span></span>
|
|
1842
|
+
}
|
|
1843
|
+
}
|
|
1844
|
+
}
|
|
1845
|
+
}
|
|
1846
|
+
return collectTransitiveModelRefs(seeds, modelMap);
|
|
1847
|
+
}
|
|
1848
|
+
|
|
1849
|
+
function paramSourceTypes(src: NonNullable<OpRootNode['routes'][number]['params']>): Parameters<typeof collectTypeRefs>[0][] {
|
|
1850
|
+
const out: Parameters<typeof collectTypeRefs>[0][] = [];
|
|
1851
|
+
if (src.kind === 'params') {
|
|
1852
|
+
for (const n of src.nodes) out.push(n.type);
|
|
1853
|
+
} else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (src.kind === 'ref') {</span>
|
|
1854
|
+
<span class="cstat-no" title="statement not covered" > out.push({ kind: 'ref', name: src.name } as Parameters<typeof collectTypeRefs>[0]);</span>
|
|
1855
|
+
} else <span class="cstat-no" title="statement not covered" >if (src.kind === 'type') {</span>
|
|
1856
|
+
<span class="cstat-no" title="statement not covered" > out.push(src.node);</span>
|
|
1857
|
+
}
|
|
1858
|
+
return out;
|
|
1859
|
+
}
|
|
1860
|
+
|
|
1861
|
+
/** Build a sorted, JSON-stable record of (modelName -> outPath) for refs this unit depends on. */
|
|
1862
|
+
function sliceOutPathMap(refs: Set<string>, modelOutPaths: Map<string, string>, modelsWithInput: Set<string>, modelsWithOutput: Set<string>): Record<string, string> {
|
|
1863
|
+
const slice: Record<string, string> = {};
|
|
1864
|
+
for (const ref of [...refs].sort()) {
|
|
1865
|
+
const p = modelOutPaths.get(ref);
|
|
1866
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (p) <span class="cstat-no" title="statement not covered" >slice[ref] = p;</span>
|
|
1867
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (modelsWithInput.has(ref)) {
|
|
1868
|
+
const ip = <span class="cstat-no" title="statement not covered" >modelOutPaths.get(`${ref}Input`);</span>
|
|
1869
|
+
<span class="cstat-no" title="statement not covered" > if (ip) <span class="cstat-no" title="statement not covered" >slice[`${ref}Input`] = ip;</span></span>
|
|
1870
|
+
}
|
|
1871
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (modelsWithOutput.has(ref)) {
|
|
1872
|
+
const op = <span class="cstat-no" title="statement not covered" >modelOutPaths.get(`${ref}Output`);</span>
|
|
1873
|
+
<span class="cstat-no" title="statement not covered" > if (op) <span class="cstat-no" title="statement not covered" >slice[`${ref}Output`] = op;</span></span>
|
|
1874
|
+
}
|
|
1875
|
+
}
|
|
1876
|
+
return slice;
|
|
1877
|
+
}
|
|
1878
|
+
|
|
1879
|
+
/** Slice modelsWithInput/Output to only the names relevant to this unit. */
|
|
1880
|
+
function sliceModelSet(refs: Set<string>, ownNames: Set<string>, set: Set<string>): string[] {
|
|
1881
|
+
const result: string[] = [];
|
|
1882
|
+
for (const name of set) {
|
|
1883
|
+
<span class="cstat-no" title="statement not covered" > if (refs.has(name) || ownNames.has(name)) <span class="cstat-no" title="statement not covered" >result.push(name);</span></span>
|
|
1884
|
+
}
|
|
1885
|
+
return result.sort();
|
|
1886
|
+
}
|
|
1887
|
+
|
|
1888
|
+
// ─── Server sub-generator ──────────────────────────────────────────────────
|
|
1021
1889
|
|
|
1022
|
-
function
|
|
1890
|
+
function collectServerOutput(
|
|
1023
1891
|
config: ServerConfig,
|
|
1024
1892
|
rootDir: string,
|
|
1025
1893
|
inputs: Parameters<NonNullable<ContractKitPlugin['generateTargets']>>[0],
|
|
1026
|
-
|
|
1894
|
+
units: IncrementalUnit[],
|
|
1027
1895
|
): void {
|
|
1028
1896
|
const serverBase = resolve(rootDir, config.baseDir ?? '.');
|
|
1029
1897
|
const modelsWithInput = inputs.modelsWithInput as Set<string>;
|
|
1030
1898
|
const modelsWithOutput = inputs.modelsWithOutput as Set<string>;
|
|
1899
|
+
const modelMap = buildModelMap(inputs.contractRoots);
|
|
1031
1900
|
const allFiles = [...inputs.contractRoots.map(r => r.file), ...inputs.opRoots.map(r => r.file)];
|
|
1032
1901
|
const commonRoot = commonDir(allFiles, rootDir);
|
|
1902
|
+
const subConfigKey = stableSubConfig(config);
|
|
1033
1903
|
|
|
1034
|
-
//
|
|
1035
|
-
//
|
|
1036
|
-
//
|
|
1037
|
-
|
|
1038
|
-
|
|
1904
|
+
// Pre-pass: register all model → outPath. Cross-file refs need to resolve correctly,
|
|
1905
|
+
// which means we need the COMPLETE map (not a slice) — even though each unit's fingerprint
|
|
1906
|
+
// only includes its own slice.
|
|
1907
|
+
const serverModelOutPaths = new Map<string, string>();
|
|
1908
|
+
const typeEntries: { ast: ContractRootNode; typeOutPath: string }[] = [];
|
|
1039
1909
|
if (config.output?.types) {
|
|
1040
|
-
serverModelOutPaths = new Map();
|
|
1041
|
-
|
|
1042
|
-
// Pass 1: register all model → outPath entries before generating content,
|
|
1043
|
-
// so cross-file type refs resolve correctly.
|
|
1044
|
-
const typeEntries: { ast: (typeof inputs.contractRoots)[number]; typeOutPath: string }[] = [];
|
|
1045
1910
|
for (const ast of inputs.contractRoots) {
|
|
1046
1911
|
const typeOutPath = computeContractOutPath(ast.file, serverBase, config.output.types, '.ts', commonRoot, ast.meta);
|
|
1047
1912
|
typeEntries.push({ ast, typeOutPath });
|
|
1048
1913
|
for (const model of ast.models) {
|
|
1049
1914
|
serverModelOutPaths.set(model.name, typeOutPath);
|
|
1050
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (modelsWithInput.has(model.name)) {
|
|
1051
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1052
|
-
}
|
|
1053
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (modelsWithOutput.has(model.name)) {
|
|
1054
|
-
<span class="cstat-no" title="statement not covered" > serverModelOutPaths.set(`${model.name}Output`, typeOutPath);</span>
|
|
1055
|
-
}
|
|
1915
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (modelsWithInput.has(model.name)) <span class="cstat-no" title="statement not covered" >serverModelOutPaths.set(`${model.name}Input`, typeOutPath);</span>
|
|
1916
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (modelsWithOutput.has(model.name)) <span class="cstat-no" title="statement not covered" >serverModelOutPaths.set(`${model.name}Output`, typeOutPath);</span>
|
|
1056
1917
|
}
|
|
1057
1918
|
}
|
|
1919
|
+
}
|
|
1058
1920
|
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1921
|
+
// ── Per-contract-root types unit ──
|
|
1922
|
+
for (const { ast, typeOutPath } of typeEntries) {
|
|
1923
|
+
const refs = collectContractRootRefs(ast, modelMap);
|
|
1924
|
+
const ownNames = new Set(ast.models.map(m => m.name));
|
|
1925
|
+
const fingerprint = hashFingerprint({
|
|
1926
|
+
kind: 'server-types',
|
|
1927
|
+
v: TYPESCRIPT_CODEGEN_VERSION,
|
|
1928
|
+
outPath: typeOutPath,
|
|
1929
|
+
root: ast,
|
|
1930
|
+
outPathSlice: sliceOutPathMap(refs, serverModelOutPaths, modelsWithInput, modelsWithOutput),
|
|
1931
|
+
modelsWithInput: sliceModelSet(refs, ownNames, modelsWithInput),
|
|
1932
|
+
modelsWithOutput: sliceModelSet(refs, ownNames, modelsWithOutput),
|
|
1933
|
+
sub: subConfigKey,
|
|
1934
|
+
});
|
|
1935
|
+
units.push({
|
|
1936
|
+
key: `server-types::${typeOutPath}`,
|
|
1937
|
+
fingerprint,
|
|
1938
|
+
render: () => {
|
|
1939
|
+
const renderCtx = {
|
|
1940
|
+
modelOutPaths: serverModelOutPaths,
|
|
1941
|
+
currentOutPath: typeOutPath,
|
|
1942
|
+
modelsWithInput,
|
|
1943
|
+
modelsWithOutput,
|
|
1944
|
+
};
|
|
1945
|
+
const content = config.zod ? generateContract(ast, renderCtx) : generatePlainTypes(ast, renderCtx);
|
|
1946
|
+
return [{ relativePath: typeOutPath, content }];
|
|
1947
|
+
},
|
|
1948
|
+
});
|
|
1065
1949
|
}
|
|
1066
1950
|
|
|
1067
|
-
// ──
|
|
1951
|
+
// ── Per-op-root router unit ──
|
|
1068
1952
|
for (const ast of inputs.opRoots) {
|
|
1069
1953
|
const outPath = computeOpOutPath(ast.file, serverBase, config.output?.routes, '.router.ts', commonRoot, ast.meta);
|
|
1070
|
-
const
|
|
1071
|
-
|
|
1954
|
+
const refs = collectOpRootRefs(ast, modelMap);
|
|
1955
|
+
const fingerprint = hashFingerprint({
|
|
1956
|
+
kind: 'server-router',
|
|
1957
|
+
v: TYPESCRIPT_CODEGEN_VERSION,
|
|
1072
1958
|
outPath,
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
modelsWithOutput,
|
|
1076
|
-
|
|
1959
|
+
root: ast,
|
|
1960
|
+
// The router imports types from each contract root's type file; the slice covers exactly that.
|
|
1961
|
+
outPathSlice: sliceOutPathMap(refs, serverModelOutPaths, modelsWithInput, modelsWithOutput),
|
|
1962
|
+
modelsWithInput: sliceModelSet(refs, new Set(), modelsWithInput),
|
|
1963
|
+
modelsWithOutput: sliceModelSet(refs, new Set(), modelsWithOutput),
|
|
1964
|
+
servicePathTemplate: config.servicePathTemplate ?? null,
|
|
1965
|
+
includeInternal: config.includeInternal ?? true,
|
|
1966
|
+
sub: subConfigKey,
|
|
1967
|
+
});
|
|
1968
|
+
units.push({
|
|
1969
|
+
key: `server-router::${outPath}`,
|
|
1970
|
+
fingerprint,
|
|
1971
|
+
render: () => [
|
|
1972
|
+
{
|
|
1973
|
+
relativePath: outPath,
|
|
1974
|
+
content: generateOp(ast, {
|
|
1975
|
+
servicePathTemplate: config.servicePathTemplate,
|
|
1976
|
+
outPath,
|
|
1977
|
+
modelOutPaths: serverModelOutPaths,
|
|
1978
|
+
modelsWithInput,
|
|
1979
|
+
modelsWithOutput,
|
|
1980
|
+
includeInternal: config.includeInternal,
|
|
1981
|
+
}),
|
|
1982
|
+
},
|
|
1983
|
+
],
|
|
1077
1984
|
});
|
|
1078
|
-
emitFile(outPath, content);
|
|
1079
1985
|
}
|
|
1080
1986
|
}
|
|
1081
1987
|
|
|
1082
|
-
// ─── SDK
|
|
1988
|
+
// ─── SDK sub-generator ─────────────────────────────────────────────────────
|
|
1083
1989
|
|
|
1084
|
-
function
|
|
1990
|
+
function collectSdkOutput(
|
|
1085
1991
|
config: SdkConfig,
|
|
1086
1992
|
rootDir: string,
|
|
1087
1993
|
inputs: Parameters<NonNullable<ContractKitPlugin['generateTargets']>>[0],
|
|
1088
|
-
|
|
1994
|
+
units: IncrementalUnit[],
|
|
1995
|
+
globalFiles: IncrementalOutputFile[],
|
|
1089
1996
|
): void {
|
|
1090
|
-
const sdkBase = <span class="
|
|
1091
|
-
const sdkName =
|
|
1092
|
-
const sdkOutput =
|
|
1093
|
-
const sdkEntryPath =
|
|
1094
|
-
? join(sdkBase, TEMPLATE_VAR_RE.test(sdkOutput) ? resolveTemplate(sdkOutput, { name: sdkName ?? 'sdk' }) :
|
|
1997
|
+
const sdkBase = config.baseDir<span class="branch-0 cbranch-no" title="branch not covered" > ? resolve(rootDir, config.baseDir) : r</span>ootDir;
|
|
1998
|
+
const sdkName = config.name;
|
|
1999
|
+
const sdkOutput = config.output?.sdk;
|
|
2000
|
+
const sdkEntryPath = sdkOutput
|
|
2001
|
+
? join(sdkBase, TEMPLATE_VAR_RE.test(<span class="branch-0 cbranch-no" title="branch not covered" >sdkOutput) ? resolveTemplate(sdkOutput, { name: sdkName ?? 'sdk' }) : <span class="branch-1 cbranch-no" title="branch not covered" >s</span>dkOutput)</span>
|
|
1095
2002
|
: join(sdkBase, 'sdk.ts');
|
|
1096
|
-
const
|
|
2003
|
+
const sdkOptionsPath = join(dirname(sdkEntryPath), 'sdk-options.ts');
|
|
2004
|
+
const subConfigKey = stableSubConfig(config);
|
|
1097
2005
|
|
|
1098
|
-
const modelsWithInput =
|
|
1099
|
-
const modelsWithOutput =
|
|
1100
|
-
const
|
|
1101
|
-
const <span class="cstat-no" title="statement not covered" >
|
|
2006
|
+
const modelsWithInput = inputs.modelsWithInput as Set<string>;
|
|
2007
|
+
const modelsWithOutput = inputs.modelsWithOutput as Set<string>;
|
|
2008
|
+
const modelMap = buildModelMap(inputs.contractRoots);
|
|
2009
|
+
const allFiles = [...inputs.contractRoots.map(<span class="fstat-no" title="function not covered" >r => <span class="cstat-no" title="statement not covered" >r</span>.file)</span>, ...inputs.opRoots.map(r => r.file)];
|
|
2010
|
+
const ckCommonRoot = commonDir(allFiles, rootDir);
|
|
1102
2011
|
|
|
1103
|
-
|
|
1104
|
-
const sdkTypePaths: string[] =
|
|
1105
|
-
const sdkClientInfos: { outPath: string; className: string; propertyName: string }[] =
|
|
2012
|
+
const sdkModelOutPaths = new Map<string, string>();
|
|
2013
|
+
const sdkTypePaths: string[] = [];
|
|
2014
|
+
const sdkClientInfos: { outPath: string; className: string; propertyName: string }[] = [];
|
|
1106
2015
|
|
|
1107
|
-
// ── SDK
|
|
1108
|
-
|
|
1109
|
-
<span class="
|
|
2016
|
+
// ── Pre-pass: SDK type files ──
|
|
2017
|
+
const sdkContractEntries: { ast: ContractRootNode; typeOutPath: string }[] = [];
|
|
2018
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (config.output?.types) {
|
|
1110
2019
|
const <span class="cstat-no" title="statement not covered" >publicTypes = computePubliclyReachableTypes(inputs.opRoots, inputs.contractRoots, modelsWithInput, modelsWithOutput);</span>
|
|
1111
|
-
|
|
1112
|
-
const sdkContractEntries: { ast: (typeof inputs.contractRoots)[number]; typeOutPath: string }[] = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
1113
2020
|
<span class="cstat-no" title="statement not covered" > for (const ast of inputs.contractRoots) {</span>
|
|
1114
2021
|
const <span class="cstat-no" title="statement not covered" >typeOutPath = computeSdkTypeOutPath(ast.file, sdkBase, config.output.types, ckCommonRoot, ast.meta);</span>
|
|
1115
2022
|
<span class="cstat-no" title="statement not covered" > if (!typeOutPath) <span class="cstat-no" title="statement not covered" >continue;</span></span>
|
|
@@ -1122,116 +2029,263 @@ function <span class="fstat-no" title="function not covered" >runSdkGeneration(<
|
|
|
1122
2029
|
<span class="cstat-no" title="statement not covered" > if (modelsWithOutput.has(model.name)) <span class="cstat-no" title="statement not covered" >sdkModelOutPaths.set(`${model.name}Output`, typeOutPath);</span></span>
|
|
1123
2030
|
}
|
|
1124
2031
|
}
|
|
2032
|
+
}
|
|
1125
2033
|
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1129
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
2034
|
+
// ── SDK type units ──
|
|
2035
|
+
for (const { ast, typeOutPath } of sdkContractEntries) {
|
|
2036
|
+
const refs = <span class="cstat-no" title="statement not covered" >collectContractRootRefs(ast, modelMap);</span>
|
|
2037
|
+
const ownNames = <span class="cstat-no" title="statement not covered" >new Set(ast.models.map(<span class="fstat-no" title="function not covered" >m => <span class="cstat-no" title="statement not covered" >m</span>.name)</span>);</span>
|
|
2038
|
+
const <span class="cstat-no" title="statement not covered" >fingerprint = hashFingerprint({</span>
|
|
2039
|
+
kind: 'sdk-types',
|
|
2040
|
+
v: TYPESCRIPT_CODEGEN_VERSION,
|
|
2041
|
+
outPath: typeOutPath,
|
|
2042
|
+
root: ast,
|
|
2043
|
+
outPathSlice: sliceOutPathMap(refs, sdkModelOutPaths, modelsWithInput, modelsWithOutput),
|
|
2044
|
+
modelsWithInput: sliceModelSet(refs, ownNames, modelsWithInput),
|
|
2045
|
+
modelsWithOutput: sliceModelSet(refs, ownNames, modelsWithOutput),
|
|
2046
|
+
sdkOptionsPath,
|
|
2047
|
+
sub: subConfigKey,
|
|
2048
|
+
});
|
|
2049
|
+
<span class="cstat-no" title="statement not covered" > units.push({</span>
|
|
2050
|
+
key: `sdk-types::${typeOutPath}`,
|
|
2051
|
+
fingerprint,
|
|
2052
|
+
render: <span class="fstat-no" title="function not covered" >() => {</span>
|
|
2053
|
+
let content: string;
|
|
2054
|
+
<span class="cstat-no" title="statement not covered" > if (config.zod) {</span>
|
|
2055
|
+
<span class="cstat-no" title="statement not covered" > content = generateContract(ast, {</span>
|
|
2056
|
+
modelOutPaths: sdkModelOutPaths,
|
|
2057
|
+
currentOutPath: typeOutPath,
|
|
2058
|
+
modelsWithInput,
|
|
2059
|
+
modelsWithOutput,
|
|
2060
|
+
});
|
|
2061
|
+
} else {
|
|
2062
|
+
let <span class="cstat-no" title="statement not covered" >rel = relative(dirname(typeOutPath), sdkOptionsPath).replace(/\.ts$/, '.js');</span>
|
|
2063
|
+
<span class="cstat-no" title="statement not covered" > if (!rel.startsWith('.')) <span class="cstat-no" title="statement not covered" >rel = './' + rel;</span></span>
|
|
2064
|
+
<span class="cstat-no" title="statement not covered" > content = generatePlainTypes(ast, {</span>
|
|
2065
|
+
modelOutPaths: sdkModelOutPaths,
|
|
2066
|
+
currentOutPath: typeOutPath,
|
|
2067
|
+
modelsWithInput,
|
|
2068
|
+
modelsWithOutput,
|
|
2069
|
+
jsonValueImportPath: rel,
|
|
2070
|
+
});
|
|
2071
|
+
}
|
|
2072
|
+
<span class="cstat-no" title="statement not covered" > return [{ relativePath: typeOutPath, content }];</span>
|
|
2073
|
+
},
|
|
2074
|
+
});
|
|
2075
|
+
}
|
|
2076
|
+
|
|
2077
|
+
// ── Bucket op roots by area/subarea ──
|
|
2078
|
+
interface AreaBucket {
|
|
2079
|
+
leaves: { ast: OpRootNode; outPath: string; subarea: string }[];
|
|
2080
|
+
inlineRoots: OpRootNode[];
|
|
2081
|
+
}
|
|
2082
|
+
const areaBuckets = new Map<string, AreaBucket>();
|
|
2083
|
+
const topLevelEntries: { ast: OpRootNode; outPath: string }[] = [];
|
|
2084
|
+
|
|
2085
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (config.output?.clients) {
|
|
2086
|
+
for (const ast of inputs.opRoots) {
|
|
2087
|
+
const sdkOutPath = computeSdkOutPath(ast.file, sdkBase, config.output.clients, ckCommonRoot, ast.meta);
|
|
2088
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!sdkOutPath || !hasPublicOperations(ast, config.includeInternal)) <span class="cstat-no" title="statement not covered" >continue;</span>
|
|
2089
|
+
const { area, subarea } = getAreaSubarea(ast);
|
|
2090
|
+
if (area && subarea) {
|
|
2091
|
+
const bucket = areaBuckets.get(area) ?? { leaves: [], inlineRoots: [] };
|
|
2092
|
+
bucket.leaves.push({ ast, outPath: sdkOutPath, subarea });
|
|
2093
|
+
areaBuckets.set(area, bucket);
|
|
2094
|
+
} else if (area) {
|
|
2095
|
+
const bucket = areaBuckets.get(area) ?? { leaves: [], inlineRoots: [] };
|
|
2096
|
+
bucket.inlineRoots.push(ast);
|
|
2097
|
+
areaBuckets.set(area, bucket);
|
|
1135
2098
|
} else {
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
2099
|
+
topLevelEntries.push({ ast, outPath: sdkOutPath });
|
|
2100
|
+
}
|
|
2101
|
+
}
|
|
2102
|
+
|
|
2103
|
+
// ── Per-leaf-client (area+subarea) units ──
|
|
2104
|
+
for (const [area, bucket] of areaBuckets.entries()) {
|
|
2105
|
+
for (const leaf of bucket.leaves) {
|
|
2106
|
+
const className = deriveSubareaClientClassName(area, leaf.subarea);
|
|
2107
|
+
sdkClientInfos.push({ outPath: leaf.outPath, className, propertyName: deriveSubareaPropertyName(leaf.subarea) });
|
|
2108
|
+
const refs = collectOpRootRefs(leaf.ast, modelMap);
|
|
2109
|
+
const fingerprint = hashFingerprint({
|
|
2110
|
+
kind: 'sdk-leaf-client',
|
|
2111
|
+
v: TYPESCRIPT_CODEGEN_VERSION,
|
|
2112
|
+
outPath: leaf.outPath,
|
|
2113
|
+
root: leaf.ast,
|
|
2114
|
+
outPathSlice: sliceOutPathMap(refs, sdkModelOutPaths, modelsWithInput, modelsWithOutput),
|
|
2115
|
+
modelsWithInput: sliceModelSet(refs, new Set(), modelsWithInput),
|
|
2116
|
+
modelsWithOutput: sliceModelSet(refs, new Set(), modelsWithOutput),
|
|
2117
|
+
sdkOptionsPath,
|
|
2118
|
+
className,
|
|
2119
|
+
includeInternal: config.includeInternal ?? false,
|
|
2120
|
+
sub: subConfigKey,
|
|
2121
|
+
});
|
|
2122
|
+
units.push({
|
|
2123
|
+
key: `sdk-leaf-client::${leaf.outPath}`,
|
|
2124
|
+
fingerprint,
|
|
2125
|
+
render: () => [
|
|
2126
|
+
{
|
|
2127
|
+
relativePath: leaf.outPath,
|
|
2128
|
+
content: generateSdk(leaf.ast, {
|
|
2129
|
+
typeImportPathTemplate: undefined,
|
|
2130
|
+
outPath: leaf.outPath,
|
|
2131
|
+
modelOutPaths: sdkModelOutPaths,
|
|
2132
|
+
sdkOptionsPath,
|
|
2133
|
+
modelsWithInput,
|
|
2134
|
+
modelsWithOutput,
|
|
2135
|
+
includeInternal: config.includeInternal,
|
|
2136
|
+
clientClassName: className,
|
|
2137
|
+
}),
|
|
2138
|
+
},
|
|
2139
|
+
],
|
|
1144
2140
|
});
|
|
1145
2141
|
}
|
|
1146
|
-
<span class="cstat-no" title="statement not covered" > emitFile(typeOutPath, content);</span>
|
|
1147
2142
|
}
|
|
1148
|
-
}
|
|
1149
2143
|
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
2144
|
+
// ── Top-level (no area) client units ──
|
|
2145
|
+
for (const { ast, outPath } of topLevelEntries) {
|
|
2146
|
+
const className = deriveClientClassName(ast.file);
|
|
2147
|
+
sdkClientInfos.push({ outPath, className, propertyName: deriveClientPropertyName(ast.file) });
|
|
2148
|
+
const refs = collectOpRootRefs(ast, modelMap);
|
|
2149
|
+
const fingerprint = hashFingerprint({
|
|
2150
|
+
kind: 'sdk-top-client',
|
|
2151
|
+
v: TYPESCRIPT_CODEGEN_VERSION,
|
|
2152
|
+
outPath,
|
|
2153
|
+
root: ast,
|
|
2154
|
+
outPathSlice: sliceOutPathMap(refs, sdkModelOutPaths, modelsWithInput, modelsWithOutput),
|
|
2155
|
+
modelsWithInput: sliceModelSet(refs, new Set(), modelsWithInput),
|
|
2156
|
+
modelsWithOutput: sliceModelSet(refs, new Set(), modelsWithOutput),
|
|
2157
|
+
sdkOptionsPath,
|
|
2158
|
+
includeInternal: config.includeInternal ?? false,
|
|
2159
|
+
sub: subConfigKey,
|
|
2160
|
+
});
|
|
2161
|
+
units.push({
|
|
2162
|
+
key: `sdk-top-client::${outPath}`,
|
|
2163
|
+
fingerprint,
|
|
2164
|
+
render: () => [
|
|
2165
|
+
{
|
|
2166
|
+
relativePath: outPath,
|
|
2167
|
+
content: generateSdk(ast, {
|
|
2168
|
+
typeImportPathTemplate: undefined,
|
|
2169
|
+
outPath,
|
|
2170
|
+
modelOutPaths: sdkModelOutPaths,
|
|
2171
|
+
sdkOptionsPath,
|
|
2172
|
+
modelsWithInput,
|
|
2173
|
+
modelsWithOutput,
|
|
2174
|
+
includeInternal: config.includeInternal,
|
|
2175
|
+
}),
|
|
2176
|
+
},
|
|
2177
|
+
],
|
|
1159
2178
|
});
|
|
1160
|
-
<span class="cstat-no" title="statement not covered" > emitFile(</span>
|
|
1161
|
-
sdkOutPath,
|
|
1162
|
-
generateSdk(ast, {
|
|
1163
|
-
typeImportPathTemplate: undefined,
|
|
1164
|
-
outPath: sdkOutPath,
|
|
1165
|
-
modelOutPaths: sdkModelOutPaths,
|
|
1166
|
-
sdkOptionsPath,
|
|
1167
|
-
modelsWithInput,
|
|
1168
|
-
modelsWithOutput,
|
|
1169
|
-
includeInternal: config.includeInternal,
|
|
1170
|
-
}),
|
|
1171
|
-
);
|
|
1172
2179
|
}
|
|
1173
2180
|
}
|
|
1174
2181
|
|
|
1175
|
-
// ── sdk-options
|
|
1176
|
-
|
|
2182
|
+
// ── Global files: sdk-options, aggregator, barrels, root index ──
|
|
2183
|
+
// The aggregator inlines area-only op roots, so its content depends on each inline root's
|
|
2184
|
+
// full AST. Caching it gains little — the codegen is fast and any inline-root change rebuilds
|
|
2185
|
+
// the file anyway. Same for barrels (one line per imported file). Always regenerate.
|
|
2186
|
+
globalFiles.push({ relativePath: sdkOptionsPath, content: generateSdkOptions() });
|
|
1177
2187
|
|
|
1178
|
-
|
|
1179
|
-
<span class="
|
|
1180
|
-
const
|
|
1181
|
-
const
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
<span class="
|
|
1185
|
-
});
|
|
1186
|
-
const <span class="cstat-no" title="statement not covered" >sdkOptionsRel = relative(sdkEntryDir, sdkOptionsPath).replace(/\.ts$/, '.js');</span>
|
|
1187
|
-
const sdkClassName = <span class="cstat-no" title="statement not covered" >sdkName</span>
|
|
1188
|
-
? sdkName
|
|
2188
|
+
const hasAnything = sdkClientInfos.length > 0 || areaBuckets.size > 0;
|
|
2189
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (hasAnything) {
|
|
2190
|
+
const sdkEntryDir = dirname(sdkEntryPath);
|
|
2191
|
+
const sdkOptionsRel = relative(sdkEntryDir, sdkOptionsPath).replace(/\.ts$/, '.js');
|
|
2192
|
+
const sdkOptionsImportPath = sdkOptionsRel.startsWith('.') ? <span class="branch-0 cbranch-no" title="branch not covered" >sdkOptionsRel : '</span>./' + sdkOptionsRel;
|
|
2193
|
+
const sdkClassName = sdkName
|
|
2194
|
+
? <span class="branch-0 cbranch-no" title="branch not covered" >sdkName</span>
|
|
1189
2195
|
.split(/[-._\s]+/)
|
|
1190
2196
|
.map(<span class="fstat-no" title="function not covered" >s => <span class="cstat-no" title="statement not covered" >s</span>.charAt(0).toUpperCase() + s.slice(1))</span>
|
|
1191
2197
|
.join('') + 'Sdk'
|
|
1192
2198
|
: 'Sdk';
|
|
1193
|
-
<span class="cstat-no" title="statement not covered" > emitFile(sdkEntryPath, generateSdkAggregator(clients, sdkOptionsRel.startsWith('.') ? sdkOptionsRel : './' + sdkOptionsRel, sdkClassName));</span>
|
|
1194
|
-
}
|
|
1195
2199
|
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
2200
|
+
const toClientImport = (info: { outPath: string; className: string; propertyName: string }): SdkClientInfo => {
|
|
2201
|
+
let rel = relative(sdkEntryDir, info.outPath).replace(/\.ts$/, '.js');
|
|
2202
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (!rel.startsWith('.')) rel = './' + rel;
|
|
2203
|
+
return { className: info.className, propertyName: info.propertyName, importPath: rel };
|
|
2204
|
+
};
|
|
2205
|
+
|
|
2206
|
+
const topLevelClients: SdkClientInfo[] = topLevelEntries.map(e => ({
|
|
2207
|
+
className: deriveClientClassName(e.ast.file),
|
|
2208
|
+
propertyName: deriveClientPropertyName(e.ast.file),
|
|
2209
|
+
importPath: (() => {
|
|
2210
|
+
const rel = relative(sdkEntryDir, e.outPath).replace(/\.ts$/, '.js');
|
|
2211
|
+
return rel.startsWith('.') ? <span class="branch-0 cbranch-no" title="branch not covered" >rel : '</span>./' + rel;
|
|
2212
|
+
})(),
|
|
2213
|
+
}));
|
|
1200
2214
|
|
|
1201
|
-
|
|
1202
|
-
<span class="
|
|
1203
|
-
|
|
2215
|
+
const areas: SdkAreaInfo[] = [...areaBuckets.entries()]
|
|
2216
|
+
.sort(<span class="fstat-no" title="function not covered" >([</span>a], [b]) => <span class="cstat-no" title="statement not covered" >a.localeCompare(b))</span>
|
|
2217
|
+
.map(([area, bucket]) => ({
|
|
2218
|
+
area,
|
|
2219
|
+
inlineFiles: bucket.inlineRoots.map(root => ({
|
|
2220
|
+
root,
|
|
2221
|
+
codegenOptions: {
|
|
2222
|
+
typeImportPathTemplate: undefined,
|
|
2223
|
+
outPath: sdkEntryPath,
|
|
2224
|
+
modelOutPaths: sdkModelOutPaths,
|
|
2225
|
+
sdkOptionsPath,
|
|
2226
|
+
modelsWithInput,
|
|
2227
|
+
modelsWithOutput,
|
|
2228
|
+
includeInternal: config.includeInternal,
|
|
2229
|
+
},
|
|
2230
|
+
})),
|
|
2231
|
+
subareaClients: bucket.leaves
|
|
2232
|
+
.sort(<span class="fstat-no" title="function not covered" >(a</span>, b) => <span class="cstat-no" title="statement not covered" >a.subarea.localeCompare(b.subarea))</span>
|
|
2233
|
+
.map(l => ({
|
|
2234
|
+
propertyName: deriveSubareaPropertyName(l.subarea),
|
|
2235
|
+
client: toClientImport({
|
|
2236
|
+
outPath: l.outPath,
|
|
2237
|
+
className: deriveSubareaClientClassName(area, l.subarea),
|
|
2238
|
+
propertyName: deriveSubareaPropertyName(l.subarea),
|
|
2239
|
+
}),
|
|
2240
|
+
})),
|
|
2241
|
+
}));
|
|
2242
|
+
|
|
2243
|
+
globalFiles.push({
|
|
2244
|
+
relativePath: sdkEntryPath,
|
|
2245
|
+
content: generateSdkAggregator({ topLevelClients, areas, sdkOptionsImportPath, sdkClassName }),
|
|
2246
|
+
});
|
|
1204
2247
|
}
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
<span class="cstat-no" title="statement not covered" >
|
|
2248
|
+
|
|
2249
|
+
const sdkSrcDir = dirname(sdkEntryPath);
|
|
2250
|
+
const sdkTypeBarrels = generateBarrelFiles(sdkTypePaths);
|
|
2251
|
+
for (const barrel of sdkTypeBarrels) <span class="cstat-no" title="statement not covered" >globalFiles.push({ relativePath: barrel.outPath, content: barrel.content });</span>
|
|
2252
|
+
|
|
2253
|
+
const rootExports: string[] = [`export * from './${basename(sdkOptionsPath).replace(/\.ts$/, '.js')}';`];
|
|
2254
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (hasAnything) rootExports.push(`export * from './${basename(sdkEntryPath).replace(/\.ts$/, '.js')}';`);
|
|
2255
|
+
for (const c of sdkClientInfos) {
|
|
2256
|
+
let rel = relative(sdkSrcDir, c.outPath).replace(/\.ts$/, '.js');
|
|
2257
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (!rel.startsWith('.')) rel = './' + rel;
|
|
2258
|
+
rootExports.push(`export * from '${rel}';`);
|
|
1209
2259
|
}
|
|
1210
|
-
|
|
2260
|
+
for (const barrel of sdkTypeBarrels) {
|
|
1211
2261
|
let <span class="cstat-no" title="statement not covered" >rel = relative(sdkSrcDir, barrel.outPath).replace(/\.ts$/, '.js');</span>
|
|
1212
2262
|
<span class="cstat-no" title="statement not covered" > if (!rel.startsWith('.')) <span class="cstat-no" title="statement not covered" >rel = './' + rel;</span></span>
|
|
1213
2263
|
<span class="cstat-no" title="statement not covered" > rootExports.push(`export * from '${rel}';`);</span>
|
|
1214
2264
|
}
|
|
1215
|
-
|
|
2265
|
+
globalFiles.push({
|
|
2266
|
+
relativePath: join(sdkSrcDir, 'index.ts'),
|
|
2267
|
+
content: `// Auto-generated barrel file\n${rootExports.sort().join('\n')}\n`,
|
|
2268
|
+
});
|
|
1216
2269
|
}
|
|
1217
2270
|
|
|
1218
|
-
// ─── Zod
|
|
2271
|
+
// ─── Zod sub-generator ─────────────────────────────────────────────────────
|
|
1219
2272
|
|
|
1220
|
-
function <span class="fstat-no" title="function not covered" >
|
|
2273
|
+
function <span class="fstat-no" title="function not covered" >collectZodOutput(</span>
|
|
1221
2274
|
config: ZodConfig,
|
|
1222
2275
|
rootDir: string,
|
|
1223
2276
|
inputs: Parameters<NonNullable<ContractKitPlugin['generateTargets']>>[0],
|
|
1224
|
-
|
|
2277
|
+
units: IncrementalUnit[],
|
|
1225
2278
|
): void {
|
|
1226
2279
|
const <span class="cstat-no" title="statement not covered" >zodBase = resolve(rootDir, config.baseDir ?? '.');</span>
|
|
1227
2280
|
const allFiles = <span class="cstat-no" title="statement not covered" >[...inputs.contractRoots.map(<span class="fstat-no" title="function not covered" >r => <span class="cstat-no" title="statement not covered" >r</span>.file)</span>, ...inputs.opRoots.map(<span class="fstat-no" title="function not covered" >r => <span class="cstat-no" title="statement not covered" >r</span>.file)</span>];</span>
|
|
1228
2281
|
const <span class="cstat-no" title="statement not covered" >commonRoot = commonDir(allFiles, rootDir);</span>
|
|
1229
2282
|
const modelsWithInput = <span class="cstat-no" title="statement not covered" >inputs.modelsWithInput </span>as Set<string>;
|
|
1230
2283
|
const modelsWithOutput = <span class="cstat-no" title="statement not covered" >inputs.modelsWithOutput </span>as Set<string>;
|
|
2284
|
+
const modelMap = <span class="cstat-no" title="statement not covered" >buildModelMap(inputs.contractRoots);</span>
|
|
2285
|
+
const subConfigKey = <span class="cstat-no" title="statement not covered" >stableSubConfig(config);</span>
|
|
1231
2286
|
|
|
1232
|
-
// Pre-pass: register all model → outPath before generating, so cross-file imports resolve.
|
|
1233
2287
|
const modelOutPaths = <span class="cstat-no" title="statement not covered" >new Map<string, string>();</span>
|
|
1234
|
-
const entries: { ast:
|
|
2288
|
+
const entries: { ast: ContractRootNode; outPath: string }[] = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
1235
2289
|
<span class="cstat-no" title="statement not covered" > for (const ast of inputs.contractRoots) {</span>
|
|
1236
2290
|
const <span class="cstat-no" title="statement not covered" >outPath = computeContractOutPath(ast.file, zodBase, config.output, '.schema.ts', commonRoot, ast.meta);</span>
|
|
1237
2291
|
<span class="cstat-no" title="statement not covered" > entries.push({ ast, outPath });</span>
|
|
@@ -1243,33 +2297,49 @@ function <span class="fstat-no" title="function not covered" >runZodGeneration(<
|
|
|
1243
2297
|
}
|
|
1244
2298
|
|
|
1245
2299
|
<span class="cstat-no" title="statement not covered" > for (const { ast, outPath } of entries) {</span>
|
|
1246
|
-
const <span class="cstat-no" title="statement not covered" >
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
2300
|
+
const refs = <span class="cstat-no" title="statement not covered" >collectContractRootRefs(ast, modelMap);</span>
|
|
2301
|
+
const ownNames = <span class="cstat-no" title="statement not covered" >new Set(ast.models.map(<span class="fstat-no" title="function not covered" >m => <span class="cstat-no" title="statement not covered" >m</span>.name)</span>);</span>
|
|
2302
|
+
const <span class="cstat-no" title="statement not covered" >fingerprint = hashFingerprint({</span>
|
|
2303
|
+
kind: 'zod',
|
|
2304
|
+
v: TYPESCRIPT_CODEGEN_VERSION,
|
|
2305
|
+
outPath,
|
|
2306
|
+
root: ast,
|
|
2307
|
+
outPathSlice: sliceOutPathMap(refs, modelOutPaths, modelsWithInput, modelsWithOutput),
|
|
2308
|
+
modelsWithInput: sliceModelSet(refs, ownNames, modelsWithInput),
|
|
2309
|
+
modelsWithOutput: sliceModelSet(refs, ownNames, modelsWithOutput),
|
|
2310
|
+
sub: subConfigKey,
|
|
2311
|
+
});
|
|
2312
|
+
<span class="cstat-no" title="statement not covered" > units.push({</span>
|
|
2313
|
+
key: `zod::${outPath}`,
|
|
2314
|
+
fingerprint,
|
|
2315
|
+
render: <span class="fstat-no" title="function not covered" >() => <span class="cstat-no" title="statement not covered" >[</span></span>
|
|
2316
|
+
{
|
|
2317
|
+
relativePath: outPath,
|
|
2318
|
+
content: generateContract(ast, { modelOutPaths, currentOutPath: outPath, modelsWithInput, modelsWithOutput }),
|
|
2319
|
+
},
|
|
2320
|
+
],
|
|
1251
2321
|
});
|
|
1252
|
-
<span class="cstat-no" title="statement not covered" > emitFile(outPath, content);</span>
|
|
1253
2322
|
}
|
|
1254
2323
|
}
|
|
1255
2324
|
|
|
1256
|
-
// ───
|
|
2325
|
+
// ─── Plain types sub-generator ─────────────────────────────────────────────
|
|
1257
2326
|
|
|
1258
|
-
function <span class="fstat-no" title="function not covered" >
|
|
2327
|
+
function <span class="fstat-no" title="function not covered" >collectTypesOutput(</span>
|
|
1259
2328
|
config: TypesConfig,
|
|
1260
2329
|
rootDir: string,
|
|
1261
2330
|
inputs: Parameters<NonNullable<ContractKitPlugin['generateTargets']>>[0],
|
|
1262
|
-
|
|
2331
|
+
units: IncrementalUnit[],
|
|
1263
2332
|
): void {
|
|
1264
2333
|
const <span class="cstat-no" title="statement not covered" >typesBase = resolve(rootDir, config.baseDir ?? '.');</span>
|
|
1265
2334
|
const allFiles = <span class="cstat-no" title="statement not covered" >[...inputs.contractRoots.map(<span class="fstat-no" title="function not covered" >r => <span class="cstat-no" title="statement not covered" >r</span>.file)</span>, ...inputs.opRoots.map(<span class="fstat-no" title="function not covered" >r => <span class="cstat-no" title="statement not covered" >r</span>.file)</span>];</span>
|
|
1266
2335
|
const <span class="cstat-no" title="statement not covered" >commonRoot = commonDir(allFiles, rootDir);</span>
|
|
1267
2336
|
const modelsWithInput = <span class="cstat-no" title="statement not covered" >inputs.modelsWithInput </span>as Set<string>;
|
|
1268
2337
|
const modelsWithOutput = <span class="cstat-no" title="statement not covered" >inputs.modelsWithOutput </span>as Set<string>;
|
|
2338
|
+
const modelMap = <span class="cstat-no" title="statement not covered" >buildModelMap(inputs.contractRoots);</span>
|
|
2339
|
+
const subConfigKey = <span class="cstat-no" title="statement not covered" >stableSubConfig(config);</span>
|
|
1269
2340
|
|
|
1270
|
-
// Pre-pass: register all model → outPath before generating.
|
|
1271
2341
|
const modelOutPaths = <span class="cstat-no" title="statement not covered" >new Map<string, string>();</span>
|
|
1272
|
-
const entries: { ast:
|
|
2342
|
+
const entries: { ast: ContractRootNode; outPath: string }[] = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
1273
2343
|
<span class="cstat-no" title="statement not covered" > for (const ast of inputs.contractRoots) {</span>
|
|
1274
2344
|
const <span class="cstat-no" title="statement not covered" >outPath = computeContractOutPath(ast.file, typesBase, config.output, '.types.ts', commonRoot, ast.meta);</span>
|
|
1275
2345
|
<span class="cstat-no" title="statement not covered" > entries.push({ ast, outPath });</span>
|
|
@@ -1281,62 +2351,72 @@ function <span class="fstat-no" title="function not covered" >runTypesGeneration
|
|
|
1281
2351
|
}
|
|
1282
2352
|
|
|
1283
2353
|
<span class="cstat-no" title="statement not covered" > for (const { ast, outPath } of entries) {</span>
|
|
1284
|
-
const <span class="cstat-no" title="statement not covered" >
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
2354
|
+
const refs = <span class="cstat-no" title="statement not covered" >collectContractRootRefs(ast, modelMap);</span>
|
|
2355
|
+
const ownNames = <span class="cstat-no" title="statement not covered" >new Set(ast.models.map(<span class="fstat-no" title="function not covered" >m => <span class="cstat-no" title="statement not covered" >m</span>.name)</span>);</span>
|
|
2356
|
+
const <span class="cstat-no" title="statement not covered" >fingerprint = hashFingerprint({</span>
|
|
2357
|
+
kind: 'plain-types',
|
|
2358
|
+
v: TYPESCRIPT_CODEGEN_VERSION,
|
|
2359
|
+
outPath,
|
|
2360
|
+
root: ast,
|
|
2361
|
+
outPathSlice: sliceOutPathMap(refs, modelOutPaths, modelsWithInput, modelsWithOutput),
|
|
2362
|
+
modelsWithInput: sliceModelSet(refs, ownNames, modelsWithInput),
|
|
2363
|
+
modelsWithOutput: sliceModelSet(refs, ownNames, modelsWithOutput),
|
|
2364
|
+
sub: subConfigKey,
|
|
2365
|
+
});
|
|
2366
|
+
<span class="cstat-no" title="statement not covered" > units.push({</span>
|
|
2367
|
+
key: `plain-types::${outPath}`,
|
|
2368
|
+
fingerprint,
|
|
2369
|
+
render: <span class="fstat-no" title="function not covered" >() => <span class="cstat-no" title="statement not covered" >[</span></span>
|
|
2370
|
+
{
|
|
2371
|
+
relativePath: outPath,
|
|
2372
|
+
content: generatePlainTypes(ast, { modelOutPaths, currentOutPath: outPath, modelsWithInput, modelsWithOutput }),
|
|
2373
|
+
},
|
|
2374
|
+
],
|
|
1289
2375
|
});
|
|
1290
|
-
<span class="cstat-no" title="statement not covered" > emitFile(outPath, content);</span>
|
|
1291
2376
|
}
|
|
1292
2377
|
}
|
|
1293
2378
|
|
|
1294
|
-
// ───
|
|
2379
|
+
// ─── Manifest IO + cleanup ─────────────────────────────────────────────────
|
|
1295
2380
|
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
2381
|
+
function readManifest(manifestPath: string): IncrementalManifest {
|
|
2382
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (!existsSync(manifestPath)) return emptyIncrementalManifest(TYPESCRIPT_CODEGEN_VERSION);
|
|
2383
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2384
|
+
<span class="cstat-no" title="statement not covered" > return parseIncrementalManifest(readFileSync(manifestPath, 'utf-8'));</span>
|
|
2385
|
+
} catch {
|
|
2386
|
+
<span class="cstat-no" title="statement not covered" > return emptyIncrementalManifest(TYPESCRIPT_CODEGEN_VERSION);</span>
|
|
2387
|
+
}
|
|
2388
|
+
}
|
|
1301
2389
|
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
<span class="cstat-no" title="statement not covered" > runZodGeneration(config.zod, ctx.rootDir, inputs, ctx.emitFile.bind(ctx));</span>
|
|
2390
|
+
function deleteStalePaths(absPaths: string[]): void {
|
|
2391
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (absPaths.length === 0) return;
|
|
2392
|
+
const removedDirs = <span class="cstat-no" title="statement not covered" >new Set<string>();</span>
|
|
2393
|
+
<span class="cstat-no" title="statement not covered" > for (const abs of absPaths) {</span>
|
|
2394
|
+
<span class="cstat-no" title="statement not covered" > if (existsSync(abs)) {</span>
|
|
2395
|
+
<span class="cstat-no" title="statement not covered" > rmSync(abs, { force: true });</span>
|
|
2396
|
+
<span class="cstat-no" title="statement not covered" > removedDirs.add(dirname(abs));</span>
|
|
1310
2397
|
}
|
|
1311
|
-
|
|
1312
|
-
|
|
2398
|
+
}
|
|
2399
|
+
// Walk up affected dirs and remove if empty. Bounded — stops at filesystem root or first non-empty dir.
|
|
2400
|
+
<span class="cstat-no" title="statement not covered" > for (const dir of removedDirs) {</span>
|
|
2401
|
+
let current = <span class="cstat-no" title="statement not covered" >dir;</span>
|
|
2402
|
+
<span class="cstat-no" title="statement not covered" > while (current.length > 1) {</span>
|
|
2403
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2404
|
+
<span class="cstat-no" title="statement not covered" > if (readdirSync(current).length === 0) {</span>
|
|
2405
|
+
<span class="cstat-no" title="statement not covered" > rmdirSync(current);</span>
|
|
2406
|
+
<span class="cstat-no" title="statement not covered" > current = dirname(current);</span>
|
|
2407
|
+
} else {
|
|
2408
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
2409
|
+
}
|
|
2410
|
+
} catch {
|
|
2411
|
+
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
2412
|
+
}
|
|
1313
2413
|
}
|
|
1314
|
-
}
|
|
1315
|
-
}
|
|
1316
|
-
|
|
1317
|
-
export default plugin;
|
|
1318
|
-
|
|
1319
|
-
// ─── Factory: for programmatic use with explicit config ────────────────────
|
|
2414
|
+
}
|
|
2415
|
+
}
|
|
1320
2416
|
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
cacheKey: `typescript:${JSON.stringify(config)}`,
|
|
1325
|
-
async generateTargets(inputs, ctx) {
|
|
1326
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (config.server) {
|
|
1327
|
-
runServerGeneration(config.server, rootDir, inputs, ctx.emitFile.bind(ctx));
|
|
1328
|
-
}
|
|
1329
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (config.sdk) {
|
|
1330
|
-
<span class="cstat-no" title="statement not covered" > runSdkGeneration(config.sdk, rootDir, inputs, ctx.emitFile.bind(ctx));</span>
|
|
1331
|
-
}
|
|
1332
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (config.zod) {
|
|
1333
|
-
<span class="cstat-no" title="statement not covered" > runZodGeneration(config.zod, rootDir, inputs, ctx.emitFile.bind(ctx));</span>
|
|
1334
|
-
}
|
|
1335
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (config.types) {
|
|
1336
|
-
<span class="cstat-no" title="statement not covered" > runTypesGeneration(config.types, rootDir, inputs, ctx.emitFile.bind(ctx));</span>
|
|
1337
|
-
}
|
|
1338
|
-
},
|
|
1339
|
-
};
|
|
2417
|
+
/** Stringify a sub-config so it can participate in fingerprints. JSON.stringify gives stable output for typical config shapes. */
|
|
2418
|
+
function stableSubConfig(config: unknown): string {
|
|
2419
|
+
return JSON.stringify(config ?? <span class="branch-1 cbranch-no" title="branch not covered" >null);</span>
|
|
1340
2420
|
}
|
|
1341
2421
|
</pre></td></tr></table></pre>
|
|
1342
2422
|
|
|
@@ -1345,7 +2425,7 @@ export function createTypescriptPlugin(config: TypescriptPluginConfig, rootDir:
|
|
|
1345
2425
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
1346
2426
|
Code coverage generated by
|
|
1347
2427
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1348
|
-
at 2026-05-
|
|
2428
|
+
at 2026-05-07T11:09:15.235Z
|
|
1349
2429
|
</div>
|
|
1350
2430
|
<script src="../prettify.js"></script>
|
|
1351
2431
|
<script>
|