@@ -11,7 +11,13 @@ import { kitchenSinkQuery } from '../../__testUtils__/kitchenSinkQuery.js';
1111import { inspect } from '../../jsutils/inspect.js' ;
1212
1313import { Kind } from '../kinds.js' ;
14- import { parse , parseConstValue , parseType , parseValue } from '../parser.js' ;
14+ import {
15+ parse ,
16+ parseConstValue ,
17+ parseSchemaCoordinate ,
18+ parseType ,
19+ parseValue ,
20+ } from '../parser.js' ;
1521import { Source } from '../source.js' ;
1622import { TokenKind } from '../tokenKind.js' ;
1723
@@ -679,4 +685,178 @@ describe('Parser', () => {
679685 } ) ;
680686 } ) ;
681687 } ) ;
688+
689+ describe ( 'parseSchemaCoordinate' , ( ) => {
690+ it ( 'parses Name' , ( ) => {
691+ const result = parseSchemaCoordinate ( 'MyType' ) ;
692+ expectJSON ( result ) . toDeepEqual ( {
693+ kind : Kind . TYPE_COORDINATE ,
694+ loc : { start : 0 , end : 6 } ,
695+ name : {
696+ kind : Kind . NAME ,
697+ loc : { start : 0 , end : 6 } ,
698+ value : 'MyType' ,
699+ } ,
700+ } ) ;
701+ } ) ;
702+
703+ it ( 'parses Name . Name' , ( ) => {
704+ const result = parseSchemaCoordinate ( 'MyType.field' ) ;
705+ expectJSON ( result ) . toDeepEqual ( {
706+ kind : Kind . MEMBER_COORDINATE ,
707+ loc : { start : 0 , end : 12 } ,
708+ name : {
709+ kind : Kind . NAME ,
710+ loc : { start : 0 , end : 6 } ,
711+ value : 'MyType' ,
712+ } ,
713+ memberName : {
714+ kind : Kind . NAME ,
715+ loc : { start : 7 , end : 12 } ,
716+ value : 'field' ,
717+ } ,
718+ } ) ;
719+ } ) ;
720+
721+ it ( 'rejects Name . Name . Name' , ( ) => {
722+ expect ( ( ) => parseSchemaCoordinate ( 'MyType.field.deep' ) )
723+ . to . throw ( )
724+ . to . deep . include ( {
725+ message : 'Syntax Error: Expected <EOF>, found ..' ,
726+ locations : [ { line : 1 , column : 13 } ] ,
727+ } ) ;
728+ } ) ;
729+
730+ it ( 'parses Name . Name ( Name : )' , ( ) => {
731+ const result = parseSchemaCoordinate ( 'MyType.field(arg:)' ) ;
732+ expectJSON ( result ) . toDeepEqual ( {
733+ kind : Kind . ARGUMENT_COORDINATE ,
734+ loc : { start : 0 , end : 18 } ,
735+ name : {
736+ kind : Kind . NAME ,
737+ loc : { start : 0 , end : 6 } ,
738+ value : 'MyType' ,
739+ } ,
740+ fieldName : {
741+ kind : Kind . NAME ,
742+ loc : { start : 7 , end : 12 } ,
743+ value : 'field' ,
744+ } ,
745+ argumentName : {
746+ kind : Kind . NAME ,
747+ loc : { start : 13 , end : 16 } ,
748+ value : 'arg' ,
749+ } ,
750+ } ) ;
751+ } ) ;
752+
753+ it ( 'rejects Name . Name ( Name : Name )' , ( ) => {
754+ expect ( ( ) => parseSchemaCoordinate ( 'MyType.field(arg: value)' ) )
755+ . to . throw ( )
756+ . to . deep . include ( {
757+ message : 'Syntax Error: Invalid character: " ".' ,
758+ locations : [ { line : 1 , column : 18 } ] ,
759+ } ) ;
760+ } ) ;
761+
762+ it ( 'parses @ Name' , ( ) => {
763+ const result = parseSchemaCoordinate ( '@myDirective' ) ;
764+ expectJSON ( result ) . toDeepEqual ( {
765+ kind : Kind . DIRECTIVE_COORDINATE ,
766+ loc : { start : 0 , end : 12 } ,
767+ name : {
768+ kind : Kind . NAME ,
769+ loc : { start : 1 , end : 12 } ,
770+ value : 'myDirective' ,
771+ } ,
772+ } ) ;
773+ } ) ;
774+
775+ it ( 'parses @ Name ( Name : )' , ( ) => {
776+ const result = parseSchemaCoordinate ( '@myDirective(arg:)' ) ;
777+ expectJSON ( result ) . toDeepEqual ( {
778+ kind : Kind . DIRECTIVE_ARGUMENT_COORDINATE ,
779+ loc : { start : 0 , end : 18 } ,
780+ name : {
781+ kind : Kind . NAME ,
782+ loc : { start : 1 , end : 12 } ,
783+ value : 'myDirective' ,
784+ } ,
785+ argumentName : {
786+ kind : Kind . NAME ,
787+ loc : { start : 13 , end : 16 } ,
788+ value : 'arg' ,
789+ } ,
790+ } ) ;
791+ } ) ;
792+
793+ it ( 'parses __Type' , ( ) => {
794+ const result = parseSchemaCoordinate ( '__Type' ) ;
795+ expectJSON ( result ) . toDeepEqual ( {
796+ kind : Kind . TYPE_COORDINATE ,
797+ loc : { start : 0 , end : 6 } ,
798+ name : {
799+ kind : Kind . NAME ,
800+ loc : { start : 0 , end : 6 } ,
801+ value : '__Type' ,
802+ } ,
803+ } ) ;
804+ } ) ;
805+
806+ it ( 'parses Type.__metafield' , ( ) => {
807+ const result = parseSchemaCoordinate ( 'Type.__metafield' ) ;
808+ expectJSON ( result ) . toDeepEqual ( {
809+ kind : Kind . MEMBER_COORDINATE ,
810+ loc : { start : 0 , end : 16 } ,
811+ name : {
812+ kind : Kind . NAME ,
813+ loc : { start : 0 , end : 4 } ,
814+ value : 'Type' ,
815+ } ,
816+ memberName : {
817+ kind : Kind . NAME ,
818+ loc : { start : 5 , end : 16 } ,
819+ value : '__metafield' ,
820+ } ,
821+ } ) ;
822+ } ) ;
823+
824+ it ( 'parses Type.__metafield(arg:)' , ( ) => {
825+ const result = parseSchemaCoordinate ( 'Type.__metafield(arg:)' ) ;
826+ expectJSON ( result ) . toDeepEqual ( {
827+ kind : Kind . ARGUMENT_COORDINATE ,
828+ loc : { start : 0 , end : 22 } ,
829+ name : {
830+ kind : Kind . NAME ,
831+ loc : { start : 0 , end : 4 } ,
832+ value : 'Type' ,
833+ } ,
834+ fieldName : {
835+ kind : Kind . NAME ,
836+ loc : { start : 5 , end : 16 } ,
837+ value : '__metafield' ,
838+ } ,
839+ argumentName : {
840+ kind : Kind . NAME ,
841+ loc : { start : 17 , end : 20 } ,
842+ value : 'arg' ,
843+ } ,
844+ } ) ;
845+ } ) ;
846+
847+ it ( 'rejects @ Name . Name' , ( ) => {
848+ expect ( ( ) => parseSchemaCoordinate ( '@myDirective.field' ) )
849+ . to . throw ( )
850+ . to . deep . include ( {
851+ message : 'Syntax Error: Expected <EOF>, found ..' ,
852+ locations : [ { line : 1 , column : 13 } ] ,
853+ } ) ;
854+ } ) ;
855+
856+ it ( 'accepts a Source object' , ( ) => {
857+ expect ( parseSchemaCoordinate ( 'MyType' ) ) . to . deep . equal (
858+ parseSchemaCoordinate ( new Source ( 'MyType' ) ) ,
859+ ) ;
860+ } ) ;
861+ } ) ;
682862} ) ;
0 commit comments