@@ -515,4 +515,221 @@ describe('visitWithTypeInfo', () => {
515
515
[ 'leave' , 'SelectionSet' , null , 'Human' , 'Human' ] ,
516
516
] ) ;
517
517
} ) ;
518
+
519
+ it ( 'supports traversals of fragment arguments' , ( ) => {
520
+ const typeInfo = new TypeInfo ( testSchema ) ;
521
+
522
+ const ast = parse (
523
+ `
524
+ query {
525
+ ...Foo(x: 4)
526
+ ...Bar
527
+ }
528
+ fragment Foo(
529
+ $x: ID!
530
+ ) on QueryRoot {
531
+ human(id: $x) { name }
532
+ }
533
+ ` ,
534
+ { experimentalFragmentArguments : true } ,
535
+ ) ;
536
+
537
+ const visited : Array < any > = [ ] ;
538
+ visit (
539
+ ast ,
540
+ visitWithTypeInfo ( typeInfo , {
541
+ enter ( node ) {
542
+ const type = typeInfo . getType ( ) ;
543
+ const inputType = typeInfo . getInputType ( ) ;
544
+ visited . push ( [
545
+ 'enter' ,
546
+ node . kind ,
547
+ node . kind === 'Name' ? node . value : null ,
548
+ String ( type ) ,
549
+ String ( inputType ) ,
550
+ ] ) ;
551
+ } ,
552
+ leave ( node ) {
553
+ const type = typeInfo . getType ( ) ;
554
+ const inputType = typeInfo . getInputType ( ) ;
555
+ visited . push ( [
556
+ 'leave' ,
557
+ node . kind ,
558
+ node . kind === 'Name' ? node . value : null ,
559
+ String ( type ) ,
560
+ String ( inputType ) ,
561
+ ] ) ;
562
+ } ,
563
+ } ) ,
564
+ ) ;
565
+
566
+ expect ( visited ) . to . deep . equal ( [
567
+ [ 'enter' , 'Document' , null , 'undefined' , 'undefined' ] ,
568
+ [ 'enter' , 'OperationDefinition' , null , 'QueryRoot' , 'undefined' ] ,
569
+ [ 'enter' , 'SelectionSet' , null , 'QueryRoot' , 'undefined' ] ,
570
+ [ 'enter' , 'FragmentSpread' , null , 'QueryRoot' , 'undefined' ] ,
571
+ [ 'enter' , 'Name' , 'Foo' , 'QueryRoot' , 'undefined' ] ,
572
+ [ 'leave' , 'Name' , 'Foo' , 'QueryRoot' , 'undefined' ] ,
573
+ [ 'enter' , 'Argument' , null , 'QueryRoot' , 'ID!' ] ,
574
+ [ 'enter' , 'Name' , 'x' , 'QueryRoot' , 'ID!' ] ,
575
+ [ 'leave' , 'Name' , 'x' , 'QueryRoot' , 'ID!' ] ,
576
+ [ 'enter' , 'IntValue' , null , 'QueryRoot' , 'ID!' ] ,
577
+ [ 'leave' , 'IntValue' , null , 'QueryRoot' , 'ID!' ] ,
578
+ [ 'leave' , 'Argument' , null , 'QueryRoot' , 'ID!' ] ,
579
+ [ 'leave' , 'FragmentSpread' , null , 'QueryRoot' , 'undefined' ] ,
580
+ [ 'enter' , 'FragmentSpread' , null , 'QueryRoot' , 'undefined' ] ,
581
+ [ 'enter' , 'Name' , 'Bar' , 'QueryRoot' , 'undefined' ] ,
582
+ [ 'leave' , 'Name' , 'Bar' , 'QueryRoot' , 'undefined' ] ,
583
+ [ 'leave' , 'FragmentSpread' , null , 'QueryRoot' , 'undefined' ] ,
584
+ [ 'leave' , 'SelectionSet' , null , 'QueryRoot' , 'undefined' ] ,
585
+ [ 'leave' , 'OperationDefinition' , null , 'QueryRoot' , 'undefined' ] ,
586
+ [ 'enter' , 'FragmentDefinition' , null , 'QueryRoot' , 'undefined' ] ,
587
+ [ 'enter' , 'Name' , 'Foo' , 'QueryRoot' , 'undefined' ] ,
588
+ [ 'leave' , 'Name' , 'Foo' , 'QueryRoot' , 'undefined' ] ,
589
+ [ 'enter' , 'VariableDefinition' , null , 'QueryRoot' , 'ID!' ] ,
590
+ [ 'enter' , 'Variable' , null , 'QueryRoot' , 'ID!' ] ,
591
+ [ 'enter' , 'Name' , 'x' , 'QueryRoot' , 'ID!' ] ,
592
+ [ 'leave' , 'Name' , 'x' , 'QueryRoot' , 'ID!' ] ,
593
+ [ 'leave' , 'Variable' , null , 'QueryRoot' , 'ID!' ] ,
594
+ [ 'enter' , 'NonNullType' , null , 'QueryRoot' , 'ID!' ] ,
595
+ [ 'enter' , 'NamedType' , null , 'QueryRoot' , 'ID!' ] ,
596
+ [ 'enter' , 'Name' , 'ID' , 'QueryRoot' , 'ID!' ] ,
597
+ [ 'leave' , 'Name' , 'ID' , 'QueryRoot' , 'ID!' ] ,
598
+ [ 'leave' , 'NamedType' , null , 'QueryRoot' , 'ID!' ] ,
599
+ [ 'leave' , 'NonNullType' , null , 'QueryRoot' , 'ID!' ] ,
600
+ [ 'leave' , 'VariableDefinition' , null , 'QueryRoot' , 'ID!' ] ,
601
+ [ 'enter' , 'NamedType' , null , 'QueryRoot' , 'undefined' ] ,
602
+ [ 'enter' , 'Name' , 'QueryRoot' , 'QueryRoot' , 'undefined' ] ,
603
+ [ 'leave' , 'Name' , 'QueryRoot' , 'QueryRoot' , 'undefined' ] ,
604
+ [ 'leave' , 'NamedType' , null , 'QueryRoot' , 'undefined' ] ,
605
+ [ 'enter' , 'SelectionSet' , null , 'QueryRoot' , 'undefined' ] ,
606
+ [ 'enter' , 'Field' , null , 'Human' , 'undefined' ] ,
607
+ [ 'enter' , 'Name' , 'human' , 'Human' , 'undefined' ] ,
608
+ [ 'leave' , 'Name' , 'human' , 'Human' , 'undefined' ] ,
609
+ [ 'enter' , 'Argument' , null , 'Human' , 'ID' ] ,
610
+ [ 'enter' , 'Name' , 'id' , 'Human' , 'ID' ] ,
611
+ [ 'leave' , 'Name' , 'id' , 'Human' , 'ID' ] ,
612
+ [ 'enter' , 'Variable' , null , 'Human' , 'ID' ] ,
613
+ [ 'enter' , 'Name' , 'x' , 'Human' , 'ID' ] ,
614
+ [ 'leave' , 'Name' , 'x' , 'Human' , 'ID' ] ,
615
+ [ 'leave' , 'Variable' , null , 'Human' , 'ID' ] ,
616
+ [ 'leave' , 'Argument' , null , 'Human' , 'ID' ] ,
617
+ [ 'enter' , 'SelectionSet' , null , 'Human' , 'undefined' ] ,
618
+ [ 'enter' , 'Field' , null , 'String' , 'undefined' ] ,
619
+ [ 'enter' , 'Name' , 'name' , 'String' , 'undefined' ] ,
620
+ [ 'leave' , 'Name' , 'name' , 'String' , 'undefined' ] ,
621
+ [ 'leave' , 'Field' , null , 'String' , 'undefined' ] ,
622
+ [ 'leave' , 'SelectionSet' , null , 'Human' , 'undefined' ] ,
623
+ [ 'leave' , 'Field' , null , 'Human' , 'undefined' ] ,
624
+ [ 'leave' , 'SelectionSet' , null , 'QueryRoot' , 'undefined' ] ,
625
+ [ 'leave' , 'FragmentDefinition' , null , 'QueryRoot' , 'undefined' ] ,
626
+ [ 'leave' , 'Document' , null , 'undefined' , 'undefined' ] ,
627
+ ] ) ;
628
+ } ) ;
629
+
630
+ it ( 'supports traversals of fragment arguments with default-value' , ( ) => {
631
+ const typeInfo = new TypeInfo ( testSchema ) ;
632
+
633
+ const ast = parse (
634
+ `
635
+ query {
636
+ ...Foo(x: null)
637
+ }
638
+ fragment Foo(
639
+ $x: ID = 4
640
+ ) on QueryRoot {
641
+ human(id: $x) { name }
642
+ }
643
+ ` ,
644
+ { experimentalFragmentArguments : true } ,
645
+ ) ;
646
+
647
+ const visited : Array < any > = [ ] ;
648
+ visit (
649
+ ast ,
650
+ visitWithTypeInfo ( typeInfo , {
651
+ enter ( node ) {
652
+ const type = typeInfo . getType ( ) ;
653
+ const inputType = typeInfo . getInputType ( ) ;
654
+ visited . push ( [
655
+ 'enter' ,
656
+ node . kind ,
657
+ node . kind === 'Name' ? node . value : null ,
658
+ String ( type ) ,
659
+ String ( inputType ) ,
660
+ ] ) ;
661
+ } ,
662
+ leave ( node ) {
663
+ const type = typeInfo . getType ( ) ;
664
+ const inputType = typeInfo . getInputType ( ) ;
665
+ visited . push ( [
666
+ 'leave' ,
667
+ node . kind ,
668
+ node . kind === 'Name' ? node . value : null ,
669
+ String ( type ) ,
670
+ String ( inputType ) ,
671
+ ] ) ;
672
+ } ,
673
+ } ) ,
674
+ ) ;
675
+
676
+ expect ( visited ) . to . deep . equal ( [
677
+ [ 'enter' , 'Document' , null , 'undefined' , 'undefined' ] ,
678
+ [ 'enter' , 'OperationDefinition' , null , 'QueryRoot' , 'undefined' ] ,
679
+ [ 'enter' , 'SelectionSet' , null , 'QueryRoot' , 'undefined' ] ,
680
+ [ 'enter' , 'FragmentSpread' , null , 'QueryRoot' , 'undefined' ] ,
681
+ [ 'enter' , 'Name' , 'Foo' , 'QueryRoot' , 'undefined' ] ,
682
+ [ 'leave' , 'Name' , 'Foo' , 'QueryRoot' , 'undefined' ] ,
683
+ [ 'enter' , 'Argument' , null , 'QueryRoot' , 'ID' ] ,
684
+ [ 'enter' , 'Name' , 'x' , 'QueryRoot' , 'ID' ] ,
685
+ [ 'leave' , 'Name' , 'x' , 'QueryRoot' , 'ID' ] ,
686
+ [ 'enter' , 'NullValue' , null , 'QueryRoot' , 'ID' ] ,
687
+ [ 'leave' , 'NullValue' , null , 'QueryRoot' , 'ID' ] ,
688
+ [ 'leave' , 'Argument' , null , 'QueryRoot' , 'ID' ] ,
689
+ [ 'leave' , 'FragmentSpread' , null , 'QueryRoot' , 'undefined' ] ,
690
+ [ 'leave' , 'SelectionSet' , null , 'QueryRoot' , 'undefined' ] ,
691
+ [ 'leave' , 'OperationDefinition' , null , 'QueryRoot' , 'undefined' ] ,
692
+ [ 'enter' , 'FragmentDefinition' , null , 'QueryRoot' , 'undefined' ] ,
693
+ [ 'enter' , 'Name' , 'Foo' , 'QueryRoot' , 'undefined' ] ,
694
+ [ 'leave' , 'Name' , 'Foo' , 'QueryRoot' , 'undefined' ] ,
695
+ [ 'enter' , 'VariableDefinition' , null , 'QueryRoot' , 'ID' ] ,
696
+ [ 'enter' , 'Variable' , null , 'QueryRoot' , 'ID' ] ,
697
+ [ 'enter' , 'Name' , 'x' , 'QueryRoot' , 'ID' ] ,
698
+ [ 'leave' , 'Name' , 'x' , 'QueryRoot' , 'ID' ] ,
699
+ [ 'leave' , 'Variable' , null , 'QueryRoot' , 'ID' ] ,
700
+ [ 'enter' , 'NamedType' , null , 'QueryRoot' , 'ID' ] ,
701
+ [ 'enter' , 'Name' , 'ID' , 'QueryRoot' , 'ID' ] ,
702
+ [ 'leave' , 'Name' , 'ID' , 'QueryRoot' , 'ID' ] ,
703
+ [ 'leave' , 'NamedType' , null , 'QueryRoot' , 'ID' ] ,
704
+ [ 'enter' , 'IntValue' , null , 'QueryRoot' , 'ID' ] ,
705
+ [ 'leave' , 'IntValue' , null , 'QueryRoot' , 'ID' ] ,
706
+ [ 'leave' , 'VariableDefinition' , null , 'QueryRoot' , 'ID' ] ,
707
+ [ 'enter' , 'NamedType' , null , 'QueryRoot' , 'undefined' ] ,
708
+ [ 'enter' , 'Name' , 'QueryRoot' , 'QueryRoot' , 'undefined' ] ,
709
+ [ 'leave' , 'Name' , 'QueryRoot' , 'QueryRoot' , 'undefined' ] ,
710
+ [ 'leave' , 'NamedType' , null , 'QueryRoot' , 'undefined' ] ,
711
+ [ 'enter' , 'SelectionSet' , null , 'QueryRoot' , 'undefined' ] ,
712
+ [ 'enter' , 'Field' , null , 'Human' , 'undefined' ] ,
713
+ [ 'enter' , 'Name' , 'human' , 'Human' , 'undefined' ] ,
714
+ [ 'leave' , 'Name' , 'human' , 'Human' , 'undefined' ] ,
715
+ [ 'enter' , 'Argument' , null , 'Human' , 'ID' ] ,
716
+ [ 'enter' , 'Name' , 'id' , 'Human' , 'ID' ] ,
717
+ [ 'leave' , 'Name' , 'id' , 'Human' , 'ID' ] ,
718
+ [ 'enter' , 'Variable' , null , 'Human' , 'ID' ] ,
719
+ [ 'enter' , 'Name' , 'x' , 'Human' , 'ID' ] ,
720
+ [ 'leave' , 'Name' , 'x' , 'Human' , 'ID' ] ,
721
+ [ 'leave' , 'Variable' , null , 'Human' , 'ID' ] ,
722
+ [ 'leave' , 'Argument' , null , 'Human' , 'ID' ] ,
723
+ [ 'enter' , 'SelectionSet' , null , 'Human' , 'undefined' ] ,
724
+ [ 'enter' , 'Field' , null , 'String' , 'undefined' ] ,
725
+ [ 'enter' , 'Name' , 'name' , 'String' , 'undefined' ] ,
726
+ [ 'leave' , 'Name' , 'name' , 'String' , 'undefined' ] ,
727
+ [ 'leave' , 'Field' , null , 'String' , 'undefined' ] ,
728
+ [ 'leave' , 'SelectionSet' , null , 'Human' , 'undefined' ] ,
729
+ [ 'leave' , 'Field' , null , 'Human' , 'undefined' ] ,
730
+ [ 'leave' , 'SelectionSet' , null , 'QueryRoot' , 'undefined' ] ,
731
+ [ 'leave' , 'FragmentDefinition' , null , 'QueryRoot' , 'undefined' ] ,
732
+ [ 'leave' , 'Document' , null , 'undefined' , 'undefined' ] ,
733
+ ] ) ;
734
+ } ) ;
518
735
} ) ;
0 commit comments