@@ -457,4 +457,216 @@ describe('visitWithTypeInfo', () => {
457
457
[ 'leave' , 'SelectionSet' , null , 'Human' , 'Human' ] ,
458
458
] ) ;
459
459
} ) ;
460
+
461
+ it ( 'supports traversals of fragment arguments' , ( ) => {
462
+ const typeInfo = new TypeInfo ( testSchema ) ;
463
+
464
+ const ast = parse (
465
+ `
466
+ query {
467
+ ...Foo(x: 4)
468
+ }
469
+ fragment Foo(
470
+ $x: ID!
471
+ ) on QueryRoot {
472
+ human(id: $x) { name }
473
+ }
474
+ ` ,
475
+ { experimentalFragmentArguments : true } ,
476
+ ) ;
477
+
478
+ const visited : Array < any > = [ ] ;
479
+ visit (
480
+ ast ,
481
+ visitWithTypeInfo ( typeInfo , {
482
+ enter ( node ) {
483
+ const type = typeInfo . getType ( ) ;
484
+ const inputType = typeInfo . getInputType ( ) ;
485
+ visited . push ( [
486
+ 'enter' ,
487
+ node . kind ,
488
+ node . kind === 'Name' ? node . value : null ,
489
+ String ( type ) ,
490
+ String ( inputType ) ,
491
+ ] ) ;
492
+ } ,
493
+ leave ( node ) {
494
+ const type = typeInfo . getType ( ) ;
495
+ const inputType = typeInfo . getInputType ( ) ;
496
+ visited . push ( [
497
+ 'leave' ,
498
+ node . kind ,
499
+ node . kind === 'Name' ? node . value : null ,
500
+ String ( type ) ,
501
+ String ( inputType ) ,
502
+ ] ) ;
503
+ } ,
504
+ } ) ,
505
+ ) ;
506
+
507
+ expect ( visited ) . to . deep . equal ( [
508
+ [ 'enter' , 'Document' , null , 'undefined' , 'undefined' ] ,
509
+ [ 'enter' , 'OperationDefinition' , null , 'QueryRoot' , 'undefined' ] ,
510
+ [ 'enter' , 'SelectionSet' , null , 'QueryRoot' , 'undefined' ] ,
511
+ [ 'enter' , 'FragmentSpread' , null , 'QueryRoot' , 'undefined' ] ,
512
+ [ 'enter' , 'Name' , 'Foo' , 'QueryRoot' , 'undefined' ] ,
513
+ [ 'leave' , 'Name' , 'Foo' , 'QueryRoot' , 'undefined' ] ,
514
+ [ 'enter' , 'Argument' , null , 'QueryRoot' , 'ID!' ] ,
515
+ [ 'enter' , 'Name' , 'x' , 'QueryRoot' , 'ID!' ] ,
516
+ [ 'leave' , 'Name' , 'x' , 'QueryRoot' , 'ID!' ] ,
517
+ [ 'enter' , 'IntValue' , null , 'QueryRoot' , 'ID!' ] ,
518
+ [ 'leave' , 'IntValue' , null , 'QueryRoot' , 'ID!' ] ,
519
+ [ 'leave' , 'Argument' , null , 'QueryRoot' , 'ID!' ] ,
520
+ [ 'leave' , 'FragmentSpread' , null , 'QueryRoot' , 'undefined' ] ,
521
+ [ 'leave' , 'SelectionSet' , null , 'QueryRoot' , 'undefined' ] ,
522
+ [ 'leave' , 'OperationDefinition' , null , 'QueryRoot' , 'undefined' ] ,
523
+ [ 'enter' , 'FragmentDefinition' , null , 'QueryRoot' , 'undefined' ] ,
524
+ [ 'enter' , 'Name' , 'Foo' , 'QueryRoot' , 'undefined' ] ,
525
+ [ 'leave' , 'Name' , 'Foo' , 'QueryRoot' , 'undefined' ] ,
526
+ [ 'enter' , 'VariableDefinition' , null , 'QueryRoot' , 'ID!' ] ,
527
+ [ 'enter' , 'Variable' , null , 'QueryRoot' , 'ID!' ] ,
528
+ [ 'enter' , 'Name' , 'x' , 'QueryRoot' , 'ID!' ] ,
529
+ [ 'leave' , 'Name' , 'x' , 'QueryRoot' , 'ID!' ] ,
530
+ [ 'leave' , 'Variable' , null , 'QueryRoot' , 'ID!' ] ,
531
+ [ 'enter' , 'NonNullType' , null , 'QueryRoot' , 'ID!' ] ,
532
+ [ 'enter' , 'NamedType' , null , 'QueryRoot' , 'ID!' ] ,
533
+ [ 'enter' , 'Name' , 'ID' , 'QueryRoot' , 'ID!' ] ,
534
+ [ 'leave' , 'Name' , 'ID' , 'QueryRoot' , 'ID!' ] ,
535
+ [ 'leave' , 'NamedType' , null , 'QueryRoot' , 'ID!' ] ,
536
+ [ 'leave' , 'NonNullType' , null , 'QueryRoot' , 'ID!' ] ,
537
+ [ 'leave' , 'VariableDefinition' , null , 'QueryRoot' , 'ID!' ] ,
538
+ [ 'enter' , 'NamedType' , null , 'QueryRoot' , 'undefined' ] ,
539
+ [ 'enter' , 'Name' , 'QueryRoot' , 'QueryRoot' , 'undefined' ] ,
540
+ [ 'leave' , 'Name' , 'QueryRoot' , 'QueryRoot' , 'undefined' ] ,
541
+ [ 'leave' , 'NamedType' , null , 'QueryRoot' , 'undefined' ] ,
542
+ [ 'enter' , 'SelectionSet' , null , 'QueryRoot' , 'undefined' ] ,
543
+ [ 'enter' , 'Field' , null , 'Human' , 'undefined' ] ,
544
+ [ 'enter' , 'Name' , 'human' , 'Human' , 'undefined' ] ,
545
+ [ 'leave' , 'Name' , 'human' , 'Human' , 'undefined' ] ,
546
+ [ 'enter' , 'Argument' , null , 'Human' , 'ID' ] ,
547
+ [ 'enter' , 'Name' , 'id' , 'Human' , 'ID' ] ,
548
+ [ 'leave' , 'Name' , 'id' , 'Human' , 'ID' ] ,
549
+ [ 'enter' , 'Variable' , null , 'Human' , 'ID' ] ,
550
+ [ 'enter' , 'Name' , 'x' , 'Human' , 'ID' ] ,
551
+ [ 'leave' , 'Name' , 'x' , 'Human' , 'ID' ] ,
552
+ [ 'leave' , 'Variable' , null , 'Human' , 'ID' ] ,
553
+ [ 'leave' , 'Argument' , null , 'Human' , 'ID' ] ,
554
+ [ 'enter' , 'SelectionSet' , null , 'Human' , 'undefined' ] ,
555
+ [ 'enter' , 'Field' , null , 'String' , 'undefined' ] ,
556
+ [ 'enter' , 'Name' , 'name' , 'String' , 'undefined' ] ,
557
+ [ 'leave' , 'Name' , 'name' , 'String' , 'undefined' ] ,
558
+ [ 'leave' , 'Field' , null , 'String' , 'undefined' ] ,
559
+ [ 'leave' , 'SelectionSet' , null , 'Human' , 'undefined' ] ,
560
+ [ 'leave' , 'Field' , null , 'Human' , 'undefined' ] ,
561
+ [ 'leave' , 'SelectionSet' , null , 'QueryRoot' , 'undefined' ] ,
562
+ [ 'leave' , 'FragmentDefinition' , null , 'QueryRoot' , 'undefined' ] ,
563
+ [ 'leave' , 'Document' , null , 'undefined' , 'undefined' ] ,
564
+ ] ) ;
565
+ } ) ;
566
+
567
+ it ( 'supports traversals of fragment arguments with default-value' , ( ) => {
568
+ const typeInfo = new TypeInfo ( testSchema ) ;
569
+
570
+ const ast = parse (
571
+ `
572
+ query {
573
+ ...Foo(x: null)
574
+ }
575
+ fragment Foo(
576
+ $x: ID = 4
577
+ ) on QueryRoot {
578
+ human(id: $x) { name }
579
+ }
580
+ ` ,
581
+ { experimentalFragmentArguments : true } ,
582
+ ) ;
583
+
584
+ const visited : Array < any > = [ ] ;
585
+ visit (
586
+ ast ,
587
+ visitWithTypeInfo ( typeInfo , {
588
+ enter ( node ) {
589
+ const type = typeInfo . getType ( ) ;
590
+ const inputType = typeInfo . getInputType ( ) ;
591
+ visited . push ( [
592
+ 'enter' ,
593
+ node . kind ,
594
+ node . kind === 'Name' ? node . value : null ,
595
+ String ( type ) ,
596
+ String ( inputType ) ,
597
+ ] ) ;
598
+ } ,
599
+ leave ( node ) {
600
+ const type = typeInfo . getType ( ) ;
601
+ const inputType = typeInfo . getInputType ( ) ;
602
+ visited . push ( [
603
+ 'leave' ,
604
+ node . kind ,
605
+ node . kind === 'Name' ? node . value : null ,
606
+ String ( type ) ,
607
+ String ( inputType ) ,
608
+ ] ) ;
609
+ } ,
610
+ } ) ,
611
+ ) ;
612
+
613
+ expect ( visited ) . to . deep . equal ( [
614
+ [ 'enter' , 'Document' , null , 'undefined' , 'undefined' ] ,
615
+ [ 'enter' , 'OperationDefinition' , null , 'QueryRoot' , 'undefined' ] ,
616
+ [ 'enter' , 'SelectionSet' , null , 'QueryRoot' , 'undefined' ] ,
617
+ [ 'enter' , 'FragmentSpread' , null , 'QueryRoot' , 'undefined' ] ,
618
+ [ 'enter' , 'Name' , 'Foo' , 'QueryRoot' , 'undefined' ] ,
619
+ [ 'leave' , 'Name' , 'Foo' , 'QueryRoot' , 'undefined' ] ,
620
+ [ 'enter' , 'Argument' , null , 'QueryRoot' , 'ID' ] ,
621
+ [ 'enter' , 'Name' , 'x' , 'QueryRoot' , 'ID' ] ,
622
+ [ 'leave' , 'Name' , 'x' , 'QueryRoot' , 'ID' ] ,
623
+ [ 'enter' , 'NullValue' , null , 'QueryRoot' , 'ID' ] ,
624
+ [ 'leave' , 'NullValue' , null , 'QueryRoot' , 'ID' ] ,
625
+ [ 'leave' , 'Argument' , null , 'QueryRoot' , 'ID' ] ,
626
+ [ 'leave' , 'FragmentSpread' , null , 'QueryRoot' , 'undefined' ] ,
627
+ [ 'leave' , 'SelectionSet' , null , 'QueryRoot' , 'undefined' ] ,
628
+ [ 'leave' , 'OperationDefinition' , null , 'QueryRoot' , 'undefined' ] ,
629
+ [ 'enter' , 'FragmentDefinition' , null , 'QueryRoot' , 'undefined' ] ,
630
+ [ 'enter' , 'Name' , 'Foo' , 'QueryRoot' , 'undefined' ] ,
631
+ [ 'leave' , 'Name' , 'Foo' , 'QueryRoot' , 'undefined' ] ,
632
+ [ 'enter' , 'VariableDefinition' , null , 'QueryRoot' , 'ID' ] ,
633
+ [ 'enter' , 'Variable' , null , 'QueryRoot' , 'ID' ] ,
634
+ [ 'enter' , 'Name' , 'x' , 'QueryRoot' , 'ID' ] ,
635
+ [ 'leave' , 'Name' , 'x' , 'QueryRoot' , 'ID' ] ,
636
+ [ 'leave' , 'Variable' , null , 'QueryRoot' , 'ID' ] ,
637
+ [ 'enter' , 'NamedType' , null , 'QueryRoot' , 'ID' ] ,
638
+ [ 'enter' , 'Name' , 'ID' , 'QueryRoot' , 'ID' ] ,
639
+ [ 'leave' , 'Name' , 'ID' , 'QueryRoot' , 'ID' ] ,
640
+ [ 'leave' , 'NamedType' , null , 'QueryRoot' , 'ID' ] ,
641
+ [ 'enter' , 'IntValue' , null , 'QueryRoot' , 'ID' ] ,
642
+ [ 'leave' , 'IntValue' , null , 'QueryRoot' , 'ID' ] ,
643
+ [ 'leave' , 'VariableDefinition' , null , 'QueryRoot' , 'ID' ] ,
644
+ [ 'enter' , 'NamedType' , null , 'QueryRoot' , 'undefined' ] ,
645
+ [ 'enter' , 'Name' , 'QueryRoot' , 'QueryRoot' , 'undefined' ] ,
646
+ [ 'leave' , 'Name' , 'QueryRoot' , 'QueryRoot' , 'undefined' ] ,
647
+ [ 'leave' , 'NamedType' , null , 'QueryRoot' , 'undefined' ] ,
648
+ [ 'enter' , 'SelectionSet' , null , 'QueryRoot' , 'undefined' ] ,
649
+ [ 'enter' , 'Field' , null , 'Human' , 'undefined' ] ,
650
+ [ 'enter' , 'Name' , 'human' , 'Human' , 'undefined' ] ,
651
+ [ 'leave' , 'Name' , 'human' , 'Human' , 'undefined' ] ,
652
+ [ 'enter' , 'Argument' , null , 'Human' , 'ID' ] ,
653
+ [ 'enter' , 'Name' , 'id' , 'Human' , 'ID' ] ,
654
+ [ 'leave' , 'Name' , 'id' , 'Human' , 'ID' ] ,
655
+ [ 'enter' , 'Variable' , null , 'Human' , 'ID' ] ,
656
+ [ 'enter' , 'Name' , 'x' , 'Human' , 'ID' ] ,
657
+ [ 'leave' , 'Name' , 'x' , 'Human' , 'ID' ] ,
658
+ [ 'leave' , 'Variable' , null , 'Human' , 'ID' ] ,
659
+ [ 'leave' , 'Argument' , null , 'Human' , 'ID' ] ,
660
+ [ 'enter' , 'SelectionSet' , null , 'Human' , 'undefined' ] ,
661
+ [ 'enter' , 'Field' , null , 'String' , 'undefined' ] ,
662
+ [ 'enter' , 'Name' , 'name' , 'String' , 'undefined' ] ,
663
+ [ 'leave' , 'Name' , 'name' , 'String' , 'undefined' ] ,
664
+ [ 'leave' , 'Field' , null , 'String' , 'undefined' ] ,
665
+ [ 'leave' , 'SelectionSet' , null , 'Human' , 'undefined' ] ,
666
+ [ 'leave' , 'Field' , null , 'Human' , 'undefined' ] ,
667
+ [ 'leave' , 'SelectionSet' , null , 'QueryRoot' , 'undefined' ] ,
668
+ [ 'leave' , 'FragmentDefinition' , null , 'QueryRoot' , 'undefined' ] ,
669
+ [ 'leave' , 'Document' , null , 'undefined' , 'undefined' ] ,
670
+ ] ) ;
671
+ } ) ;
460
672
} ) ;
0 commit comments