Skip to content

Commit 0dcc2c2

Browse files
authored
feat: add mongoose 7 compatibility (by @meabed)
* chore: fix mongoose 7 compatibility * chore: fix mongoose 7 compatibility * chore: format * chore: fix import * chore: fix validate * chore: fix validate * chore: update package.json * chore: update mongoose and typescript * chore: fix validate * chore: fix test * chore: fix test * chore: fix test * chore: fix test * chore: update dependencies * chore: update dependencies * chore: fix typescript * chore: fix typescript * chore: update github actions * chore: update github actions * chore: update github actions * fix: update jest * chore: update jest, release and github actions * chore: github actions * chore: update test
1 parent 91cdfd0 commit 0dcc2c2

File tree

13 files changed

+2404
-4007
lines changed

13 files changed

+2404
-4007
lines changed

.github/workflows/nodejs.yml

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,22 @@ on: [push, pull_request]
88
jobs:
99
tests:
1010
runs-on: ubuntu-latest
11+
permissions:
12+
packages: write
13+
contents: write
1114
strategy:
1215
matrix:
13-
node-version: [14.x, 16.x]
16+
node-version: [14.x, 16.x, 18.x]
1417
steps:
15-
- uses: actions/checkout@v2
18+
- run: echo "🎉 The job was triggered by a ${{ github.event_name }} event."
19+
- uses: styfle/[email protected]
20+
with:
21+
workflow_id: nodejs.yml
22+
access_token: ${{ secrets.GITHUB_TOKEN }}
23+
- uses: FranzDiebold/github-env-vars-action@v2
24+
- uses: actions/checkout@v3
1625
- name: Use Node.js ${{ matrix.node-version }}
17-
uses: actions/setup-node@v1
26+
uses: actions/setup-node@v3
1827
with:
1928
node-version: ${{ matrix.node-version }}
2029
- name: Install node_modules
@@ -23,10 +32,14 @@ jobs:
2332
run: yarn test
2433
env:
2534
CI: true
26-
- name: Testing with previous mongoose versions
27-
run: yarn test-prev-vers
35+
- name: Testing with previous mongoose versions 6
36+
run: yarn test-prev-vers-6
37+
env:
38+
CI: true
39+
- name: Testing with previous mongoose versions 5
40+
run: yarn test-prev-vers-5
2841
env:
29-
CI: true
42+
CI: true
3043
- name: Send codecov.io stats
3144
if: matrix.node-version == '14.x'
3245
run: bash <(curl -s https://codecov.io/bash) || echo ''
@@ -35,18 +48,21 @@ jobs:
3548
if: github.ref == 'refs/heads/master' || github.ref == 'refs/heads/alpha' || github.ref == 'refs/heads/beta'
3649
needs: [tests]
3750
runs-on: ubuntu-latest
51+
permissions:
52+
packages: write
53+
contents: write
3854
steps:
39-
- uses: actions/checkout@v2
55+
- uses: actions/checkout@v3
4056
- name: Use Node.js 14
41-
uses: actions/setup-node@v1
57+
uses: actions/setup-node@v3
4258
with:
4359
node-version: 14.x
4460
- name: Install node_modules
4561
run: yarn install
4662
- name: Build
4763
run: yarn build
4864
- name: Semantic Release (publish to npm)
49-
run: yarn semantic-release
65+
run: npx semantic-release@19
5066
env:
5167
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
5268
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

package.json

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,34 +24,33 @@
2424
},
2525
"homepage": "https://github.com/graphql-compose/graphql-compose-mongoose",
2626
"dependencies": {
27-
"dataloader": "^2.0.0",
27+
"dataloader": "^2.2.2",
2828
"graphql-compose-connection": "8.2.1",
2929
"graphql-compose-pagination": "8.3.0"
3030
},
3131
"peerDependencies": {
3232
"graphql-compose": "^7.21.4 || ^8.0.0 || ^9.0.0",
33-
"mongoose": "^6.0.0 || ^5.0.0 || ^4.4.0"
33+
"mongoose": "^7.0.0 || ^6.0.0 || ^5.0.0 || ^4.4.0"
3434
},
3535
"devDependencies": {
36-
"@types/jest": "27.0.3",
37-
"@typescript-eslint/eslint-plugin": "5.7.0",
38-
"@typescript-eslint/parser": "5.7.0",
39-
"eslint": "8.4.1",
36+
"@types/jest": "28.1.8",
37+
"@typescript-eslint/eslint-plugin": "5.54.0",
38+
"@typescript-eslint/parser": "5.54.0",
39+
"eslint": "8.35.0",
4040
"eslint-config-airbnb-base": "15.0.0",
41-
"eslint-config-prettier": "8.3.0",
42-
"eslint-plugin-import": "2.25.3",
43-
"eslint-plugin-prettier": "4.0.0",
44-
"graphql": "16.1.0",
45-
"graphql-compose": "9.0.5",
46-
"jest": "27.4.5",
47-
"mongodb-memory-server": "8.0.4",
48-
"mongoose": "6.1.2",
49-
"prettier": "2.5.1",
41+
"eslint-config-prettier": "8.6.0",
42+
"eslint-plugin-import": "2.27.5",
43+
"eslint-plugin-prettier": "4.2.1",
44+
"graphql": "16.6.0",
45+
"graphql-compose": "9.0.10",
46+
"jest": "28.1.3",
47+
"mongodb-memory-server": "8.11.5",
48+
"mongoose": "7.0.0",
49+
"prettier": "2.8.4",
5050
"request": "2.88.2",
51-
"rimraf": "3.0.2",
52-
"semantic-release": "18.0.1",
53-
"ts-jest": "27.1.1",
54-
"typescript": "4.5.4"
51+
"rimraf": "4.1.3",
52+
"ts-jest": "28.0.8",
53+
"typescript": "4.9.5"
5554
},
5655
"scripts": {
5756
"prepare": "tsc -p ./tsconfig.build.json",
@@ -65,6 +64,7 @@
6564
"link": "yarn build && yarn link graphql-compose && yarn link graphql-compose-connection && yarn link graphql-compose-pagination && yarn link mongoose && yarn link",
6665
"unlink": "rimraf node_modules && yarn install",
6766
"semantic-release": "semantic-release",
68-
"test-prev-vers": "yarn add [email protected] --dev --ignore-scripts && yarn coverage && git checkout HEAD -- package.json yarn.lock"
67+
"test-prev-vers-6": "yarn add [email protected] --dev --ignore-scripts && yarn coverage && git checkout HEAD -- package.json yarn.lock",
68+
"test-prev-vers-5": "yarn add [email protected] --dev --ignore-scripts && yarn coverage && git checkout HEAD -- package.json yarn.lock"
6969
}
7070
}

