@graphql-codegen/visitor-plugin-common 5.4.0 → 5.5.0-alpha-20241008120609-5103ffdfd3b1dde3243e745e73922d58be0c104f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -42,6 +42,9 @@ class BaseResolversVisitor extends base_visitor_js_1.BaseVisitor {
42
42
  mappers: (0, mappers_js_1.transformMappers)(rawConfig.mappers || {}, rawConfig.mapperTypeSuffix),
43
43
  scalars: (0, utils_js_1.buildScalarsFromConfig)(_schema, rawConfig, defaultScalars),
44
44
  internalResolversPrefix: (0, utils_js_1.getConfigValue)(rawConfig.internalResolversPrefix, '__'),
45
+ generateInternalResolversIfNeeded: {
46
+ __resolveReference: rawConfig.generateInternalResolversIfNeeded?.__resolveReference ?? false,
47
+ },
45
48
  resolversNonOptionalTypename: normalizeResolversNonOptionalTypename((0, utils_js_1.getConfigValue)(rawConfig.resolversNonOptionalTypename, false)),
46
49
  ...additionalConfig,
47
50
  });
@@ -60,7 +63,6 @@ class BaseResolversVisitor extends base_visitor_js_1.BaseVisitor {
60
63
  this._rootTypeNames = new Set();
61
64
  this._globalDeclarations = new Set();
62
65
  this._hasScalars = false;
63
- this._hasFederation = false;
64
66
  this._checkedTypesWithNestedAbstractTypes = {};
65
67
  this._shouldMapType = {};
66
68
  (0, auto_bind_1.default)(this);
@@ -501,7 +503,7 @@ class BaseResolversVisitor extends base_visitor_js_1.BaseVisitor {
501
503
  return this._hasScalars;
502
504
  }
503
505
  hasFederation() {
504
- return this._hasFederation;
506
+ return Object.keys(this._federation.getMeta()).length > 0;
505
507
  }
506
508
  getRootResolver() {
507
509
  const name = this.convertName(this.config.allResolversTypeName);
@@ -517,7 +519,13 @@ class BaseResolversVisitor extends base_visitor_js_1.BaseVisitor {
517
519
  .map(schemaTypeName => {
518
520
  const resolverType = this._collectedResolvers[schemaTypeName];
519
521
  if (resolverType.baseGeneratedTypename) {
520
- userDefinedTypes[schemaTypeName] = { name: resolverType.baseGeneratedTypename };
522
+ userDefinedTypes[schemaTypeName] = {
523
+ name: resolverType.baseGeneratedTypename,
524
+ };
525
+ const federationMeta = this._federation.getMeta()[schemaTypeName];
526
+ if (federationMeta) {
527
+ userDefinedTypes[schemaTypeName].federation = federationMeta;
528
+ }
521
529
  }
522
530
  return (0, utils_js_1.indent)(this.formatRootResolver(schemaTypeName, resolverType.typename, declarationKind));
523
531
  })
@@ -647,7 +655,14 @@ class BaseResolversVisitor extends base_visitor_js_1.BaseVisitor {
647
655
  genericTypes: [mappedTypeKey, parentTypeSignature, contextType, argsType].filter(f => f),
648
656
  };
649
657
  if (this._federation.isResolveReferenceField(node)) {
650
- this._hasFederation = true;
658
+ if (this.config.generateInternalResolversIfNeeded.__resolveReference) {
659
+ const federationDetails = (0, plugin_helpers_1.checkObjectTypeFederationDetails)(parentType.astNode, this._schema);
660
+ if (!federationDetails || federationDetails.resolvableKeyDirectives.length === 0) {
661
+ return '';
662
+ }
663
+ signature.modifier = ''; // if a federation type has resolvable @key, then it should be required
664
+ }
665
+ this._federation.setMeta(parentType.name, { hasResolveReference: true });
651
666
  signature.type = 'ReferenceResolver';
652
667
  if (signature.genericTypes.length >= 3) {
653
668
  signature.genericTypes = signature.genericTypes.slice(0, 3);
@@ -1,4 +1,4 @@
1
- import { ApolloFederation, getBaseType } from '@graphql-codegen/plugin-helpers';
1
+ import { ApolloFederation, checkObjectTypeFederationDetails, getBaseType } from '@graphql-codegen/plugin-helpers';
2
2
  import { getRootTypeNames } from '@graphql-tools/utils';
3
3
  import autoBind from 'auto-bind';
4
4
  import { GraphQLObjectType, isEnumType, isInterfaceType, isNonNullType, isObjectType, isUnionType, } from 'graphql';
@@ -38,6 +38,9 @@ export class BaseResolversVisitor extends BaseVisitor {
38
38
  mappers: transformMappers(rawConfig.mappers || {}, rawConfig.mapperTypeSuffix),
39
39
  scalars: buildScalarsFromConfig(_schema, rawConfig, defaultScalars),
40
40
  internalResolversPrefix: getConfigValue(rawConfig.internalResolversPrefix, '__'),
41
+ generateInternalResolversIfNeeded: {
42
+ __resolveReference: rawConfig.generateInternalResolversIfNeeded?.__resolveReference ?? false,
43
+ },
41
44
  resolversNonOptionalTypename: normalizeResolversNonOptionalTypename(getConfigValue(rawConfig.resolversNonOptionalTypename, false)),
42
45
  ...additionalConfig,
43
46
  });
@@ -56,7 +59,6 @@ export class BaseResolversVisitor extends BaseVisitor {
56
59
  this._rootTypeNames = new Set();
57
60
  this._globalDeclarations = new Set();
58
61
  this._hasScalars = false;
59
- this._hasFederation = false;
60
62
  this._checkedTypesWithNestedAbstractTypes = {};
61
63
  this._shouldMapType = {};
62
64
  autoBind(this);
@@ -497,7 +499,7 @@ export class BaseResolversVisitor extends BaseVisitor {
497
499
  return this._hasScalars;
498
500
  }
499
501
  hasFederation() {
500
- return this._hasFederation;
502
+ return Object.keys(this._federation.getMeta()).length > 0;
501
503
  }
502
504
  getRootResolver() {
503
505
  const name = this.convertName(this.config.allResolversTypeName);
@@ -513,7 +515,13 @@ export class BaseResolversVisitor extends BaseVisitor {
513
515
  .map(schemaTypeName => {
514
516
  const resolverType = this._collectedResolvers[schemaTypeName];
515
517
  if (resolverType.baseGeneratedTypename) {
516
- userDefinedTypes[schemaTypeName] = { name: resolverType.baseGeneratedTypename };
518
+ userDefinedTypes[schemaTypeName] = {
519
+ name: resolverType.baseGeneratedTypename,
520
+ };
521
+ const federationMeta = this._federation.getMeta()[schemaTypeName];
522
+ if (federationMeta) {
523
+ userDefinedTypes[schemaTypeName].federation = federationMeta;
524
+ }
517
525
  }
518
526
  return indent(this.formatRootResolver(schemaTypeName, resolverType.typename, declarationKind));
519
527
  })
@@ -643,7 +651,14 @@ export class BaseResolversVisitor extends BaseVisitor {
643
651
  genericTypes: [mappedTypeKey, parentTypeSignature, contextType, argsType].filter(f => f),
644
652
  };
645
653
  if (this._federation.isResolveReferenceField(node)) {
646
- this._hasFederation = true;
654
+ if (this.config.generateInternalResolversIfNeeded.__resolveReference) {
655
+ const federationDetails = checkObjectTypeFederationDetails(parentType.astNode, this._schema);
656
+ if (!federationDetails || federationDetails.resolvableKeyDirectives.length === 0) {
657
+ return '';
658
+ }
659
+ signature.modifier = ''; // if a federation type has resolvable @key, then it should be required
660
+ }
661
+ this._federation.setMeta(parentType.name, { hasResolveReference: true });
647
662
  signature.type = 'ReferenceResolver';
648
663
  if (signature.genericTypes.length >= 3) {
649
664
  signature.genericTypes = signature.genericTypes.slice(0, 3);
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@graphql-codegen/visitor-plugin-common",
3
- "version": "5.4.0",
3
+ "version": "5.5.0-alpha-20241008120609-5103ffdfd3b1dde3243e745e73922d58be0c104f",
4
4
  "peerDependencies": {
5
5
  "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0"
6
6
  },
7
7
  "dependencies": {
8
8
  "@graphql-tools/optimize": "^2.0.0",
9
- "@graphql-codegen/plugin-helpers": "^5.0.4",
9
+ "@graphql-codegen/plugin-helpers": "5.1.0-alpha-20241008120609-5103ffdfd3b1dde3243e745e73922d58be0c104f",
10
10
  "@graphql-tools/relay-operation-optimizer": "^7.0.0",
11
11
  "@graphql-tools/utils": "^10.0.0",
12
12
  "auto-bind": "~4.0.0",
@@ -2,7 +2,7 @@ import { ApolloFederation } from '@graphql-codegen/plugin-helpers';
2
2
  import { ASTNode, DirectiveDefinitionNode, EnumTypeDefinitionNode, FieldDefinitionNode, GraphQLNamedType, GraphQLObjectType, GraphQLSchema, InputValueDefinitionNode, InterfaceTypeDefinitionNode, ListTypeNode, NamedTypeNode, NameNode, NonNullTypeNode, ObjectTypeDefinitionNode, ScalarTypeDefinitionNode, UnionTypeDefinitionNode } from 'graphql';
3
3
  import { BaseVisitor, BaseVisitorConvertOptions, ParsedConfig, RawConfig } from './base-visitor.cjs';
4
4
  import { ParsedMapper } from './mappers.cjs';
5
- import { AvoidOptionalsConfig, ConvertOptions, DeclarationKind, EnumValuesMap, NormalizedAvoidOptionalsConfig, NormalizedScalarsMap, ParsedEnumValuesMap, ResolversNonOptionalTypenameConfig } from './types.cjs';
5
+ import { AvoidOptionalsConfig, ConvertOptions, DeclarationKind, EnumValuesMap, type NormalizedGenerateInternalResolversIfNeededConfig, type GenerateInternalResolversIfNeededConfig, NormalizedAvoidOptionalsConfig, NormalizedScalarsMap, ParsedEnumValuesMap, ResolversNonOptionalTypenameConfig } from './types.cjs';
6
6
  import { DeclarationBlockConfig } from './utils.cjs';
7
7
  import { OperationVariablesToObject } from './variables-to-object.cjs';
8
8
  export interface ParsedResolversConfig extends ParsedConfig {
@@ -27,11 +27,26 @@ export interface ParsedResolversConfig extends ParsedConfig {
27
27
  resolverTypeSuffix: string;
28
28
  allResolversTypeName: string;
29
29
  internalResolversPrefix: string;
30
+ generateInternalResolversIfNeeded: NormalizedGenerateInternalResolversIfNeededConfig;
30
31
  onlyResolveTypeForInterfaces: boolean;
31
32
  directiveResolverMappings: Record<string, string>;
32
33
  resolversNonOptionalTypename: ResolversNonOptionalTypenameConfig;
33
34
  }
34
35
  type FieldDefinitionPrintFn = (parentName: string, avoidResolverOptionals: boolean) => string | null;
36
+ export interface RootResolver {
37
+ content: string;
38
+ generatedResolverTypes: {
39
+ resolversMap: {
40
+ name: string;
41
+ };
42
+ userDefined: Record<string, {
43
+ name: string;
44
+ federation?: {
45
+ hasResolveReference: boolean;
46
+ };
47
+ }>;
48
+ };
49
+ }
35
50
  export interface RawResolversConfig extends RawConfig {
36
51
  /**
37
52
  * @description Adds `_` to generated `Args` types in order to avoid duplicate identifiers.
@@ -521,6 +536,16 @@ export interface RawResolversConfig extends RawConfig {
521
536
  * If you are using `mercurius-js`, please set this field to empty string for better compatibility.
522
537
  */
523
538
  internalResolversPrefix?: string;
539
+ /**
540
+ * @type object
541
+ * @default { __resolveReference: false }
542
+ * @description If relevant internal resolvers are set to `true`, the resolver type will only be generated if the right conditions are met.
543
+ * Enabling this allows a more correct type generation for the resolvers.
544
+ * For example:
545
+ * - `__isTypeOf` is generated for implementing types and union members
546
+ * - `__resolveReference` is generated for federation types that have at least one resolvable `@key` directive
547
+ */
548
+ generateInternalResolversIfNeeded?: GenerateInternalResolversIfNeededConfig;
524
549
  /**
525
550
  * @type boolean
526
551
  * @default false
@@ -619,7 +644,6 @@ export declare class BaseResolversVisitor<TRawConfig extends RawResolversConfig
619
644
  protected _globalDeclarations: Set<string>;
620
645
  protected _federation: ApolloFederation;
621
646
  protected _hasScalars: boolean;
622
- protected _hasFederation: boolean;
623
647
  protected _fieldContextTypeMap: FieldContextTypeMap;
624
648
  protected _directiveContextTypesMap: FieldContextTypeMap;
625
649
  protected _checkedTypesWithNestedAbstractTypes: Record<string, {
@@ -670,17 +694,7 @@ export declare class BaseResolversVisitor<TRawConfig extends RawResolversConfig
670
694
  setVariablesTransformer(variablesTransfomer: OperationVariablesToObject): void;
671
695
  hasScalars(): boolean;
672
696
  hasFederation(): boolean;
673
- getRootResolver(): {
674
- content: string;
675
- generatedResolverTypes: {
676
- resolversMap: {
677
- name: string;
678
- };
679
- userDefined: Record<string, {
680
- name: string;
681
- }>;
682
- };
683
- };
697
+ getRootResolver(): RootResolver;
684
698
  protected formatRootResolver(schemaTypeName: string, resolverType: string, declarationKind: DeclarationKind): string;
685
699
  getAllDirectiveResolvers(): string;
686
700
  Name(node: NameNode): string;
@@ -2,7 +2,7 @@ import { ApolloFederation } from '@graphql-codegen/plugin-helpers';
2
2
  import { ASTNode, DirectiveDefinitionNode, EnumTypeDefinitionNode, FieldDefinitionNode, GraphQLNamedType, GraphQLObjectType, GraphQLSchema, InputValueDefinitionNode, InterfaceTypeDefinitionNode, ListTypeNode, NamedTypeNode, NameNode, NonNullTypeNode, ObjectTypeDefinitionNode, ScalarTypeDefinitionNode, UnionTypeDefinitionNode } from 'graphql';
3
3
  import { BaseVisitor, BaseVisitorConvertOptions, ParsedConfig, RawConfig } from './base-visitor.js';
4
4
  import { ParsedMapper } from './mappers.js';
5
- import { AvoidOptionalsConfig, ConvertOptions, DeclarationKind, EnumValuesMap, NormalizedAvoidOptionalsConfig, NormalizedScalarsMap, ParsedEnumValuesMap, ResolversNonOptionalTypenameConfig } from './types.js';
5
+ import { AvoidOptionalsConfig, ConvertOptions, DeclarationKind, EnumValuesMap, type NormalizedGenerateInternalResolversIfNeededConfig, type GenerateInternalResolversIfNeededConfig, NormalizedAvoidOptionalsConfig, NormalizedScalarsMap, ParsedEnumValuesMap, ResolversNonOptionalTypenameConfig } from './types.js';
6
6
  import { DeclarationBlockConfig } from './utils.js';
7
7
  import { OperationVariablesToObject } from './variables-to-object.js';
8
8
  export interface ParsedResolversConfig extends ParsedConfig {
@@ -27,11 +27,26 @@ export interface ParsedResolversConfig extends ParsedConfig {
27
27
  resolverTypeSuffix: string;
28
28
  allResolversTypeName: string;
29
29
  internalResolversPrefix: string;
30
+ generateInternalResolversIfNeeded: NormalizedGenerateInternalResolversIfNeededConfig;
30
31
  onlyResolveTypeForInterfaces: boolean;
31
32
  directiveResolverMappings: Record<string, string>;
32
33
  resolversNonOptionalTypename: ResolversNonOptionalTypenameConfig;
33
34
  }
34
35
  type FieldDefinitionPrintFn = (parentName: string, avoidResolverOptionals: boolean) => string | null;
36
+ export interface RootResolver {
37
+ content: string;
38
+ generatedResolverTypes: {
39
+ resolversMap: {
40
+ name: string;
41
+ };
42
+ userDefined: Record<string, {
43
+ name: string;
44
+ federation?: {
45
+ hasResolveReference: boolean;
46
+ };
47
+ }>;
48
+ };
49
+ }
35
50
  export interface RawResolversConfig extends RawConfig {
36
51
  /**
37
52
  * @description Adds `_` to generated `Args` types in order to avoid duplicate identifiers.
@@ -521,6 +536,16 @@ export interface RawResolversConfig extends RawConfig {
521
536
  * If you are using `mercurius-js`, please set this field to empty string for better compatibility.
522
537
  */
523
538
  internalResolversPrefix?: string;
539
+ /**
540
+ * @type object
541
+ * @default { __resolveReference: false }
542
+ * @description If relevant internal resolvers are set to `true`, the resolver type will only be generated if the right conditions are met.
543
+ * Enabling this allows a more correct type generation for the resolvers.
544
+ * For example:
545
+ * - `__isTypeOf` is generated for implementing types and union members
546
+ * - `__resolveReference` is generated for federation types that have at least one resolvable `@key` directive
547
+ */
548
+ generateInternalResolversIfNeeded?: GenerateInternalResolversIfNeededConfig;
524
549
  /**
525
550
  * @type boolean
526
551
  * @default false
@@ -619,7 +644,6 @@ export declare class BaseResolversVisitor<TRawConfig extends RawResolversConfig
619
644
  protected _globalDeclarations: Set<string>;
620
645
  protected _federation: ApolloFederation;
621
646
  protected _hasScalars: boolean;
622
- protected _hasFederation: boolean;
623
647
  protected _fieldContextTypeMap: FieldContextTypeMap;
624
648
  protected _directiveContextTypesMap: FieldContextTypeMap;
625
649
  protected _checkedTypesWithNestedAbstractTypes: Record<string, {
@@ -670,17 +694,7 @@ export declare class BaseResolversVisitor<TRawConfig extends RawResolversConfig
670
694
  setVariablesTransformer(variablesTransfomer: OperationVariablesToObject): void;
671
695
  hasScalars(): boolean;
672
696
  hasFederation(): boolean;
673
- getRootResolver(): {
674
- content: string;
675
- generatedResolverTypes: {
676
- resolversMap: {
677
- name: string;
678
- };
679
- userDefined: Record<string, {
680
- name: string;
681
- }>;
682
- };
683
- };
697
+ getRootResolver(): RootResolver;
684
698
  protected formatRootResolver(schemaTypeName: string, resolverType: string, declarationKind: DeclarationKind): string;
685
699
  getAllDirectiveResolvers(): string;
686
700
  Name(node: NameNode): string;
@@ -120,3 +120,7 @@ export interface ResolversNonOptionalTypenameConfig {
120
120
  interfaceImplementingType?: boolean;
121
121
  excludeTypes?: string[];
122
122
  }
123
+ export interface GenerateInternalResolversIfNeededConfig {
124
+ __resolveReference?: boolean;
125
+ }
126
+ export type NormalizedGenerateInternalResolversIfNeededConfig = Required<GenerateInternalResolversIfNeededConfig>;
@@ -120,3 +120,7 @@ export interface ResolversNonOptionalTypenameConfig {
120
120
  interfaceImplementingType?: boolean;
121
121
  excludeTypes?: string[];
122
122
  }
123
+ export interface GenerateInternalResolversIfNeededConfig {
124
+ __resolveReference?: boolean;
125
+ }
126
+ export type NormalizedGenerateInternalResolversIfNeededConfig = Required<GenerateInternalResolversIfNeededConfig>;