Table of Contents
The Context Object
Whereas the Build object is the same for all hooks (except the build hook
which constructs it) within an individual build, the Context object changes
for each hook. Different hooks have different values available to them on the
Context object and sadly we've not documented all these yet so you may have to
do some inspection!
The main ones are:
scope
An object based on the third argument to newWithHooks or fieldWithHooks -
this is useful for filtering which objects a particular hook should apply to.
For deeper hooks (such as GraphQLObjectType:fields:field) the scope from
shallower hooks (such as GraphQLObjectType) are merged in.
For example you might use a hook such as this to add a description to the
clientMutationId field on all mutation input objects:
builder.hook(
"GraphQLInputObjectType:fields:field",
(field, { extend }, { scope: { isMutationInput, fieldName } }) => {
if (
!isMutationInput || fieldName !== "clientMutationId" ||
field.description != null ) { return field; } return extend(field, { description:
"An arbitrary string value with no semantic meaning. " +
"Will be included in the payload verbatim. " +
"May be used to track mutations by the client.",
});
}
);Self
Whilst only available on hooks that are called after the object is created (e.g.
GraphQLObjectType:fields), this field is useful because it contains the object
that has been created; allowing circular references to be built. A common
use-case for this is the root Query object referencing itself with the query
field to work around some issues in Relay 1.
fieldWithHooks(fieldName, spec, scope = {})
Available on hooks GraphQLObjectType:fields and
GraphQLInputObjectType:fields, this function is useful for adding hooks early
(for example if you need to call addDataGenerator(...)). If you don't call
this, it will be called for you at a later time.
builder.hook("GraphQLInputObjectType:fields",
(
fields,
{ extend, resolveAlias },
{ fieldWithHooks } ) => {
// TODO: if (...) return fields;
return extend(fields, {
id: fieldWithHooks("id", ({ addDataGenerator }) => { addDataGenerator(({ alias }) => { return { map: obj => ({ [alias]: obj.ID }), }; }); return { type: new GraphQLNonNull(GraphQLString), resolve: resolveAlias, }; }), };
},
});See also: Look ahead.