Skip to content

Commit 0aa78f6

Browse files
committed
RFC: Directive location: schema definition (#382)
This allows directives to be defined on schema definitions.
1 parent 1b6824b commit 0aa78f6

File tree

10 files changed

+37
-9
lines changed

10 files changed

+37
-9
lines changed

src/language/ast.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ export type TypeSystemDefinition = SchemaDefinition
268268
export type SchemaDefinition = {
269269
kind: 'SchemaDefinition';
270270
loc?: ?Location;
271+
directives: Array<Directive>;
271272
operationTypes: Array<OperationTypeDefinition>;
272273
}
273274

src/language/parser.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -701,13 +701,14 @@ function parseTypeSystemDefinition(parser: Parser): TypeSystemDefinition {
701701
}
702702

703703
/**
704-
* SchemaDefinition : schema { OperationTypeDefinition+ }
704+
* SchemaDefinition : schema Directives? { OperationTypeDefinition+ }
705705
*
706706
* OperationTypeDefinition : OperationType : NamedType
707707
*/
708708
function parseSchemaDefinition(parser: Parser): SchemaDefinition {
709709
const start = parser.token.start;
710710
expectKeyword(parser, 'schema');
711+
const directives = parseDirectives(parser);
711712
const operationTypes = many(
712713
parser,
713714
TokenKind.BRACE_L,
@@ -716,6 +717,7 @@ function parseSchemaDefinition(parser: Parser): SchemaDefinition {
716717
);
717718
return {
718719
kind: SCHEMA_DEFINITION,
720+
directives,
719721
operationTypes,
720722
loc: loc(parser, start),
721723
};

src/language/printer.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,12 @@ const printDocASTReducer = {
9494

9595
// Type System Definitions
9696

97-
SchemaDefinition: ({ operationTypes }) =>
98-
'schema ' + block(operationTypes),
97+
SchemaDefinition: ({ directives, operationTypes }) =>
98+
join([
99+
'schema',
100+
join(directives, ' '),
101+
block(operationTypes),
102+
], ' '),
99103

100104
OperationTypeDefinition: ({ operation, type }) =>
101105
operation + ': ' + type,

src/language/visitor.js

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

41-
SchemaDefinition: [ 'operationTypes' ],
41+
SchemaDefinition: [ 'directives', 'operationTypes' ],
4242
OperationTypeDefinition: [ 'type' ],
4343

4444
ScalarTypeDefinition: [ 'name', 'directives' ],

src/type/directives.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export const DirectiveLocation = {
2828
FRAGMENT_SPREAD: 'FRAGMENT_SPREAD',
2929
INLINE_FRAGMENT: 'INLINE_FRAGMENT',
3030
// Schema Definitions
31+
SCHEMA: 'SCHEMA',
3132
SCALAR: 'SCALAR',
3233
OBJECT: 'OBJECT',
3334
FIELD_DEFINITION: 'FIELD_DEFINITION',

src/type/introspection.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@ export const __DirectiveLocation = new GraphQLEnumType({
149149
value: DirectiveLocation.INLINE_FRAGMENT,
150150
description: 'Location adjacent to an inline fragment.'
151151
},
152+
SCHEMA: {
153+
value: DirectiveLocation.SCHEMA,
154+
description: 'Location adjacent to a schema definition.'
155+
},
152156
SCALAR: {
153157
value: DirectiveLocation.SCALAR,
154158
description: 'Location adjacent to a scalar definition.'

src/utilities/__tests__/schemaPrinter-test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,7 @@ enum __DirectiveLocation {
620620
FRAGMENT_DEFINITION
621621
FRAGMENT_SPREAD
622622
INLINE_FRAGMENT
623+
SCHEMA
623624
SCALAR
624625
OBJECT
625626
FIELD_DEFINITION

src/validation/__tests__/KnownDirectives-test.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@ describe('Validate: Known directives', () => {
149149
input MyInput @onInputObject {
150150
myField: Int @onInputFieldDefinition
151151
}
152+
153+
schema @onSchema {
154+
query: MyQuery
155+
}
152156
`);
153157
});
154158

@@ -173,6 +177,10 @@ describe('Validate: Known directives', () => {
173177
input MyInput @onEnum {
174178
myField: Int @onArgumentDefinition
175179
}
180+
181+
schema @onObject {
182+
query: MyQuery
183+
}
176184
`, [
177185
misplacedDirective('onInterface', 'OBJECT', 2, 43),
178186
misplacedDirective('onInputFieldDefinition', 'ARGUMENT_DEFINITION', 3, 30),
@@ -186,6 +194,7 @@ describe('Validate: Known directives', () => {
186194
misplacedDirective('onUnion', 'ENUM_VALUE', 15, 20),
187195
misplacedDirective('onEnum', 'INPUT_OBJECT', 18, 23),
188196
misplacedDirective('onArgumentDefinition', 'INPUT_FIELD_DEFINITION', 19, 24),
197+
misplacedDirective('onObject', 'SCHEMA', 22, 16),
189198
]);
190199
});
191200

src/validation/__tests__/harness.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,10 @@ export const testSchema = new GraphQLSchema({
336336
name: 'onInlineFragment',
337337
locations: [ 'INLINE_FRAGMENT' ],
338338
}),
339+
new GraphQLDirective({
340+
name: 'onSchema',
341+
locations: [ 'SCHEMA' ],
342+
}),
339343
new GraphQLDirective({
340344
name: 'onScalar',
341345
locations: [ 'SCALAR' ],

src/validation/rules/KnownDirectives.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,16 @@ import {
1717
FRAGMENT_SPREAD,
1818
INLINE_FRAGMENT,
1919
OPERATION_DEFINITION,
20-
ENUM_TYPE_DEFINITION,
21-
ENUM_VALUE_DEFINITION,
20+
SCHEMA_DEFINITION,
21+
SCALAR_TYPE_DEFINITION,
22+
OBJECT_TYPE_DEFINITION,
2223
FIELD_DEFINITION,
23-
INPUT_OBJECT_TYPE_DEFINITION,
2424
INPUT_VALUE_DEFINITION,
2525
INTERFACE_TYPE_DEFINITION,
26-
OBJECT_TYPE_DEFINITION,
27-
SCALAR_TYPE_DEFINITION,
2826
UNION_TYPE_DEFINITION,
27+
ENUM_TYPE_DEFINITION,
28+
ENUM_VALUE_DEFINITION,
29+
INPUT_OBJECT_TYPE_DEFINITION,
2930
} from '../../language/kinds';
3031
import { DirectiveLocation } from '../../type/directives';
3132

@@ -91,6 +92,7 @@ function getDirectiveLocationForASTPath(ancestors) {
9192
case FRAGMENT_SPREAD: return DirectiveLocation.FRAGMENT_SPREAD;
9293
case INLINE_FRAGMENT: return DirectiveLocation.INLINE_FRAGMENT;
9394
case FRAGMENT_DEFINITION: return DirectiveLocation.FRAGMENT_DEFINITION;
95+
case SCHEMA_DEFINITION: return DirectiveLocation.SCHEMA;
9496
case SCALAR_TYPE_DEFINITION: return DirectiveLocation.SCALAR;
9597
case OBJECT_TYPE_DEFINITION: return DirectiveLocation.OBJECT;
9698
case FIELD_DEFINITION: return DirectiveLocation.FIELD_DEFINITION;

0 commit comments

Comments
 (0)