Makes your GraphQL input optional, but not null!
It's common for Update mutations to accept a partial input, in order to do a partial update.
The simplest version of this is to simply omit the non-nullish (!
) operator in the input declaration, and not update anything that's nullish:
input UpdateUserInput {
firstName: String
lastName: String
country: String
# ...
}
The issue with this is that you lose the ability to say "if provided, this field cannot be null"
With a @nonNull
directive, you get this ability back:
input UpdateUserInput {
firstName: String @nonNull
lastName: String @nonNull
country: String
# ...
}
The @nonNull
directive cannot be used on Argument Definitions.
That is because, unlike in Object Inputs, GraphQL.js will always default optional arguments to null
.
Instead of:
# this does not work!
type Mutation {
updateUser(firstName: String @nonNull): User
}
Do:
# this works!
type Mutation {
updateUser(input: UpdateUserInput!): User
}
input UpdateUserInput {
firstName: String @nonNull
# ...
}
*NB: This library is built using graphql-tools and should be compatible with apollo
- Install from npm:
npm i @ephys/graphql-non-null-directive
- Declare the directive in your schema:
directive @nonNull on INPUT_FIELD_DEFINITION
- Declare the directive in your Apollo Server:
import { createNonNullDirective } from '@ephys/graphql-non-null-directive'; const server = new ApolloServer({ // ... schemaDirectives: { nonNull: createNonNullDirective({ // (optional) use this property to change the ID of the directive directiveName: 'nonNull', // (optional) use this property to configure how Input Errors are built // Input Errors are thrown when a @nonNull input received null.. buildInputError: (message: string) => { return new Error(message); }, }), }, });