Skip to content

Commit 221c671

Browse files
support new configuration option moduleNamingMode (#346)
* add e2e test * add moduleNamingMode * update readme * support variable module naming * update docs * Fix unit test * Fix generated e2e files * Fix lint issues * Disable @nx/dependency-checks temporarily to pass CI * Add changeset --------- Co-authored-by: Eddy Nguyen <[email protected]>
1 parent df77f2e commit 221c671

File tree

22 files changed

+545
-12
lines changed

22 files changed

+545
-12
lines changed

.changeset/thick-dodos-wave.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
'@eddeee888/gcg-typescript-resolver-files': minor
3+
---
4+
5+
Add moduleNamingMode option to determine the module name for each schema file
6+
7+
- **`last`**: The module name is derived from the **last** directory (within the schema directory) in the file's path.
8+
- **`first`**: The module name is derived from the **first** directory (within the schema directory) in the file's path.
9+
- **any number**: The module name is derived from the **nth zero-indexed** directory (within the schema directory) in the file's path. Supports negative numbers which select the **nth** directory from the back of the file's path.

packages/typescript-resolver-files-e2e/project.json

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"rimraf -g \"packages/typescript-resolver-files-e2e/src/**/rslvrs/\"",
2525
"rimraf -g \"packages/typescript-resolver-files-e2e/src/**/*.generated.*\"",
2626
"rimraf -g \"packages/typescript-resolver-files-e2e/src/**/*.gen.*\"",
27+
"rimraf -g \"packages/typescript-resolver-files-e2e/src/**/generated\"",
2728
"node packages/typescript-resolver-files-e2e/src/test-mappers-vs-schema-types/testSetup.js",
2829
"node packages/typescript-resolver-files-e2e/src/test-resolvers-auto-wireup/testSetup.js"
2930
],
@@ -150,6 +151,13 @@
150151
"rimraf -g \"packages/typescript-resolver-files-e2e/src/test-federation/**/*.generated.*\""
151152
],
152153
"parallel": false
154+
},
155+
"test-deep-modules": {
156+
"commands": [
157+
"rimraf -g \"packages/typescript-resolver-files-e2e/src/test-deep-modules/**/resolvers/\"",
158+
"rimraf -g \"packages/typescript-resolver-files-e2e/src/test-deep-modules/**/generated\""
159+
],
160+
"parallel": false
153161
}
154162
}
155163
},
@@ -174,7 +182,8 @@
174182
"nx graphql-codegen typescript-resolver-files-e2e -c test-extended-object-types --verbose",
175183
"nx graphql-codegen typescript-resolver-files-e2e -c test-nested-domain-modules --verbose",
176184
"nx graphql-codegen typescript-resolver-files-e2e -c test-resolvers-auto-wireup --verbose",
177-
"nx graphql-codegen typescript-resolver-files-e2e -c test-federation --verbose"
185+
"nx graphql-codegen typescript-resolver-files-e2e -c test-federation --verbose",
186+
"nx graphql-codegen typescript-resolver-files-e2e -c test-deep-modules --verbose"
178187
],
179188
"parallel": false
180189
},
@@ -246,6 +255,9 @@
246255
},
247256
"test-federation": {
248257
"configFile": "packages/typescript-resolver-files-e2e/src/test-federation/codegen.ts"
258+
},
259+
"test-deep-modules": {
260+
"configFile": "packages/typescript-resolver-files-e2e/src/test-deep-modules/codegen.ts"
249261
}
250262
},
251263
"dependsOn": ["prepare-e2e-modules"]
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import type { CodegenConfig } from '@graphql-codegen/cli';
2+
import { defineConfig } from '@eddeee888/gcg-typescript-resolver-files';
3+
4+
const config: CodegenConfig = {
5+
hooks: {
6+
afterAllFileWrite: ['prettier --write'],
7+
},
8+
generates: {
9+
'packages/typescript-resolver-files-e2e/src/test-deep-modules/modules':
10+
defineConfig(
11+
{
12+
mergeSchema: 'generated/schema.graphqls',
13+
moduleNamingMode: 'first',
14+
resolverGeneration: 'all',
15+
resolverMainFile: '../generated/resolvers.ts',
16+
resolverMainFileMode: 'modules',
17+
resolverRelativeTargetDir: '../resolvers',
18+
resolverTypesPath: 'generated/allTypes.ts',
19+
typeDefsFileMode: 'modules',
20+
typeDefsFilePath: '../generated/typeDefs.ts',
21+
},
22+
{
23+
schema: [
24+
'packages/typescript-resolver-files-e2e/src/test-deep-modules/modules/**/*.graphqls',
25+
'packages/typescript-resolver-files-e2e/src/test-deep-modules/modules/**/*.graphqls.ts',
26+
],
27+
}
28+
),
29+
},
30+
};
31+
32+
export default config;
Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
import { GraphQLResolveInfo } from 'graphql';
2+
export type Maybe<T> = T | null | undefined;
3+
export type InputMaybe<T> = T | null | undefined;
4+
export type Exact<T extends { [key: string]: unknown }> = {
5+
[K in keyof T]: T[K];
6+
};
7+
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & {
8+
[SubKey in K]?: Maybe<T[SubKey]>;
9+
};
10+
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & {
11+
[SubKey in K]: Maybe<T[SubKey]>;
12+
};
13+
export type MakeEmpty<
14+
T extends { [key: string]: unknown },
15+
K extends keyof T
16+
> = { [_ in K]?: never };
17+
export type Incremental<T> =
18+
| T
19+
| {
20+
[P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never;
21+
};
22+
/** All built-in and custom scalars, mapped to their actual values */
23+
export type Scalars = {
24+
ID: { input: string; output: string | number };
25+
String: { input: string; output: string };
26+
Boolean: { input: boolean; output: boolean };
27+
Int: { input: number; output: number };
28+
Float: { input: number; output: number };
29+
};
30+
31+
export type Profile = {
32+
__typename?: 'Profile';
33+
id: Scalars['ID']['output'];
34+
slug?: Maybe<Scalars['String']['output']>;
35+
};
36+
37+
export type Query = {
38+
__typename?: 'Query';
39+
me?: Maybe<User>;
40+
};
41+
42+
export type User = {
43+
__typename?: 'User';
44+
id: Scalars['ID']['output'];
45+
name?: Maybe<Scalars['String']['output']>;
46+
profile?: Maybe<Profile>;
47+
};
48+
49+
export type ResolverTypeWrapper<T> = Promise<T> | T;
50+
51+
export type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {
52+
resolve: ResolverFn<TResult, TParent, TContext, TArgs>;
53+
};
54+
export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> =
55+
| ResolverFn<TResult, TParent, TContext, TArgs>
56+
| ResolverWithResolve<TResult, TParent, TContext, TArgs>;
57+
58+
export type ResolverFn<TResult, TParent, TContext, TArgs> = (
59+
parent: TParent,
60+
args: TArgs,
61+
context: TContext,
62+
info: GraphQLResolveInfo
63+
) => Promise<TResult> | TResult;
64+
65+
export type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (
66+
parent: TParent,
67+
args: TArgs,
68+
context: TContext,
69+
info: GraphQLResolveInfo
70+
) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;
71+
72+
export type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (
73+
parent: TParent,
74+
args: TArgs,
75+
context: TContext,
76+
info: GraphQLResolveInfo
77+
) => TResult | Promise<TResult>;
78+
79+
export interface SubscriptionSubscriberObject<
80+
TResult,
81+
TKey extends string,
82+
TParent,
83+
TContext,
84+
TArgs
85+
> {
86+
subscribe: SubscriptionSubscribeFn<
87+
{ [key in TKey]: TResult },
88+
TParent,
89+
TContext,
90+
TArgs
91+
>;
92+
resolve?: SubscriptionResolveFn<
93+
TResult,
94+
{ [key in TKey]: TResult },
95+
TContext,
96+
TArgs
97+
>;
98+
}
99+
100+
export interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {
101+
subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;
102+
resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;
103+
}
104+
105+
export type SubscriptionObject<
106+
TResult,
107+
TKey extends string,
108+
TParent,
109+
TContext,
110+
TArgs
111+
> =
112+
| SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>
113+
| SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;
114+
115+
export type SubscriptionResolver<
116+
TResult,
117+
TKey extends string,
118+
TParent = {},
119+
TContext = {},
120+
TArgs = {}
121+
> =
122+
| ((
123+
...args: any[]
124+
) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)
125+
| SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;
126+
127+
export type TypeResolveFn<TTypes, TParent = {}, TContext = {}> = (
128+
parent: TParent,
129+
context: TContext,
130+
info: GraphQLResolveInfo
131+
) => Maybe<TTypes> | Promise<Maybe<TTypes>>;
132+
133+
export type IsTypeOfResolverFn<T = {}, TContext = {}> = (
134+
obj: T,
135+
context: TContext,
136+
info: GraphQLResolveInfo
137+
) => boolean | Promise<boolean>;
138+
139+
export type NextResolverFn<T> = () => Promise<T>;
140+
141+
export type DirectiveResolverFn<
142+
TResult = {},
143+
TParent = {},
144+
TContext = {},
145+
TArgs = {}
146+
> = (
147+
next: NextResolverFn<TResult>,
148+
parent: TParent,
149+
args: TArgs,
150+
context: TContext,
151+
info: GraphQLResolveInfo
152+
) => TResult | Promise<TResult>;
153+
154+
/** Mapping between all available schema types and the resolvers types */
155+
export type ResolversTypes = {
156+
Profile: ResolverTypeWrapper<Profile>;
157+
ID: ResolverTypeWrapper<Scalars['ID']['output']>;
158+
String: ResolverTypeWrapper<Scalars['String']['output']>;
159+
Query: ResolverTypeWrapper<{}>;
160+
User: ResolverTypeWrapper<User>;
161+
Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;
162+
};
163+
164+
/** Mapping between all available schema types and the resolvers parents */
165+
export type ResolversParentTypes = {
166+
Profile: Profile;
167+
ID: Scalars['ID']['output'];
168+
String: Scalars['String']['output'];
169+
Query: {};
170+
User: User;
171+
Boolean: Scalars['Boolean']['output'];
172+
};
173+
174+
export type ProfileResolvers<
175+
ContextType = any,
176+
ParentType extends ResolversParentTypes['Profile'] = ResolversParentTypes['Profile']
177+
> = {
178+
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
179+
slug?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
180+
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
181+
};
182+
183+
export type QueryResolvers<
184+
ContextType = any,
185+
ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']
186+
> = {
187+
me?: Resolver<Maybe<ResolversTypes['User']>, ParentType, ContextType>;
188+
};
189+
190+
export type UserResolvers<
191+
ContextType = any,
192+
ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User']
193+
> = {
194+
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
195+
name?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
196+
profile?: Resolver<Maybe<ResolversTypes['Profile']>, ParentType, ContextType>;
197+
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
198+
};
199+
200+
export type Resolvers<ContextType = any> = {
201+
Profile?: ProfileResolvers<ContextType>;
202+
Query?: QueryResolvers<ContextType>;
203+
User?: UserResolvers<ContextType>;
204+
};
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
type Profile {
2+
id: ID!
3+
slug: String
4+
}
5+
6+
type Query {
7+
me: User
8+
}
9+
10+
type User {
11+
id: ID!
12+
name: String
13+
profile: Profile
14+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/* This file was automatically generated. DO NOT UPDATE MANUALLY. */
2+
import type { Resolvers } from './../../generated/allTypes';
3+
import { Profile } from './../resolvers/Profile';
4+
import { User as profile_User } from './../resolvers/User';
5+
export const resolvers: Resolvers = {
6+
Profile: Profile,
7+
User: profile_User,
8+
};
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import type { DocumentNode } from 'graphql';
2+
export const typeDefs = {
3+
kind: 'Document',
4+
definitions: [
5+
{
6+
kind: 'ObjectTypeDefinition',
7+
name: { kind: 'Name', value: 'Profile' },
8+
interfaces: [],
9+
directives: [],
10+
fields: [
11+
{
12+
kind: 'FieldDefinition',
13+
name: { kind: 'Name', value: 'id' },
14+
arguments: [],
15+
type: {
16+
kind: 'NonNullType',
17+
type: { kind: 'NamedType', name: { kind: 'Name', value: 'ID' } },
18+
},
19+
directives: [],
20+
},
21+
{
22+
kind: 'FieldDefinition',
23+
name: { kind: 'Name', value: 'slug' },
24+
arguments: [],
25+
type: { kind: 'NamedType', name: { kind: 'Name', value: 'String' } },
26+
directives: [],
27+
},
28+
],
29+
},
30+
{
31+
kind: 'ObjectTypeExtension',
32+
name: { kind: 'Name', value: 'User' },
33+
interfaces: [],
34+
directives: [],
35+
fields: [
36+
{
37+
kind: 'FieldDefinition',
38+
name: { kind: 'Name', value: 'profile' },
39+
arguments: [],
40+
type: { kind: 'NamedType', name: { kind: 'Name', value: 'Profile' } },
41+
directives: [],
42+
},
43+
],
44+
},
45+
],
46+
} as unknown as DocumentNode;
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import type { ProfileResolvers } from './../../generated/allTypes';
2+
export const Profile: ProfileResolvers = {
3+
/* Implement Profile resolver logic here */
4+
};
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import type { UserResolvers } from './../../generated/allTypes';
2+
export const User: Pick<UserResolvers, 'profile' | '__isTypeOf'> = {
3+
/* Implement User resolver logic here */
4+
};
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
type Profile {
2+
id: ID!
3+
slug: String
4+
}

0 commit comments

Comments
 (0)