Skip to content

Commit b62ef6f

Browse files
committed
feat: expose resolverFactory for manual resolver creation, eg. for cloned types: resolverFactory.findMany(UserModel, ClonedUserTC, opts) – it generates Resolver's types according to ClonedUserTC type and will use mongoose UserModel for making requests to DB
1 parent f67a39f commit b62ef6f

File tree

5 files changed

+34
-14
lines changed

5 files changed

+34
-14
lines changed

src/composeMongoose.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { SchemaComposer, Resolver } from 'graphql-compose';
22
import { schemaComposer as globalSchemaComposer, ObjectTypeComposer } from 'graphql-compose';
33
import type { Model, Document } from 'mongoose';
44
import { convertModelToGraphQL } from './fieldsConverter';
5-
import { allResolvers } from './resolvers';
5+
import { resolverFactory } from './resolvers';
66
import MongoID from './types/MongoID';
77
import {
88
prepareFields,
@@ -29,15 +29,15 @@ export type GenerateResolverType<TDoc extends Document, TContext = any> = {
2929
// Get all available resolver generators, then leave only 3rd arg – opts
3030
// because first two args will be attached via bind() method at runtime:
3131
// count = count.bind(undefined, model, tc);
32-
[resolver in keyof typeof allResolvers]: <TSource = any>(
33-
opts?: Parameters<typeof allResolvers[resolver]>[2]
32+
[resolver in keyof typeof resolverFactory]: <TSource = any>(
33+
opts?: Parameters<typeof resolverFactory[resolver]>[2]
3434
) => // Also we should patch generics of the returned Resolver
3535
// attach TContext TDoc from the code which will bind at runtime
3636
// and allow user to attach TSource via generic at call
3737
// For this case we are using `extends infer` construction
3838
// it helps to extract any Generic from existed method
3939
// and then construct new combined return type
40-
typeof allResolvers[resolver] extends (...args: any) => Resolver<any, any, infer TArgs, any>
40+
typeof resolverFactory[resolver] extends (...args: any) => Resolver<any, any, infer TArgs, any>
4141
? Resolver<TSource, TContext, TArgs, TDoc>
4242
: any;
4343
};
@@ -87,8 +87,8 @@ export function composeMongoose<TDoc extends Document, TContext = any>(
8787
tc.makeFieldNonNull('_id');
8888

8989
const mongooseResolvers = {} as any;
90-
Object.keys(allResolvers).forEach((name) => {
91-
mongooseResolvers[name] = (allResolvers as any)[name].bind(undefined, model, tc);
90+
Object.keys(resolverFactory).forEach((name) => {
91+
mongooseResolvers[name] = (resolverFactory as any)[name].bind(undefined, model, tc);
9292
});
9393
(tc as any).mongooseResolvers = mongooseResolvers;
9494

src/composeWithMongoose.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { ObjectTypeComposer, InputTypeComposer, SchemaComposer } from 'grap
44
import { schemaComposer as globalSchemaComposer } from 'graphql-compose';
55
import type { Model, Document } from 'mongoose';
66
import { convertModelToGraphQL } from './fieldsConverter';
7-
import { allResolvers, AllResolversOpts } from './resolvers';
7+
import { resolverFactory, AllResolversOpts } from './resolvers';
88
import MongoID from './types/MongoID';
99
import { GraphQLResolveInfo } from 'graphql';
1010

@@ -147,9 +147,9 @@ export function createResolvers(
147147
tc: ObjectTypeComposer<any, any>,
148148
opts: AllResolversOpts
149149
): void {
150-
(Object.keys(allResolvers) as any).forEach((resolverName: keyof typeof allResolvers) => {
150+
(Object.keys(resolverFactory) as any).forEach((resolverName: keyof typeof resolverFactory) => {
151151
if (!opts.hasOwnProperty(resolverName) || opts[resolverName] !== false) {
152-
const createResolverFn = allResolvers[resolverName] as any;
152+
const createResolverFn = resolverFactory[resolverName] as any;
153153
if (typeof createResolverFn === 'function') {
154154
const resolver = createResolverFn(model, tc, opts[resolverName] || {});
155155
if (resolver) {

src/discriminators/prepareBaseResolvers.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { Resolver } from 'graphql-compose';
2-
import { allResolvers } from '../resolvers';
2+
import { resolverFactory } from '../resolvers';
33
import { DiscriminatorTypeComposer } from './DiscriminatorTypeComposer';
44

55
// change type on DKey generated by composeWithMongoose
@@ -28,7 +28,7 @@ function setDKeyEnumOnITCArgs(resolver: Resolver, baseTC: DiscriminatorTypeCompo
2828
// Also sets up DKey enum as type for DKey field on composers with filter and/or record args
2929
// composeWithMongoose composers
3030
export function prepareBaseResolvers(baseTC: DiscriminatorTypeComposer<any, any>): void {
31-
Object.keys(allResolvers).forEach((resolverName) => {
31+
Object.keys(resolverFactory).forEach((resolverName) => {
3232
if (baseTC.hasResolver(resolverName)) {
3333
const resolver = baseTC.getResolver(resolverName);
3434

src/discriminators/prepareChildResolvers.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
ComposeWithMongooseDiscriminatorsOpts,
44
DiscriminatorTypeComposer,
55
} from './DiscriminatorTypeComposer';
6-
import { allResolvers } from '../resolvers';
6+
import { resolverFactory } from '../resolvers';
77

88
// set the DKey as a query on filter, also project it
99
// Also look at it like setting for filters, makes sure to limit
@@ -136,7 +136,7 @@ export function prepareChildResolvers<TSource, TContext>(
136136
childTC: ObjectTypeComposer<TSource, TContext>,
137137
opts: ComposeWithMongooseDiscriminatorsOpts<TContext>
138138
): void {
139-
Object.keys(allResolvers).forEach((resolverName) => {
139+
Object.keys(resolverFactory).forEach((resolverName) => {
140140
if (childTC.hasResolver(resolverName)) {
141141
const resolver = childTC.getResolver(resolverName);
142142

src/resolvers/index.ts

+21-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export type ExtendedResolveParams<TDoc extends Document = any, TContext = any> =
4848
model: Model<TDoc>;
4949
};
5050

51-
export const allResolvers = {
51+
export const resolverFactory = {
5252
count,
5353
findById,
5454
findByIds,
@@ -67,3 +67,23 @@ export const allResolvers = {
6767
pagination,
6868
connection,
6969
};
70+
71+
export {
72+
CountResolverOpts,
73+
FindByIdResolverOpts,
74+
FindByIdsResolverOpts,
75+
FindManyResolverOpts,
76+
FindOneResolverOpts,
77+
CreateManyResolverOpts,
78+
CreateOneResolverOpts,
79+
UpdateByIdResolverOpts,
80+
UpdateManyResolverOpts,
81+
UpdateOneResolverOpts,
82+
RemoveByIdResolverOpts,
83+
RemoveManyResolverOpts,
84+
RemoveOneResolverOpts,
85+
DataLoaderResolverOpts,
86+
DataLoaderManyResolverOpts,
87+
PaginationResolverOpts,
88+
ConnectionResolverOpts,
89+
};

0 commit comments

Comments
 (0)