Skip to content

Commit 2fc8ea8

Browse files
committed
Add directives to FieldDefinition
1 parent a6bcc75 commit 2fc8ea8

File tree

7 files changed

+134
-5
lines changed

7 files changed

+134
-5
lines changed

src/language/__tests__/kitchen-sink.graphql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,7 @@ fragment frag on Friend {
5555
unnamed(truthy: true, falsey: false),
5656
query
5757
}
58+
59+
extend type User {
60+
name: String @iAmDirective(default: "Foo")
61+
}

src/language/__tests__/printer.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ fragment frag on Friend {
9797
unnamed(truthy: true, falsey: false)
9898
query
9999
}
100+
101+
extend type User {
102+
name: String @iAmDirective(default: "Foo")
103+
}
100104
`);
101105

102106
});

src/language/__tests__/schema-parser.js

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,30 @@ function nameNode(name, loc) {
4242
};
4343
}
4444

45+
function directiveNode(name, args, loc) {
46+
return {
47+
kind: 'Directive',
48+
name,
49+
arguments: args,
50+
loc
51+
};
52+
}
53+
4554
function fieldNode(name, type, loc) {
4655
return fieldNodeWithArgs(name, type, [], loc);
4756
}
4857

4958
function fieldNodeWithArgs(name, type, args, loc) {
59+
return fieldNodeWithArgsAndDirectives(name, type, args, [], loc);
60+
}
61+
62+
function fieldNodeWithArgsAndDirectives(name, type, args, directives, loc) {
5063
return {
5164
kind: 'FieldDefinition',
5265
name,
5366
arguments: args,
5467
type,
68+
directives,
5569
loc,
5670
};
5771
}
@@ -541,4 +555,83 @@ input Hello {
541555
expect(() => parse(body)).to.throw('Error');
542556
});
543557

558+
it('Simple fields with directives', () => {
559+
var body = `
560+
type Hello {
561+
world: String @mock(value: "hello")
562+
hello: Int @mock(value: 2) @ignore
563+
}`;
564+
var doc = parse(body);
565+
var loc = createLocFn(body);
566+
var expected = {
567+
kind: 'Document',
568+
definitions: [
569+
{
570+
kind: 'ObjectTypeDefinition',
571+
name: nameNode('Hello', loc(6, 11)),
572+
interfaces: [],
573+
fields: [
574+
fieldNodeWithArgsAndDirectives(
575+
nameNode('world', loc(16, 21)),
576+
typeNode('String', loc(23, 29)),
577+
[],
578+
[
579+
directiveNode(
580+
nameNode('mock', loc(31, 35)),
581+
[
582+
{
583+
kind: 'Argument',
584+
name: nameNode('value', loc(36, 41)),
585+
value: {
586+
kind: 'StringValue',
587+
value: 'hello',
588+
loc: loc(43, 50),
589+
},
590+
loc: loc(36, 50),
591+
}
592+
],
593+
loc(30, 51)
594+
),
595+
],
596+
loc(16, 51)
597+
),
598+
fieldNodeWithArgsAndDirectives(
599+
nameNode('hello', loc(54, 59)),
600+
typeNode('Int', loc(61, 64)),
601+
[],
602+
[
603+
directiveNode(
604+
nameNode('mock', loc(66, 70)),
605+
[
606+
{
607+
kind: 'Argument',
608+
name: nameNode('value', loc(71, 76)),
609+
value: {
610+
kind: 'IntValue',
611+
value: '2',
612+
loc: loc(78, 79),
613+
},
614+
loc: loc(71, 79),
615+
}
616+
],
617+
loc(65, 80)
618+
),
619+
directiveNode(
620+
nameNode('ignore', loc(82, 88)),
621+
[],
622+
loc(81, 88)
623+
),
624+
],
625+
loc(54, 88)
626+
)
627+
],
628+
loc: loc(1, 90),
629+
}
630+
],
631+
loc: loc(1, 90),
632+
};
633+
expect(printJson(doc)).to.equal(printJson(expected));
634+
});
635+
636+
544637
});

src/language/__tests__/visitor.js

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,32 @@ describe('Visitor', () => {
547547
[ 'leave', 'Field', 1, undefined ],
548548
[ 'leave', 'SelectionSet', 'selectionSet', 'OperationDefinition' ],
549549
[ 'leave', 'OperationDefinition', 4, undefined ],
550-
[ 'leave', 'Document', undefined, undefined ] ]);
550+
[ 'enter', 'TypeExtensionDefinition', 5, undefined ],
551+
[ 'enter', 'ObjectTypeDefinition', 'definition', 'TypeExtensionDefinition' ],
552+
[ 'enter', 'Name', 'name', 'ObjectTypeDefinition' ],
553+
[ 'leave', 'Name', 'name', 'ObjectTypeDefinition' ],
554+
[ 'enter', 'FieldDefinition', 0, undefined ],
555+
[ 'enter', 'Name', 'name', 'FieldDefinition' ],
556+
[ 'leave', 'Name', 'name', 'FieldDefinition' ],
557+
[ 'enter', 'NamedType', 'type', 'FieldDefinition' ],
558+
[ 'enter', 'Name', 'name', 'NamedType' ],
559+
[ 'leave', 'Name', 'name', 'NamedType' ],
560+
[ 'leave', 'NamedType', 'type', 'FieldDefinition' ],
561+
[ 'enter', 'Directive', 0, undefined ],
562+
[ 'enter', 'Name', 'name', 'Directive' ],
563+
[ 'leave', 'Name', 'name', 'Directive' ],
564+
[ 'enter', 'Argument', 0, undefined ],
565+
[ 'enter', 'Name', 'name', 'Argument' ],
566+
[ 'leave', 'Name', 'name', 'Argument' ],
567+
[ 'enter', 'StringValue', 'value', 'Argument' ],
568+
[ 'leave', 'StringValue', 'value', 'Argument' ],
569+
[ 'leave', 'Argument', 0, undefined ],
570+
[ 'leave', 'Directive', 0, undefined ],
571+
[ 'leave', 'FieldDefinition', 0, undefined ],
572+
[ 'leave', 'ObjectTypeDefinition', 'definition', 'TypeExtensionDefinition' ],
573+
[ 'leave', 'TypeExtensionDefinition', 5, undefined ],
574+
[ 'leave', 'Document', undefined, undefined ],
575+
]);
551576
});
552577

553578
describe('visitInParallel', () => {

src/language/parser.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -709,19 +709,21 @@ function parseImplementsInterfaces(parser): Array<NamedType> {
709709
}
710710

711711
/**
712-
* FieldDefinition : Name ArgumentsDefinition? : Type
712+
* FieldDefinition : Name ArgumentsDefinition? : Type Directives?
713713
*/
714714
function parseFieldDefinition(parser): FieldDefinition {
715715
var start = parser.token.start;
716716
var name = parseName(parser);
717717
var args = parseArgumentDefs(parser);
718718
expect(parser, TokenKind.COLON);
719719
var type = parseType(parser);
720+
var directives = parseDirectives(parser);
720721
return {
721722
kind: FIELD_DEFINITION,
722723
name,
723724
arguments: args,
724725
type,
726+
directives,
725727
loc: loc(parser, start),
726728
};
727729
}

src/language/printer.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,9 @@ var printDocASTReducer = {
9696
wrap('implements ', join(interfaces, ', '), ' ') +
9797
block(fields),
9898

99-
FieldDefinition: ({ name, arguments: args, type }) =>
100-
name + wrap('(', join(args, ', '), ')') + ': ' + type,
99+
FieldDefinition: ({ name, arguments: args, type, directives }) =>
100+
name + wrap('(', join(args, ', '), ')') + ': ' +
101+
type + wrap(' ', join(directives, ' ')),
101102

102103
InputValueDefinition: ({ name, type, defaultValue }) =>
103104
name + ': ' + type + wrap(' = ', defaultValue),

src/language/visitor.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export var QueryDocumentKeys = {
3939
NonNullType: [ 'type' ],
4040

4141
ObjectTypeDefinition: [ 'name', 'interfaces', 'fields' ],
42-
FieldDefinition: [ 'name', 'arguments', 'type' ],
42+
FieldDefinition: [ 'name', 'arguments', 'type', 'directives' ],
4343
InputValueDefinition: [ 'name', 'type', 'defaultValue' ],
4444
InterfaceTypeDefinition: [ 'name', 'fields' ],
4545
UnionTypeDefinition: [ 'name', 'types' ],

0 commit comments

Comments
 (0)