@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.
|
|
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] = {
|
|
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.
|
|
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.
|
|
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] = {
|
|
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.
|
|
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.
|
|
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": "
|
|
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;
|
package/typings/types.d.cts
CHANGED
|
@@ -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>;
|
package/typings/types.d.ts
CHANGED
|
@@ -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>;
|