Skip to content

Commit fd8f230

Browse files
committed
fix: clear cache for composeWithMongoose() if it is called several times for the same model, then need to generate new types
1 parent 70047b7 commit fd8f230

File tree

6 files changed

+19
-7
lines changed

6 files changed

+19
-7
lines changed

src/__tests__/composeWithMongoose-test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ describe('composeWithMongoose ->', () => {
153153
it('should be called if opts.resolvers not exists or has value', () => {
154154
const tc = composeWithMongoose(UserModel);
155155
expect(Array.from(tc.getResolvers().keys())).not.toHaveLength(0);
156-
const tc2 = composeWithMongoose(UserModel, { resolvers: {} });
156+
const tc2 = composeWithMongoose(UserModel, { resolvers: {}, name: 'User2' });
157157
expect(Array.from(tc2.getResolvers().keys())).not.toHaveLength(0);
158158
});
159159

src/__tests__/integration-test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ describe('integration tests', () => {
127127
let schema;
128128
let UserTC;
129129
beforeAll(async () => {
130+
schemaComposer.clear();
130131
UserTC = composeWithMongoose(UserModel);
131132
UserTC.addFields({
132133
rawData: {

src/composeWithMongoose.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,18 @@ export function composeWithMongoose<TSource, TContext>(
124124

125125
const sc = opts.schemaComposer || globalSchemaComposer;
126126
sc.add(MongoID);
127+
128+
if (sc.has(name)) {
129+
throw new Error(
130+
`You try to generate GraphQL Type with name ${name} from mongoose model but this type already exists in SchemaComposer. Please choose another type name "composeWithMongoose(model, { name: 'NewTypeName' })", or reuse existed type "schemaComposer.getOTC('TypeName')", or remove type from SchemaComposer before calling composeWithMongoose method "schemaComposer.delete('TypeName')".`
131+
);
132+
}
133+
if (sc.has(m.schema)) {
134+
// looks like you want to generate new TypeComposer from model
135+
// so remove cached model (which is used for cross-reference types)
136+
sc.delete(m.schema);
137+
}
138+
127139
const tc = convertModelToGraphQL((m: any), name, sc);
128140

129141
if (opts.description) {

src/discriminators/__tests__/DiscriminatorTypeComposer-test.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const { CharacterModel, PersonModel, DroidModel } = getCharacterModels('type');
1616

1717
describe('DiscriminatorTypeComposer', () => {
1818
it('should have as interface DInterface', () => {
19+
schemaComposer.clear();
1920
const baseDTC = composeWithMongooseDiscriminators(CharacterModel);
2021
expect(baseDTC.hasInterface(baseDTC.getDInterface())).toBeTruthy();
2122
});
@@ -483,6 +484,7 @@ describe('DiscriminatorTypeComposer', () => {
483484
let characterDTC;
484485

485486
beforeEach(() => {
487+
schemaComposer.clear();
486488
characterDTC = composeWithMongooseDiscriminators(CharacterModel);
487489
});
488490

src/discriminators/__tests__/prepareChildResolvers-test.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ describe('prepareChildResolvers()', () => {
1515
let PersonTC: ObjectTypeComposer<any, any>;
1616

1717
beforeAll(() => {
18+
schemaComposer.clear();
1819
PersonTC = composeWithMongooseDiscriminators(CharacterModel).discriminator(PersonModel);
1920
});
2021

@@ -54,6 +55,7 @@ describe('prepareChildResolvers()', () => {
5455
const interestArgs = ['filter', 'record', 'records'];
5556

5657
beforeAll(() => {
58+
schemaComposer.clear();
5759
const PersonTC = composeWithMongooseDiscriminators(CharacterModel).discriminator(PersonModel);
5860

5961
const resolvers = PersonTC.getResolvers();

src/fieldsConverter.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -130,12 +130,7 @@ export function convertModelToGraphQL<TSource, TContext>(
130130
}
131131

132132
// if model already has generated ObjectTypeComposer early, then return it
133-
if (sc.has(model.schema) && sc.has(typeName)) {
134-
if (sc.get(model.schema) !== sc.get(typeName)) {
135-
throw new Error(
136-
`You try to generate GrpahQL Type with name ${typeName} from mongoose model but this type already exists in SchemaComposer. Please choose another type name or remove existed type from schemaComposer.`
137-
);
138-
}
133+
if (sc.has(model.schema)) {
139134
return sc.getOTC(model.schema);
140135
}
141136

0 commit comments

Comments
 (0)