Skip to content

Commit 9157529

Browse files
committed
buildSchema can lookup for type field resolvers
1 parent a9a21f3 commit 9157529

File tree

2 files changed

+45
-8
lines changed

2 files changed

+45
-8
lines changed

src/utilities/buildASTSchema.js

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import {
4646
type GraphQLArgumentConfig,
4747
type GraphQLEnumValueConfig,
4848
type GraphQLInputFieldConfig,
49+
type GraphQLFieldResolver,
4950
GraphQLScalarType,
5051
GraphQLObjectType,
5152
GraphQLInterfaceType,
@@ -72,6 +73,10 @@ import {
7273
GraphQLSchema,
7374
} from '../type/schema';
7475

76+
export type TypeFieldResolverMap = ObjMap<
77+
ObjMap<GraphQLFieldResolver<mixed, mixed, mixed>>,
78+
>;
79+
7580
export type BuildSchemaOptions = {
7681
...GraphQLSchemaValidationOptions,
7782

@@ -92,6 +97,13 @@ export type BuildSchemaOptions = {
9297
*/
9398
assumeValidSDL?: boolean,
9499

100+
/**
101+
* Object map of object maps to resolver funtions.
102+
*
103+
* Default: undefined
104+
*/
105+
resolvers?: TypeFieldResolverMap,
106+
95107
...
96108
};
97109

@@ -243,14 +255,26 @@ export class ASTDefinitionBuilder {
243255
});
244256
}
245257

246-
buildField(field: FieldDefinitionNode): GraphQLFieldConfig<mixed, mixed> {
258+
buildField(
259+
field: FieldDefinitionNode,
260+
typeName?: string,
261+
): GraphQLFieldConfig<mixed, mixed> {
262+
const resolve =
263+
(typeName &&
264+
this._options &&
265+
this._options.resolvers &&
266+
this._options.resolvers[typeName] &&
267+
this._options.resolvers[typeName][field.name.value]) ||
268+
undefined;
269+
247270
return {
248271
// Note: While this could make assertions to get the correctly typed
249272
// value, that would throw immediately while type system validation
250273
// with validateSchema() will produce more actionable results.
251274
type: (this.getWrappedType(field.type): any),
252275
description: getDescription(field, this._options),
253276
args: keyByNameNode(field.arguments || [], arg => this.buildArg(arg)),
277+
resolve,
254278
deprecationReason: getDeprecationReason(field),
255279
astNode: field,
256280
};
@@ -330,13 +354,15 @@ export class ASTDefinitionBuilder {
330354
? () => interfaceNodes.map(ref => (this.getNamedType(ref): any))
331355
: [];
332356

357+
const name = astNode.name.value;
358+
333359
const fields =
334360
fieldNodes && fieldNodes.length > 0
335-
? () => keyByNameNode(fieldNodes, field => this.buildField(field))
361+
? () => keyByNameNode(fieldNodes, field => this.buildField(field, name))
336362
: Object.create(null);
337363

338364
return new GraphQLObjectType({
339-
name: astNode.name.value,
365+
name,
340366
description: getDescription(astNode, this._options),
341367
interfaces,
342368
fields,
@@ -346,14 +372,15 @@ export class ASTDefinitionBuilder {
346372

347373
_makeInterfaceDef(astNode: InterfaceTypeDefinitionNode) {
348374
const fieldNodes = astNode.fields;
375+
const name = astNode.name.value;
349376

350377
const fields =
351378
fieldNodes && fieldNodes.length > 0
352-
? () => keyByNameNode(fieldNodes, field => this.buildField(field))
379+
? () => keyByNameNode(fieldNodes, field => this.buildField(field, name))
353380
: Object.create(null);
354381

355382
return new GraphQLInterfaceType({
356-
name: astNode.name.value,
383+
name,
357384
description: getDescription(astNode, this._options),
358385
fields,
359386
astNode,

src/utilities/extendSchema.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import inspect from '../jsutils/inspect';
66
import invariant from '../jsutils/invariant';
77
import mapValue from '../jsutils/mapValue';
88
import keyValMap from '../jsutils/keyValMap';
9-
import { ASTDefinitionBuilder } from './buildASTSchema';
9+
import {
10+
type TypeFieldResolverMap,
11+
ASTDefinitionBuilder,
12+
} from './buildASTSchema';
1013
import { assertValidSDLExtension } from '../validation/validate';
1114
import {
1215
type GraphQLSchemaValidationOptions,
@@ -70,6 +73,13 @@ type Options = {|
7073
* Default: false
7174
*/
7275
assumeValidSDL?: boolean,
76+
77+
/**
78+
* Object map of object maps to resolver funtions.
79+
*
80+
* Default: undefined
81+
*/
82+
resolvers?: TypeFieldResolverMap,
7383
|};
7484

7585
/**
@@ -341,7 +351,7 @@ export function extendSchema(
341351
...keyValMap(
342352
fieldNodes,
343353
node => node.name.value,
344-
node => astBuilder.buildField(node),
354+
node => astBuilder.buildField(node, config.name),
345355
),
346356
}),
347357
extensionASTNodes: config.extensionASTNodes.concat(extensions),
@@ -362,7 +372,7 @@ export function extendSchema(
362372
...keyValMap(
363373
fieldNodes,
364374
node => node.name.value,
365-
node => astBuilder.buildField(node),
375+
node => astBuilder.buildField(node, config.name),
366376
),
367377
}),
368378
extensionASTNodes: config.extensionASTNodes.concat(extensions),

0 commit comments

Comments
 (0)