From ba0610bbd4578d8a82078014766f56d8ae5fcf7a Mon Sep 17 00:00:00 2001 From: Gil Gardosh Date: Mon, 6 Mar 2023 18:46:45 +0200 Subject: [PATCH] Custom mappers w. placeholder will apply omit (#9110) * Custom mappers w. placeholder will apply omit * enhancements * test fix * changeset * test fix --- .changeset/beige-guests-cheer.md | 6 +++ .../src/base-resolvers-visitor.ts | 42 ++++++++++--------- .../resolvers/tests/mapping.spec.ts | 10 ++--- 3 files changed, 33 insertions(+), 25 deletions(-) create mode 100644 .changeset/beige-guests-cheer.md diff --git a/.changeset/beige-guests-cheer.md b/.changeset/beige-guests-cheer.md new file mode 100644 index 00000000000..e68a6c526f3 --- /dev/null +++ b/.changeset/beige-guests-cheer.md @@ -0,0 +1,6 @@ +--- +'@graphql-codegen/visitor-plugin-common': patch +'@graphql-codegen/typescript-resolvers': patch +--- + +Custom mappers with placeholder will apply omit diff --git a/packages/plugins/other/visitor-plugin-common/src/base-resolvers-visitor.ts b/packages/plugins/other/visitor-plugin-common/src/base-resolvers-visitor.ts index b0a4409ff83..3590ec56237 100644 --- a/packages/plugins/other/visitor-plugin-common/src/base-resolvers-visitor.ts +++ b/packages/plugins/other/visitor-plugin-common/src/base-resolvers-visitor.ts @@ -716,7 +716,6 @@ export class BaseResolversVisitor< return prev; } - let shouldApplyOmit = false; const isRootType = this._rootTypeNames.has(typeName); const isMapped = this.config.mappers[typeName]; const isScalar = this.config.scalars[typeName]; @@ -727,7 +726,7 @@ export class BaseResolversVisitor< return prev; } - if (isMapped && this.config.mappers[typeName].type) { + if (isMapped && this.config.mappers[typeName].type && !hasPlaceholder(this.config.mappers[typeName].type)) { this.markMapperAsUsed(typeName); prev[typeName] = applyWrapper(this.config.mappers[typeName].type); } else if (isInterfaceType(schemaType)) { @@ -763,28 +762,31 @@ export class BaseResolversVisitor< } else if (isEnumType(schemaType)) { prev[typeName] = this.convertName(typeName, { useTypesPrefix: this.config.enumPrefix }, true); } else { - shouldApplyOmit = true; prev[typeName] = this.convertName(typeName, {}, true); - } - if (shouldApplyOmit && prev[typeName] !== 'any' && isObjectType(schemaType)) { - const relevantFields = this.getRelevantFieldsToOmit({ - schemaType, - getTypeToUse, - shouldInclude, - }); + if (prev[typeName] !== 'any' && isObjectType(schemaType)) { + const relevantFields = this.getRelevantFieldsToOmit({ + schemaType, + getTypeToUse, + shouldInclude, + }); - if (relevantFields.length > 0) { - // Puts ResolverTypeWrapper on top of an entire type - prev[typeName] = applyWrapper(this.replaceFieldsInType(prev[typeName], relevantFields)); - } else { - // We still want to use ResolverTypeWrapper, even if we don't touch any fields - prev[typeName] = applyWrapper(prev[typeName]); - } - } + // If relevantFields, puts ResolverTypeWrapper on top of an entire type + let internalType = + relevantFields.length > 0 ? this.replaceFieldsInType(prev[typeName], relevantFields) : prev[typeName]; - if (isMapped && hasPlaceholder(prev[typeName])) { - prev[typeName] = replacePlaceholder(prev[typeName], typeName); + if (isMapped) { + // replace the placeholder with the actual type + if (hasPlaceholder(internalType)) { + internalType = replacePlaceholder(internalType, typeName); + } + if (this.config.mappers[typeName].type && hasPlaceholder(this.config.mappers[typeName].type)) { + internalType = replacePlaceholder(this.config.mappers[typeName].type, internalType); + } + } + + prev[typeName] = applyWrapper(internalType); + } } if (!isMapped && hasDefaultMapper && hasPlaceholder(this.config.defaultMapper.type)) { diff --git a/packages/plugins/typescript/resolvers/tests/mapping.spec.ts b/packages/plugins/typescript/resolvers/tests/mapping.spec.ts index 4fe1acc0e6c..faac1ebe56c 100644 --- a/packages/plugins/typescript/resolvers/tests/mapping.spec.ts +++ b/packages/plugins/typescript/resolvers/tests/mapping.spec.ts @@ -473,7 +473,7 @@ describe('ResolversTypes', () => { `); expect(result.content).toBeSimilarStringTo(` export type ResolversTypes = { - MyType: ResolverTypeWrapper>; + MyType: ResolverTypeWrapper & { unionChild?: Maybe }>>; String: ResolverTypeWrapper; Child: ResolverTypeWrapper & { parent?: Maybe }>; MyOtherType: ResolverTypeWrapper; @@ -490,7 +490,7 @@ describe('ResolversTypes', () => { };`); expect(result.content).toBeSimilarStringTo(` export type ResolversParentTypes = { - MyType: CustomPartial; + MyType: CustomPartial & { unionChild?: Maybe }>; String: Scalars['String']; Child: Omit & { parent?: Maybe }; MyOtherType: MyOtherType; @@ -887,7 +887,7 @@ describe('ResolversTypes', () => { `); expect(result.content).toBeSimilarStringTo(` export type ResolversTypes = { - MyType: ResolverTypeWrapper>; + MyType: ResolverTypeWrapper & { unionChild?: Maybe }>>; String: ResolverTypeWrapper; Child: ResolverTypeWrapper & { parent?: Maybe }>; MyOtherType: ResolverTypeWrapper; @@ -1690,7 +1690,7 @@ describe('ResolversTypes', () => { `); expect(result.content).toBeSimilarStringTo(` export type ResolversTypes = { - MyType: ResolverTypeWrapper>; + MyType: ResolverTypeWrapper & { unionChild?: Maybe }>>; String: ResolverTypeWrapper>; Child: ResolverTypeWrapper & { parent?: Maybe }>>; MyOtherType: ResolverTypeWrapper>; @@ -1709,7 +1709,7 @@ describe('ResolversTypes', () => { expect(result.content).toBeSimilarStringTo(` export type ResolversParentTypes = { - MyType: MyNamespace.MyType; + MyType: MyNamespace.MyType & { unionChild?: Maybe }>; String: MyNamespace.MyDefaultMapper; Child: MyNamespace.MyDefaultMapper & { parent?: Maybe }>; MyOtherType: MyNamespace.MyDefaultMapper;