https://github.com/olyop/graphql-create-resolver
https://github.com/olyop/graphql-create-resolver
Last synced: about 1 year ago
JSON representation
- Host: GitHub
- URL: https://github.com/olyop/graphql-create-resolver
- Owner: olyop
- License: mit
- Created: 2021-12-20T23:54:45.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2022-12-25T11:46:35.000Z (over 3 years ago)
- Last Synced: 2025-03-29T04:41:31.221Z (about 1 year ago)
- Language: TypeScript
- Size: 28.3 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
- License: LICENSE
Awesome Lists containing this project
README
# graphql-create-resolver
A simple utility that assists you in creating your GraphQL resolver functions.
Can be used in any [GraphQL.js](https://graphql.org/graphql-js/) server integration.
### Features
- If you use TypeScript, it allows you to type the four resolver function arguments `(parent, args, context, info)` easily with Generics and only once!
- Allows you to check the context in every resolvers using the `checkContext` function. This can be useful if you want to check the authentication/authorization for all resolvers.
## Installation
```bash
npm i @oly_op/graphql-create-resolver
```
## TypeScript Support
This package contains built-in TypeScript definitions.
## Getting Started
You first have to create a root create resolver function:
```typescript
import { createRootResolver } from "@oly_op/graphql-create-resolver";
const createResolver = createRootResolver();
```
Then for each root resolver field you have to create a new createResolver function.
Here is the where you could parse in the parent type to the resolver.
For example for the Query field:
```typescript
const queryResolver = createResolver();
const helloWorldQueryResolver = resolver(({ parent, context, args, info }) => "Hello World!");
```
`helloWorldQueryResolver` is a function with the standard resolver signature `(parent, context, args, info) => any` ready to be parsed into in any GraphQL framework.
## Usage with TypeScript
```typescript
import { GraphQLResolveInfo } from "graphql";
type CreateResolverCheckContextFunction = (context: C) => void;
interface CreateResolverParameter
{
args: A;
parent: P;
context: C;
info: GraphQLResolveInfo;
}
type CreateResolverCallback
= (
props: CreateResolverParameter
,
) => R | Promise;
type creteRootResolver = (
checkContextFunction?: CreateResolverCheckContextFunction,
) =>
() => (
callback: CreateResolverCallback
,
checkContext?: boolean,
) => (parent: P, args: A, context: C, info: GraphQLResolveInfo) => R | Promise;
```
## Examples
### Apollo Server Fastify:
```typescript
import { ApolloServer } from "apollo-server-fastify";
const apollo = new ApolloServer({
context,
typeDefs,
resolvers: {
Query: {
helloWorld: helloWorldQueryResolver,
},
},
});
```
### Example with Context and Args typings:
```typescript
import { createRootResolver } from "@oly_op/graphql-create-resolver";
interface Context {
database: SomeDataBaseClient;
}
const createResolver = createRootResolver();
const queryResolver = createResolver();
interface Args {
greetingWord: string;
}
const greetingQueryResolver = resolver(async ({ parent, context, args, info }) => {
const { database } = context;
const { greetingWord } = args;
const userName = await database.getUser();
return `${greetingWord} ${userName}`;
});
const resolvers = {
Query: {
greeting: greetingQueryResolver,
},
};
```
### Example with Context and Parent typings:
```typescript
import { createRootResolver } from "@oly_op/graphql-create-resolver";
import { AuthenticationError } from "apollo-server-fastify";
interface Context {
authorization?: string;
database: SomeDataBaseClient;
}
const createResolver = createRootResolver(({ authorization }) => {
if (authorization === undefined) {
throw new AuthenticationError("Token error");
}
});
interface User {
name: string;
userID: string;
}
const userResolver = createResolver();
interface Args {
showPrivatePlaylists: string;
}
const userPlaylistsResolver = resolver(({ parent, context, args, info }) => {
const { userID } = parent;
const { database } = context;
const { showPrivatePlaylists } = args;
return database.getUserPlaylists(userID, { showPrivatePlaylists });
});
const resolvers = {
User: {
userPlaylists: userPlaylistsResolver,
},
};
```