Skip to content

Commit 0ac071d

Browse files
committed
feat: improve typescript definitions
1 parent afaed47 commit 0ac071d

34 files changed

+234
-175
lines changed

src/__tests__/github_issues/260-test.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { schemaComposer, graphql } from 'graphql-compose';
22
import { composeWithMongoose } from '../../index';
33
import { mongoose } from '../../__mocks__/mongooseCommon';
4+
import { Document } from 'mongoose';
45

56
const UserSchema = new mongoose.Schema({
67
name: { type: String, required: true },
@@ -11,8 +12,18 @@ const PostSchema = new mongoose.Schema({
1112
reviewerIds: { type: [mongoose.Types.ObjectId] },
1213
});
1314

14-
const UserModel = mongoose.model('User', UserSchema);
15-
const PostModel = mongoose.model('Post', PostSchema);
15+
interface IUser extends Document {
16+
name: string;
17+
}
18+
19+
interface IPost extends Document {
20+
title: string;
21+
authorId?: mongoose.Types.ObjectId;
22+
reviewerIds?: [mongoose.Types.ObjectId];
23+
}
24+
25+
const UserModel = mongoose.model<IUser>('User', UserSchema);
26+
const PostModel = mongoose.model<IPost>('Post', PostSchema);
1627

1728
const UserTC = composeWithMongoose(UserModel);
1829
const PostTC = composeWithMongoose(PostModel);

src/composeWithMongoose.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ export type TypeConverterInputTypeOpts = {
3939
};
4040
};
4141

42-
export function composeWithMongoose<TSource = any, TContext = any>(
43-
model: Model<any>,
42+
export function composeWithMongoose<TDoc extends Document, TContext = any>(
43+
model: Model<TDoc>,
4444
opts: ComposeWithMongooseOpts<TContext> = {}
45-
): ObjectTypeComposer<TSource, TContext> {
45+
): ObjectTypeComposer<TDoc, TContext> {
4646
const m: Model<any> = model;
4747
const name: string = (opts && opts.name) || m.modelName;
4848

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { schemaComposer as globalSchemaComposer } from 'graphql-compose';
2-
import type { Model } from 'mongoose';
2+
import type { Model, Document } from 'mongoose';
33
import { ComposeWithMongooseDiscriminatorsOpts, DiscriminatorTypeComposer } from './discriminators';
44

55
export * from './discriminators';
66

7-
export function composeWithMongooseDiscriminators<TSource = any, TContext = any>(
8-
baseModel: Model<any>,
7+
export function composeWithMongooseDiscriminators<TDoc extends Document, TContext = any>(
8+
baseModel: Model<TDoc>,
99
opts?: ComposeWithMongooseDiscriminatorsOpts<TContext>
10-
): DiscriminatorTypeComposer<TSource, TContext> {
10+
): DiscriminatorTypeComposer<TDoc, TContext> {
1111
const sc = opts?.schemaComposer || globalSchemaComposer;
1212
return DiscriminatorTypeComposer.createFromModel(baseModel, sc, opts);
1313
}

src/fieldsConverter.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* eslint-disable no-use-before-define */
22

3-
import mongoose from 'mongoose';
3+
import mongoose, { Document } from 'mongoose';
44
import type { Schema, Model } from 'mongoose';
55
import type {
66
SchemaComposer,
@@ -130,11 +130,11 @@ export function getFieldsFromModel(model: Model<any> | MongoosePseudoModelT): Mo
130130
return fields;
131131
}
132132

133-
export function convertModelToGraphQL<TSource, TContext>(
134-
model: Model<any> | MongoosePseudoModelT,
133+
export function convertModelToGraphQL<TDoc extends Document, TContext>(
134+
model: Model<TDoc> | MongoosePseudoModelT,
135135
typeName: string,
136136
schemaComposer: SchemaComposer<TContext>
137-
): ObjectTypeComposer<TSource, TContext> {
137+
): ObjectTypeComposer<TDoc, TContext> {
138138
const sc = schemaComposer;
139139

140140
if (!typeName) {

src/resolvers/connection.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type {
66
ObjectTypeComposerFieldConfigMap,
77
} from 'graphql-compose';
88
import { getUniqueIndexes, extendByReversedIndexes, IndexT } from '../utils/getIndexesFromModel';
9+
import { ArgsMap } from './helpers';
910

1011
export type ConnectionOpts<TContext = any> = _ConnectionSortMapOpts & {
1112
edgeFields?: ObjectTypeComposerFieldConfigMap<any, TContext>;
@@ -15,11 +16,11 @@ export type ConnectionOpts<TContext = any> = _ConnectionSortMapOpts & {
1516
edgeTypeName?: string;
1617
};
1718

18-
export default function connection<TSource = Document, TContext = any>(
19-
model: Model<any>,
20-
tc: ObjectTypeComposer<TSource, TContext>,
19+
export default function connection<TSource = any, TContext = any, TDoc extends Document = any>(
20+
model: Model<TDoc>,
21+
tc: ObjectTypeComposer<TDoc, TContext>,
2122
opts?: ConnectionOpts<TContext>
22-
): Resolver<TSource, TContext> | undefined {
23+
): Resolver<TSource, TContext, ArgsMap, TDoc> | undefined {
2324
try {
2425
require.resolve('graphql-compose-connection');
2526
} catch (e) {

src/resolvers/count.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,24 @@
11
import type { Resolver, ObjectTypeComposer } from 'graphql-compose';
22
import type { Model, Document } from 'mongoose';
3-
import { filterHelper, filterHelperArgs, prepareAliases, FilterHelperArgsOpts } from './helpers';
3+
import {
4+
filterHelper,
5+
filterHelperArgs,
6+
prepareAliases,
7+
FilterHelperArgsOpts,
8+
ArgsMap,
9+
} from './helpers';
410
import type { ExtendedResolveParams } from './index';
511
import { beforeQueryHelper } from './helpers/beforeQueryHelper';
612

713
export interface CountResolverOpts {
814
filter?: FilterHelperArgsOpts | false;
915
}
1016

11-
export default function count<TSource = Document, TContext = any>(
12-
model: Model<any>,
13-
tc: ObjectTypeComposer<TSource, TContext>,
17+
export default function count<TSource = any, TContext = any, TDoc extends Document = any>(
18+
model: Model<TDoc>,
19+
tc: ObjectTypeComposer<TDoc, TContext>,
1420
opts?: CountResolverOpts
15-
): Resolver<TSource, TContext> {
21+
): Resolver<TSource, TContext, ArgsMap, TDoc> {
1622
if (!model || !model.modelName || !model.schema) {
1723
throw new Error('First arg for Resolver count() should be instance of Mongoose Model.');
1824
}
@@ -34,7 +40,7 @@ export default function count<TSource = Document, TContext = any>(
3440
...opts?.filter,
3541
}),
3642
},
37-
resolve: ((resolveParams: ExtendedResolveParams) => {
43+
resolve: ((resolveParams: ExtendedResolveParams<TDoc>) => {
3844
resolveParams.query = model.find();
3945
resolveParams.model = model;
4046
filterHelper(resolveParams, aliases);
@@ -48,5 +54,5 @@ export default function count<TSource = Document, TContext = any>(
4854
return beforeQueryHelper(resolveParams);
4955
}
5056
}) as any,
51-
});
57+
}) as any;
5258
}

src/resolvers/createMany.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
import type { ObjectTypeComposer, Resolver } from 'graphql-compose';
22
import type { Model, Document } from 'mongoose';
3-
import { recordHelperArgs, RecordHelperArgsOpts } from './helpers';
3+
import { recordHelperArgs, RecordHelperArgsOpts, ArgsMap } from './helpers';
44
import { addErrorCatcherField } from './helpers/errorCatcher';
55
import { validateManyAndThrow } from './helpers/validate';
66

77
export interface CreateManyResolverOpts {
88
records?: RecordHelperArgsOpts | false;
99
}
1010

11-
export default function createMany<TSource = Document, TContext = any>(
12-
model: Model<any>,
13-
tc: ObjectTypeComposer<TSource, TContext>,
11+
export default function createMany<TSource = any, TContext = any, TDoc extends Document = any>(
12+
model: Model<TDoc>,
13+
tc: ObjectTypeComposer<TDoc, TContext>,
1414
opts?: CreateManyResolverOpts
15-
): Resolver<TSource, TContext, any> {
15+
): Resolver<TSource, TContext, ArgsMap, TDoc> {
1616
if (!model || !model.modelName || !model.schema) {
1717
throw new Error('First arg for Resolver createMany() should be instance of Mongoose Model.');
1818
}
@@ -88,18 +88,18 @@ export default function createMany<TSource = Document, TContext = any>(
8888
}
8989
}
9090

91-
const docs = [];
91+
const docs = [] as TDoc[];
9292
for (const record of recordData) {
9393
// eslint-disable-next-line new-cap
94-
let doc: Document = new model(record);
94+
let doc = new model(record);
9595
if (resolveParams.beforeRecordMutate) {
9696
doc = await resolveParams.beforeRecordMutate(doc, resolveParams);
9797
}
9898
docs.push(doc);
9999
}
100100

101101
await validateManyAndThrow(docs);
102-
await model.create(docs, { validateBeforeSave: false });
102+
await model.create(docs as any, { validateBeforeSave: false });
103103

104104
return {
105105
records: docs,
@@ -113,5 +113,5 @@ export default function createMany<TSource = Document, TContext = any>(
113113
// and return it in mutation payload
114114
addErrorCatcherField(resolver);
115115

116-
return resolver;
116+
return resolver as any;
117117
}

src/resolvers/createOne.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Resolver, ObjectTypeComposer } from 'graphql-compose';
22
import type { Model, Document } from 'mongoose';
3-
import { recordHelperArgs, RecordHelperArgsOpts } from './helpers';
3+
import { recordHelperArgs, RecordHelperArgsOpts, ArgsMap } from './helpers';
44
import type { ExtendedResolveParams } from './index';
55
import { addErrorCatcherField } from './helpers/errorCatcher';
66
import { validateAndThrow } from './helpers/validate';
@@ -9,11 +9,11 @@ export interface CreateOneResolverOpts {
99
record?: RecordHelperArgsOpts | false;
1010
}
1111

12-
export default function createOne<TSource = Document, TContext = any>(
13-
model: Model<any>,
14-
tc: ObjectTypeComposer<TSource, TContext>,
12+
export default function createOne<TSource = any, TContext = any, TDoc extends Document = any>(
13+
model: Model<TDoc>,
14+
tc: ObjectTypeComposer<TDoc, TContext>,
1515
opts?: CreateOneResolverOpts
16-
): Resolver<TSource, TContext> {
16+
): Resolver<TSource, TContext, ArgsMap, TDoc> {
1717
if (!model || !model.modelName || !model.schema) {
1818
throw new Error('First arg for Resolver createOne() should be instance of Mongoose Model.');
1919
}
@@ -64,7 +64,7 @@ export default function createOne<TSource = Document, TContext = any>(
6464
...(opts && opts.record),
6565
}),
6666
},
67-
resolve: (async (resolveParams: ExtendedResolveParams) => {
67+
resolve: (async (resolveParams: ExtendedResolveParams<TDoc>) => {
6868
const recordData = resolveParams?.args?.record;
6969

7070
if (!(typeof recordData === 'object') || Object.keys(recordData).length === 0) {
@@ -73,7 +73,7 @@ export default function createOne<TSource = Document, TContext = any>(
7373
);
7474
}
7575

76-
let doc: Document = new model(recordData);
76+
let doc = new model(recordData);
7777
if (resolveParams.beforeRecordMutate) {
7878
doc = await resolveParams.beforeRecordMutate(doc, resolveParams);
7979
if (!doc) return null;
@@ -92,5 +92,5 @@ export default function createOne<TSource = Document, TContext = any>(
9292
// and return it in mutation payload
9393
addErrorCatcherField(resolver);
9494

95-
return resolver;
95+
return resolver as any;
9696
}

src/resolvers/dataLoader.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import type { Resolver, ObjectTypeComposer } from 'graphql-compose';
22
import type { Model, Document } from 'mongoose';
3-
import { projectionHelper, prepareAliases } from './helpers';
3+
import { projectionHelper, prepareAliases, ArgsMap } from './helpers';
44
import type { ExtendedResolveParams } from './index';
55
import { beforeQueryHelper } from './helpers/beforeQueryHelper';
66
import { getDataLoader } from './helpers/dataLoaderHelper';
77

8-
export default function dataLoader<TSource = Document, TContext = any>(
9-
model: Model<any>,
10-
tc: ObjectTypeComposer<TSource, TContext>
11-
): Resolver<TSource, TContext> {
8+
export default function dataLoader<TSource = any, TContext = any, TDoc extends Document = any>(
9+
model: Model<TDoc>,
10+
tc: ObjectTypeComposer<TDoc, TContext>
11+
): Resolver<TSource, TContext, ArgsMap, TDoc> {
1212
if (!model || !model.modelName || !model.schema) {
1313
throw new Error('First arg for Resolver dataLoader() should be instance of Mongoose Model.');
1414
}
@@ -28,7 +28,7 @@ export default function dataLoader<TSource = Document, TContext = any>(
2828
args: {
2929
_id: 'MongoID!',
3030
},
31-
resolve: ((resolveParams: ExtendedResolveParams) => {
31+
resolve: ((resolveParams: ExtendedResolveParams<TDoc>) => {
3232
const args = resolveParams.args || {};
3333

3434
if (!args._id) {
@@ -44,7 +44,7 @@ export default function dataLoader<TSource = Document, TContext = any>(
4444
const dl = getDataLoader(resolveParams.context, resolveParams.info, (ids) => {
4545
resolveParams.query = model.find({
4646
_id: { $in: ids },
47-
});
47+
} as any);
4848
resolveParams.model = model;
4949
projectionHelper(resolveParams, aliases);
5050
return beforeQueryHelper(resolveParams) || [];

src/resolvers/dataLoaderLean.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
import type { Resolver, ObjectTypeComposer } from 'graphql-compose';
22
import type { Model, Document } from 'mongoose';
3-
import { projectionHelper, prepareAliases, prepareAliasesReverse, replaceAliases } from './helpers';
3+
import {
4+
projectionHelper,
5+
prepareAliases,
6+
prepareAliasesReverse,
7+
replaceAliases,
8+
ArgsMap,
9+
} from './helpers';
410
import type { ExtendedResolveParams } from './index';
511
import { beforeQueryHelperLean } from './helpers/beforeQueryHelper';
612
import { getDataLoader } from './helpers/dataLoaderHelper';
713

8-
export default function dataLoaderLean<TSource = Document, TContext = any>(
9-
model: Model<any>,
10-
tc: ObjectTypeComposer<TSource, TContext>
11-
): Resolver<TSource, TContext> {
14+
export default function dataLoaderLean<TSource = any, TContext = any, TDoc extends Document = any>(
15+
model: Model<TDoc>,
16+
tc: ObjectTypeComposer<TDoc, TContext>
17+
): Resolver<TSource, TContext, ArgsMap, TDoc> {
1218
if (!model || !model.modelName || !model.schema) {
1319
throw new Error(
1420
'First arg for Resolver dataLoaderLean() should be instance of Mongoose Model.'
@@ -31,7 +37,7 @@ export default function dataLoaderLean<TSource = Document, TContext = any>(
3137
args: {
3238
_id: 'MongoID!',
3339
},
34-
resolve: ((resolveParams: ExtendedResolveParams) => {
40+
resolve: ((resolveParams: ExtendedResolveParams<TDoc>) => {
3541
const args = resolveParams.args || {};
3642

3743
if (!args._id) {
@@ -47,7 +53,7 @@ export default function dataLoaderLean<TSource = Document, TContext = any>(
4753
const dl = getDataLoader(resolveParams.context, resolveParams.info, async (ids) => {
4854
resolveParams.query = model.find({
4955
_id: { $in: ids },
50-
});
56+
} as any);
5157
resolveParams.model = model;
5258
projectionHelper(resolveParams, aliases);
5359
const result = (await beforeQueryHelperLean(resolveParams)) || [];

0 commit comments

Comments
 (0)