2.2.0 • Published 1 year ago

@oly_op/graphql-create-resolver v2.2.0

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

graphql-create-resolver

A simple utility that assists you in creating your GraphQL resolver functions.

Can be used in any 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

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:

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:

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

import { GraphQLResolveInfo } from "graphql";

type CreateResolverCheckContextFunction<C> = (context: C) => void;

interface CreateResolverParameter<P, A, C> {
	args: A;
	parent: P;
	context: C;
	info: GraphQLResolveInfo;
}

type CreateResolverCallback<P, A, C, R> = (
	props: CreateResolverParameter<P, A, C>,
) => R | Promise<R>;

type creteRootResolver = <C = undefined>(
	checkContextFunction?: CreateResolverCheckContextFunction<C>,
) => <P = undefined>() => <R, A = undefined>(
	callback: CreateResolverCallback<P, A, C, R>,
	checkContext?: boolean,
) => (parent: P, args: A, context: C, info: GraphQLResolveInfo) => R | Promise<R>;

Examples

Apollo Server Fastify:

import { ApolloServer } from "apollo-server-fastify";

const apollo = new ApolloServer({
	context,
	typeDefs,
	resolvers: {
		Query: {
			helloWorld: helloWorldQueryResolver,
		},
	},
});

Example with Context and Args typings:

import { createRootResolver } from "@oly_op/graphql-create-resolver";

interface Context {
	database: SomeDataBaseClient;
}

const createResolver = createRootResolver<Context>();

const queryResolver = createResolver();

interface Args {
	greetingWord: string;
}

const greetingQueryResolver = resolver<string, Args>(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:

import { createRootResolver } from "@oly_op/graphql-create-resolver";
import { AuthenticationError } from "apollo-server-fastify";

interface Context {
	authorization?: string;
	database: SomeDataBaseClient;
}

const createResolver = createRootResolver<Context>(({ authorization }) => {
	if (authorization === undefined) {
		throw new AuthenticationError("Token error");
	}
});

interface User {
	name: string;
	userID: string;
}

const userResolver = createResolver<User>();

interface Args {
	showPrivatePlaylists: string;
}

const userPlaylistsResolver = resolver<Playlist[], Args>(({ parent, context, args, info }) => {
	const { userID } = parent;
	const { database } = context;
	const { showPrivatePlaylists } = args;
	return database.getUserPlaylists(userID, { showPrivatePlaylists });
});

const resolvers = {
	User: {
		userPlaylists: userPlaylistsResolver,
	},
};
2.2.0

1 year ago

2.1.1

1 year ago

2.1.0

1 year ago

2.0.2

2 years ago

1.2.0

2 years ago

1.1.0

2 years ago

1.2.2

2 years ago

1.2.1

2 years ago

2.0.1

2 years ago

2.0.0

2 years ago

1.0.7

2 years ago

1.0.6

2 years ago

1.0.5

2 years ago

1.0.4

2 years ago

1.0.3

2 years ago

1.0.2

2 years ago

1.0.1

2 years ago

1.0.0

2 years ago