@@ -375,6 +375,128 @@ describe('Parser', () => {
375
375
expect ( ( ) => parse ( document ) ) . to . throw ( 'Syntax Error' ) ;
376
376
} ) ;
377
377
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
+
378
500
it ( 'contains location information that only stringifies start/end' , ( ) => {
379
501
const result = parse ( '{ id }' ) ;
380
502
0 commit comments