src/composeMongoose.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,14 @@ export type GenerateResolverType<TDoc extends Document, TContext = any> = {
8686
// because first two args will be attached via bind() method at runtime:
8787
// count = count.bind(undefined, model, tc);
8888
[resolver in keyof typeof resolverFactory]: <TSource = any>(
89-
opts?: Parameters<typeof resolverFactory[resolver]>[2]
89+
opts?: Parameters<(typeof resolverFactory)[resolver]>[2]
9090
) => // Also we should patch generics of the returned Resolver
9191
// attach TContext TDoc from the code which will bind at runtime
9292
// and allow user to attach TSource via generic at call
9393
// For this case we are using `extends infer` construction
9494
// it helps to extract any Generic from existed method
9595
// and then construct new combined return type
96-
typeof resolverFactory[resolver] extends (...args: any) => Resolver<any, any, infer TArgs, any>
96+
(typeof resolverFactory)[resolver] extends (...args: any) => Resolver<any, any, infer TArgs, any>
9797
? Resolver<TSource, TContext, TArgs, TDoc>
9898
: any;
9999
};

src/fieldsConverter.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ export function deriveComplexType(field: MongooseFieldT): ComplexTypes {
289289
return ComplexTypes.ARRAY;
290290
} else if (field instanceof mongoose.Schema.Types.Mixed) {
291291
return ComplexTypes.MIXED;
292-
} else if (fieldType === 'ObjectID') {
292+
} else if (fieldType === 'ObjectID' || fieldType === 'ObjectId') {
293293
return ComplexTypes.REFERENCE;
294294
} else if (fieldType === 'Decimal128') {
295295
return ComplexTypes.DECIMAL;
@@ -317,6 +317,7 @@ export function scalarToGraphQL(field: MongooseFieldT): ComposeScalarType {
317317
return 'Buffer';
318318
case 'Boolean':
319319
return 'Boolean';
320+
case 'ObjectId':
320321
case 'ObjectID':
321322
return 'MongoID';
322323
default:

src/resolvers/__tests__/count-test.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { UserModel } from '../../__mocks__/userModel';
44
import { count } from '../count';
55
import { convertModelToGraphQL } from '../../fieldsConverter';
66
import { ExtendedResolveParams } from '..';
7+
import { version } from 'mongoose';
78

89
beforeAll(() => UserModel.base.createConnection());
910
afterAll(() => UserModel.base.disconnect());
@@ -102,21 +103,21 @@ describe('count() ->', () => {
102103
beforeQuery: (query: any, rp: ExtendedResolveParams) => {
103104
expect(query).toHaveProperty('exec');
104105
expect(rp.model).toBe(UserModel);
105-
106106
// modify query before execution
107107
return query.limit(1);
108108
},
109109
});
110-
111110
expect(mongooseActions).toEqual([
112111
[
113112
'users',
114113
'countDocuments',
115114
{},
116-
{
117-
limit: 1,
118-
},
119-
],
115+
version.startsWith('7')
116+
? undefined
117+
: {
118+
limit: 1,
119+
},
120+
].filter(Boolean),
120121
]);
121122

122123
expect(result).toBe(1);

src/resolvers/__tests__/removeById-test.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import GraphQLMongoID from '../../types/MongoID';
88
import { convertModelToGraphQL } from '../../fieldsConverter';
99
import { ExtendedResolveParams } from '..';
1010
import { testFieldConfig } from '../../utils/testHelpers';
11+
import { version } from 'mongoose';
1112

1213
beforeAll(() => UserModel.base.createConnection());
1314
afterAll(() => UserModel.base.disconnect());
@@ -187,7 +188,12 @@ describe('removeById() ->', () => {
187188
const result = await removeById(UserModel, UserTC).resolve(resolveParams);
188189

189190
expect(mongooseActions).toEqual([
190-
['users', 'findOne', { _id: user._id, gender: 'some' }, { projection: {} }],
191+
[
192+
'users',
193+
'findOne',
194+
{ _id: user._id, gender: 'some' },
195+
version.startsWith('7') ? undefined : { projection: {} },
196+
].filter(Boolean),
191197
]);
192198

193199
expect(result).toBeNull();

src/resolvers/helpers/filterOperators.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export const availableOperators = [
1818
'exists',
1919
] as const;
2020

21-
export type AllowedOperatorsName = typeof availableOperators[number];
21+
export type AllowedOperatorsName = (typeof availableOperators)[number];
2222

2323
/**
2424
* Customize operators filtering or disable it at all.

src/resolvers/helpers/validate.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { Error as MongooseError } from 'mongoose';
22
import type { Document } from 'mongoose';
3+
import { version as MongooseVersion } from 'mongoose';
34
import { ValidationError } from '../../errors';
45

56
export type ValidationErrorData = {
@@ -19,9 +20,9 @@ export type ValidationsWithMessage = {
1920
};
2021

2122
export async function validateDoc(doc: Document): Promise<ValidationsWithMessage | null> {
22-
const validations: MongooseError.ValidationError | null = await new Promise((resolve) => {
23-
doc.validate(resolve as any);
24-
});
23+
const validations: MongooseError.ValidationError | null = MongooseVersion.startsWith('7')
24+
? doc.validateSync()
25+
: await new Promise((resolve) => doc.validate(resolve as any));
2526

2627
return validations?.errors
2728
? {

src/resolvers/removeById.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,11 @@ export function removeById<TSource = any, TContext = any, TDoc extends Document
7474
doc = await resolveParams.beforeRecordMutate(doc, resolveParams);
7575
}
7676
if (doc) {
77-
await doc.remove();
77+
if ('remove' in doc && typeof doc.remove === 'function' && !doc.remove.length) {
78+
await doc.remove();
79+
} else {
80+
await doc.deleteOne();
81+
}
7882

7983
return {
8084
record: doc,

src/resolvers/removeMany.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,15 @@ export function removeMany<TSource = any, TContext = any, TDoc extends Document
8989
resolveParams.query = resolveParams.query.deleteMany();
9090
} else {
9191
// old mongoose
92-
resolveParams.query = resolveParams.query.remove();
92+
if (
93+
'remove' in resolveParams.query &&
94+
typeof resolveParams.query.remove === 'function' &&
95+
!resolveParams.query.remove.length
96+
) {
97+
resolveParams.query = resolveParams.query.remove();
98+
} else {
99+
resolveParams.query = resolveParams.query.deleteOne();
100+
}
93101
}
94102

95103
const res = await beforeQueryHelper(resolveParams);

0 commit comments

Comments
 (0)