https://github.com/ephys/graphql-non-null-directive
Allow an input to be undefined, but not null (useful for partial update mutations)
https://github.com/ephys/graphql-non-null-directive
Last synced: 9 months ago
JSON representation
Allow an input to be undefined, but not null (useful for partial update mutations)
- Host: GitHub
- URL: https://github.com/ephys/graphql-non-null-directive
- Owner: ephys
- Created: 2021-06-26T10:30:24.000Z (about 5 years ago)
- Default Branch: main
- Last Pushed: 2022-01-19T15:18:25.000Z (over 4 years ago)
- Last Synced: 2025-08-07T16:02:13.061Z (11 months ago)
- Language: TypeScript
- Size: 82 KB
- Stars: 1
- Watchers: 1
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# graphql-non-null-directive
Makes your GraphQL input optional, but not null!
## The problem
[GraphQL Thread from 2018](https://github.com/graphql/graphql-spec/issues/542)
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:
```graphql
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:
```graphql
input UpdateUserInput {
firstName: String @nonNull
lastName: String @nonNull
country: String
# ...
}
```
### Caveats
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:
```graphql
# this does not work!
type Mutation {
updateUser(firstName: String @nonNull): User
}
```
Do:
```graphql
# this works!
type Mutation {
updateUser(input: UpdateUserInput!): User
}
input UpdateUserInput {
firstName: String @nonNull
# ...
}
```
## Usage
**NB: This library is built using graphql-tools and should be compatible with apollo*
- Install from npm: [`npm i @ephys/graphql-non-null-directive`](https://www.npmjs.com/package/@ephys/graphql-non-null-directive)
- Declare the directive in your schema:
```graphql
directive @nonNull on INPUT_FIELD_DEFINITION
```
- Declare the directive in your Apollo Server:
```typescript
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);
},
}),
},
});
```