@@ -375,6 +375,128 @@ describe('Parser', () => {
375375 expect ( ( ) => parse ( document ) ) . to . throw ( 'Syntax Error' ) ;
376376 } ) ;
377377
378+ it ( 'Experimental: allows parsing fragment spread arguments if `experimentalFragmentVariables` is enabled' , ( ) => {
379+ const fragmentSpread = '{ ...Foo(v: $v) }' ;
380+
381+ expect ( ( ) =>
382+ parse ( fragmentSpread , { experimentalFragmentVariables : true } ) ,
383+ ) . to . not . throw ( ) ;
384+ expect ( ( ) => parse ( fragmentSpread ) ) . to . throw ( 'Syntax Error' ) ;
385+ } ) ;
386+
387+ it ( 'Experimental: does not parse arguments on inline fragments' , ( ) => {
388+ const inlineFragment = '{ ... on Foo(v: $v) { id } }' ;
389+ expect ( ( ) =>
390+ parse ( inlineFragment , { experimentalFragmentVariables : true } ) ,
391+ ) . to . throw ( 'Syntax Error' ) ;
392+ } ) ;
393+
394+ it ( 'Experimental: parses fragment spread arguments' , ( ) => {
395+ const document = parse ( '{ ...Foo(v: $v) }' , {
396+ experimentalFragmentVariables : true ,
397+ } ) ;
398+
399+ expect ( toJSONDeep ( document ) ) . to . have . deep . nested . property (
400+ 'definitions[0].selectionSet.selections[0]' ,
401+ {
402+ arguments : [
403+ {
404+ kind : Kind . ARGUMENT ,
405+ loc : { end : 14 , start : 9 } ,
406+ name : {
407+ kind : Kind . NAME ,
408+ loc : { end : 10 , start : 9 } ,
409+ value : 'v' ,
410+ } ,
411+ value : {
412+ kind : Kind . VARIABLE ,
413+ loc : { end : 14 , start : 12 } ,
414+ name : {
415+ kind : Kind . NAME ,
416+ loc : { end : 14 , start : 13 } ,
417+ value : 'v' ,
418+ } ,
419+ } ,
420+ } ,
421+ ] ,
422+ directives : [ ] ,
423+ kind : Kind . FRAGMENT_SPREAD ,
424+ loc : { end : 15 , start : 2 } ,
425+ name : {
426+ kind : Kind . NAME ,
427+ loc : { end : 8 , start : 5 } ,
428+ value : 'Foo' ,
429+ } ,
430+ } ,
431+ ) ;
432+ } ) ;
433+
434+ it ( 'Experimental: parses fragment spread arguments and directives' , ( ) => {
435+ const document = parse ( '{ ...Foo(v: $v) @skip(if: true) }' , {
436+ experimentalFragmentVariables : true ,
437+ } ) ;
438+
439+ expect ( toJSONDeep ( document ) ) . to . have . deep . nested . property (
440+ 'definitions[0].selectionSet.selections[0]' ,
441+ {
442+ arguments : [
443+ {
444+ kind : Kind . ARGUMENT ,
445+ loc : { end : 14 , start : 9 } ,
446+ name : {
447+ kind : Kind . NAME ,
448+ loc : { end : 10 , start : 9 } ,
449+ value : 'v' ,
450+ } ,
451+ value : {
452+ kind : Kind . VARIABLE ,
453+ loc : { end : 14 , start : 12 } ,
454+ name : {
455+ kind : Kind . NAME ,
456+ loc : { end : 14 , start : 13 } ,
457+ value : 'v' ,
458+ } ,
459+ } ,
460+ } ,
461+ ] ,
462+ directives : [
463+ {
464+ arguments : [
465+ {
466+ kind : Kind . ARGUMENT ,
467+ loc : { end : 30 , start : 22 } ,
468+ name : {
469+ kind : Kind . NAME ,
470+ loc : { end : 24 , start : 22 } ,
471+ value : 'if' ,
472+ } ,
473+ value : {
474+ kind : Kind . BOOLEAN ,
475+ loc : { end : 30 , start : 26 } ,
476+ value : true ,
477+ } ,
478+ } ,
479+ ] ,
480+ kind : Kind . DIRECTIVE ,
481+ loc : { end : 31 , start : 16 } ,
482+ name : {
483+ kind : Kind . NAME ,
484+ loc : { end : 21 , start : 17 } ,
485+ value : 'skip' ,
486+ } ,
487+ } ,
488+ ] ,
489+ kind : Kind . FRAGMENT_SPREAD ,
490+ loc : { end : 31 , start : 2 } ,
491+ name : {
492+ kind : Kind . NAME ,
493+ loc : { end : 8 , start : 5 } ,
494+ value : 'Foo' ,
495+ } ,
496+ } ,
497+ ) ;
498+ } ) ;
499+
378500 it ( 'contains location information that only stringifies start/end' , ( ) => {
379501 const result = parse ( '{ id }' ) ;
380502
0 commit comments