Skip to content

Commit 7f281c9

Browse files
authored
Fix scalar overrides not giving full control to user (#320)
* Update e2e test for unmanaged scalar case * Fix issue where scalarsOverride do not give full control to user * Clarify whether a file has been added on filesystem * Ensure unmanagedScalarResolvers have higher priority than scalarsModule * Add changeset * Fix unit tests
1 parent 05a5863 commit 7f281c9

File tree

31 files changed

+183
-46
lines changed

31 files changed

+183
-46
lines changed

.changeset/early-terms-turn.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@eddeee888/gcg-typescript-resolver-files': patch
3+
---
4+
5+
Fix scalarOverrides not giving full control to users

packages/typescript-resolver-files-e2e/src/test-resolvers-auto-wireup/codegen.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,18 @@ const config: CodegenConfig = {
88
generates: {
99
'packages/typescript-resolver-files-e2e/src/test-resolvers-auto-wireup/schema':
1010
defineConfig(
11-
{ resolverGeneration: 'minimal', blacklistedModules: ['user'] },
11+
{
12+
resolverGeneration: 'minimal',
13+
blacklistedModules: ['user'],
14+
externalResolvers: {
15+
PetHouse: 'pet/resolvers/PetHouse#PetHouseResolvers',
16+
},
17+
scalarsOverrides: {
18+
Date: {
19+
resolver: 'base/resolvers/Date#DateResolver',
20+
},
21+
},
22+
},
1223
{
1324
schema: [
1425
'packages/typescript-resolver-files-e2e/src/test-resolvers-auto-wireup/**/*.graphqls',

packages/typescript-resolver-files-e2e/src/test-resolvers-auto-wireup/schema/base/base.graphqls

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ type PaginationResult {
4040
}
4141

4242
scalar DateTime
43+
scalar Date
4344
scalar SomeRandomScalar
4445
scalar CustomLogicScalar
4546
scalar JSON
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
/* This file has been created on filesystem by src/test-resolvers/auto-wireup/test-setup.js */
2+
3+
export const DateResolver = {}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { ErrorResolvers } from './../../types.generated';
2+
/* This file has been created on filesystem by src/test-resolvers/auto-wireup/test-setup.js */
23
export const Error: ErrorResolvers = {
34
/* Implement Error interface logic here */
45
};

packages/typescript-resolver-files-e2e/src/test-resolvers-auto-wireup/schema/base/resolvers/ErrorType.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { ErrorTypeResolvers } from './../../types.generated';
2+
/* This file has been created on filesystem by src/test-resolvers/auto-wireup/test-setup.js */
23
/*
34
* Note: This enum file is generated because "ErrorTypeMapper" is declared. This is to ensure runtime safety.
45
* If you want to skip this file generation, remove the mapper or update the pattern in the `resolverGeneration.object` config.

packages/typescript-resolver-files-e2e/src/test-resolvers-auto-wireup/schema/base/resolvers/SortOrder.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import type { SortOrderResolvers } from './../../types.generated';
2+
/* This file has been created on filesystem by src/test-resolvers/auto-wireup/test-setup.js */
3+
24
export const SortOrder: SortOrderResolvers = {
35
ASC: 'ASCENDING',
46
DESC: 'DESC',
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
import type { PetResolvers } from './../../types.generated';
2+
/* This file has been created on filesystem by src/test-resolvers/auto-wireup/test-setup.js */
3+
24
export const Pet: PetResolvers = {};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
/* This file has been created on filesystem by src/test-resolvers/auto-wireup/test-setup.js */
2+
3+
export const PetHouseResolvers = {};
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
import type { PetToyResolvers } from './../../types.generated';
2+
/* This file has been created on filesystem by src/test-resolvers/auto-wireup/test-setup.js */
3+
24
export const PetToy: PetToyResolvers = {};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { UserResolvers } from './../../types.generated';
2+
/* This file has been created on filesystem by src/test-resolvers/auto-wireup/test-setup.js */
23
export const User: Pick<UserResolvers, 'pets' | '__isTypeOf'> = {
34
/* Implement User resolver logic here */
45
};

packages/typescript-resolver-files-e2e/src/test-resolvers-auto-wireup/schema/pet/schema.graphqls

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,7 @@ type PetToy {
1212
extend type User {
1313
pets: [Pet!]!
1414
}
15+
16+
type PetHouse {
17+
id: ID!
18+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export type PetHouseMapper = {
2+
petHouseId: string;
3+
};

packages/typescript-resolver-files-e2e/src/test-resolvers-auto-wireup/schema/resolvers.generated.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import { TopicCreatePayload } from './topic/resolvers/TopicCreatePayload';
1919
import { Country } from './base/resolvers/Country';
2020
import { ErrorType } from './base/resolvers/ErrorType';
2121
import { SortOrder } from './base/resolvers/SortOrder';
22+
import { PetHouseResolvers } from './pet/resolvers/PetHouse';
23+
import { DateResolver } from './base/resolvers/Date';
2224
import { DateTimeResolver } from 'graphql-scalars';
2325
export const resolvers: Resolvers = {
2426
Query: {
@@ -45,5 +47,7 @@ export const resolvers: Resolvers = {
4547
Country: Country,
4648
ErrorType: ErrorType,
4749
SortOrder: SortOrder,
50+
PetHouse: PetHouseResolvers,
51+
Date: DateResolver,
4852
DateTime: DateTimeResolver,
4953
};

packages/typescript-resolver-files-e2e/src/test-resolvers-auto-wireup/schema/schema.generated.graphqls

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ enum Country {
66

77
scalar CustomLogicScalar
88

9+
scalar Date
10+
911
scalar DateTime
1012

1113
interface Error {
@@ -47,6 +49,10 @@ type Pet {
4749
primaryOwner: User!
4850
}
4951

52+
type PetHouse {
53+
id: ID!
54+
}
55+
5056
type PetToy {
5157
id: ID!
5258
name: String!
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/* This file has been created on filesystem by src/test-resolvers/auto-wireup/test-setup.js */
2+
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { TopicCreatePayloadResolvers } from './../../types.generated';
2+
/* This file has been created on filesystem by src/test-resolvers/auto-wireup/test-setup.js */
23
export const TopicCreatePayload: TopicCreatePayloadResolvers = {
34
/* Implement TopicCreatePayload union logic here */
45
};
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { TopicCreateResultResolvers } from './../../types.generated';
2+
/* This file has been created on filesystem by src/test-resolvers/auto-wireup/test-setup.js */
23
export const TopicCreateResult: TopicCreateResultResolvers = {
34
/* Implement TopicCreateResult resolver logic here */
45
};

packages/typescript-resolver-files-e2e/src/test-resolvers-auto-wireup/schema/topic/resolvers/TopicEditResult.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { TopicEditResultResolvers } from './../../types.generated';
2+
/* This file has been created on filesystem by src/test-resolvers/auto-wireup/test-setup.js */
23
/*
34
* Note: This object type is generated because "TopicEditResultMapper" is declared. This is to ensure runtime safety.
45
*

packages/typescript-resolver-files-e2e/src/test-resolvers-auto-wireup/schema/typeDefs.generated.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,11 @@ export const typeDefs = {
354354
name: { kind: 'Name', value: 'DateTime' },
355355
directives: [],
356356
},
357+
{
358+
kind: 'ScalarTypeDefinition',
359+
name: { kind: 'Name', value: 'Date' },
360+
directives: [],
361+
},
357362
{
358363
kind: 'ScalarTypeDefinition',
359364
name: { kind: 'Name', value: 'SomeRandomScalar' },
@@ -533,6 +538,24 @@ export const typeDefs = {
533538
directives: [],
534539
interfaces: [],
535540
},
541+
{
542+
kind: 'ObjectTypeDefinition',
543+
name: { kind: 'Name', value: 'PetHouse' },
544+
interfaces: [],
545+
directives: [],
546+
fields: [
547+
{
548+
kind: 'FieldDefinition',
549+
name: { kind: 'Name', value: 'id' },
550+
arguments: [],
551+
type: {
552+
kind: 'NonNullType',
553+
type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } },
554+
},
555+
directives: [],
556+
},
557+
],
558+
},
536559
{
537560
kind: 'ObjectTypeDefinition',
538561
name: { kind: 'Name', value: 'Topic' },

packages/typescript-resolver-files-e2e/src/test-resolvers-auto-wireup/schema/types.generated.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
ErrorTypeMapper,
99
SortOrderMapper,
1010
} from './base/base.mappers';
11+
import { PetHouseMapper } from './pet/schema.mappers';
1112
import { TopicMapper, TopicEditResultMapper } from './topic/topic.mappers';
1213
export type Maybe<T> = T | null | undefined;
1314
export type InputMaybe<T> = T | null | undefined;
@@ -44,6 +45,7 @@ export type Scalars = {
4445
Int: { input: number; output: number };
4546
Float: { input: number; output: number };
4647
CustomLogicScalar: { input: any; output: any };
48+
Date: { input: Date | string; output: Date | string };
4749
DateTime: { input: Date | string; output: Date | string };
4850
JSON: { input: any; output: any };
4951
SomeRandomScalar: { input: any; output: any };
@@ -99,6 +101,11 @@ export type Pet = {
99101
primaryOwner: User;
100102
};
101103

104+
export type PetHouse = {
105+
__typename?: 'PetHouse';
106+
id: Scalars['ID']['output'];
107+
};
108+
102109
export type PetToy = {
103110
__typename?: 'PetToy';
104111
id: Scalars['ID']['output'];
@@ -373,6 +380,7 @@ export type ResolversTypes = {
373380
CustomLogicScalar: ResolverTypeWrapper<
374381
Scalars['CustomLogicScalar']['output']
375382
>;
383+
Date: ResolverTypeWrapper<Scalars['Date']['output']>;
376384
DateTime: ResolverTypeWrapper<Scalars['DateTime']['output']>;
377385
Error: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Error']>;
378386
ErrorType: ResolverTypeWrapper<ErrorTypeMapper>;
@@ -387,6 +395,7 @@ export type ResolversTypes = {
387395
Pet: ResolverTypeWrapper<Pet>;
388396
ID: ResolverTypeWrapper<Scalars['ID']['output']>;
389397
String: ResolverTypeWrapper<Scalars['String']['output']>;
398+
PetHouse: ResolverTypeWrapper<PetHouseMapper>;
390399
PetToy: ResolverTypeWrapper<PetToy>;
391400
Profile: ResolverTypeWrapper<Profile>;
392401
Query: ResolverTypeWrapper<{}>;
@@ -435,6 +444,7 @@ export type ResolversTypes = {
435444
/** Mapping between all available schema types and the resolvers parents */
436445
export type ResolversParentTypes = {
437446
CustomLogicScalar: Scalars['CustomLogicScalar']['output'];
447+
Date: Scalars['Date']['output'];
438448
DateTime: Scalars['DateTime']['output'];
439449
Error: ResolversInterfaceTypes<ResolversParentTypes>['Error'];
440450
JSON: Scalars['JSON']['output'];
@@ -446,6 +456,7 @@ export type ResolversParentTypes = {
446456
Pet: Pet;
447457
ID: Scalars['ID']['output'];
448458
String: Scalars['String']['output'];
459+
PetHouse: PetHouseMapper;
449460
PetToy: PetToy;
450461
Profile: Profile;
451462
Query: {};
@@ -486,6 +497,11 @@ export interface CustomLogicScalarScalarConfig
486497
name: 'CustomLogicScalar';
487498
}
488499

500+
export interface DateScalarConfig
501+
extends GraphQLScalarTypeConfig<ResolversTypes['Date'], any> {
502+
name: 'Date';
503+
}
504+
489505
export interface DateTimeScalarConfig
490506
extends GraphQLScalarTypeConfig<ResolversTypes['DateTime'], any> {
491507
name: 'DateTime';
@@ -560,6 +576,14 @@ export type PetResolvers<
560576
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
561577
};
562578

579+
export type PetHouseResolvers<
580+
ContextType = any,
581+
ParentType extends ResolversParentTypes['PetHouse'] = ResolversParentTypes['PetHouse']
582+
> = {
583+
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
584+
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
585+
};
586+
563587
export type PetToyResolvers<
564588
ContextType = any,
565589
ParentType extends ResolversParentTypes['PetToy'] = ResolversParentTypes['PetToy']
@@ -777,6 +801,7 @@ export type ZooResolvers<
777801
export type Resolvers<ContextType = any> = {
778802
Country?: CountryResolvers;
779803
CustomLogicScalar?: GraphQLScalarType;
804+
Date?: GraphQLScalarType;
780805
DateTime?: GraphQLScalarType;
781806
Error?: ErrorResolvers<ContextType>;
782807
ErrorType?: ErrorTypeResolvers;
@@ -785,6 +810,7 @@ export type Resolvers<ContextType = any> = {
785810
PaginationResult?: PaginationResultResolvers<ContextType>;
786811
PayloadError?: PayloadErrorResolvers<ContextType>;
787812
Pet?: PetResolvers<ContextType>;
813+
PetHouse?: PetHouseResolvers<ContextType>;
788814
PetToy?: PetToyResolvers<ContextType>;
789815
Profile?: ProfileResolvers<ContextType>;
790816
Query?: QueryResolvers<ContextType>;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/* This file has been created on filesystem by src/test-resolvers/auto-wireup/test-setup.js */
2+
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { ProfileResolvers } from './../../types.generated';
2+
/* This file has been created on filesystem by src/test-resolvers/auto-wireup/test-setup.js */
23
export const Profile: Pick<ProfileResolvers, 'zoo' | '__isTypeOf'> = {
34
/* Implement Profile resolver logic here */
45
};

packages/typescript-resolver-files-e2e/src/test-resolvers-auto-wireup/test-setup.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,19 @@ try {
5656
`,
5757
},
5858

59+
// `externalOverrides` gives full control to user
60+
{
61+
file: 'packages/typescript-resolver-files-e2e/src/test-resolvers-auto-wireup/schema/pet/resolvers/PetHouse.ts',
62+
content: `export const PetHouseResolvers = {};`,
63+
},
64+
65+
// `scalarOverrides` must give full control to user
66+
// https://github.com/eddeee888/graphql-code-generator-plugins/issues/306
67+
{
68+
file: 'packages/typescript-resolver-files-e2e/src/test-resolvers-auto-wireup/schema/base/resolvers/Date.ts',
69+
content: `export const DateResolver = {}`,
70+
},
71+
5972
// Files in blacklisted modules should not be filled or added to resolvers.generated.ts
6073
'packages/typescript-resolver-files-e2e/src/test-resolvers-auto-wireup/schema/user/resolvers/User.ts',
6174

@@ -79,7 +92,10 @@ try {
7992

8093
const dir = path.dirname(filename);
8194
fs.mkdirSync(dir, { recursive: true });
82-
fs.writeFileSync(filename, content);
95+
fs.writeFileSync(
96+
filename,
97+
`/* This file has been created on filesystem by src/test-resolvers/auto-wireup/test-setup.js */\n\n${content}`
98+
);
8399
});
84100
} catch (err) {
85101
console.error(err);

packages/typescript-resolver-files/src/generateResolverFiles/addExternalResolverImport.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@ interface AddExternalResolverImportParams {
1616
/**
1717
* addExternalResolverImport
1818
*
19-
* 1. parse external resolvers (originally from config.externalResolvers) import syntax
19+
* External resolvers are resolvers that are not managed by server preset:
20+
* - unmanaged resolvers e.g. using config.externalResolvers or config.scalarsOverrides
21+
* - resolvers that come from an external module e.g. `graphql-scalars`
22+
*
23+
* 1. parse external resolvers (originally from ) import syntax
2024
* 2. dedupes any duplicated imports
2125
* 3. declares the which identifier name to use for GraphQL object or resolver in identifierUsages
2226
*/

packages/typescript-resolver-files/src/generateResolverFiles/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ export interface GenerateResolverFilesContext {
133133
resolverMainFile: string;
134134
resolverMainFileMode: ParsedPresetConfig['resolverMainFileMode'];
135135
resolverGeneration: ParsedPresetConfig['resolverGeneration'];
136-
externalResolvers: Record<string, string>;
136+
unmanagedResolvers: Record<string, string>;
137137
tsMorph: {
138138
project: Project;
139139
typesSourceFile: SourceFile;

packages/typescript-resolver-files/src/generateResolverFiles/visitNamedType.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,15 @@ export const visitNamedType = <T = null>(
1919
},
2020
ctx: GenerateResolverFilesContext
2121
): void => {
22-
const externalResolverImportSyntax =
23-
ctx.config.externalResolvers[normalizedResolverName.base];
24-
25-
// when used with extended object types scenario
26-
if (externalResolverImportSyntax) {
27-
// If has external resolver, use it
22+
const unmanagedResolversImportSyntax =
23+
ctx.config.unmanagedResolvers[normalizedResolverName.base];
24+
if (unmanagedResolversImportSyntax) {
2825
addExternalResolverImport(
2926
{
3027
moduleName,
3128
relativePathFromBaseToModule,
3229
normalizedResolverName: normalizedResolverName.base,
33-
configImportSyntax: externalResolverImportSyntax,
30+
configImportSyntax: unmanagedResolversImportSyntax,
3431
},
3532
ctx
3633
);

0 commit comments

Comments
 (0)