@@ -457,4 +457,216 @@ describe('visitWithTypeInfo', () => {
457457 [ 'leave' , 'SelectionSet' , null , 'Human' , 'Human' ] ,
458458 ] ) ;
459459 } ) ;
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+ } ) ;
460672} ) ;
0 commit comments