Skip to content

Commit 65cc142

Browse files
committed
feat: add casing support for generated filenames
This allows users to control the naming convention of generated resolver files, supporting common filename formats, while preserving original default functionality. Details: - Add change-case-all dependency to typescript-resolver-files package - Add fileOutputCasing config option with 'pascal-case' (default) and other casing support - Update preset config validation to include fileOutputCasing option - Add transformResolverFileName utility to convert resolver names to appropriate filename casing - Integrate filename transformation throughout the resolver generation pipeline - Add unit test coverage for filename transformation functionality - Add e2e test suite - Update documentation in README.md
1 parent 7f4ad8f commit 65cc142

File tree

26 files changed

+1042
-13
lines changed

26 files changed

+1042
-13
lines changed

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,13 @@
165165
"rimraf -g \"{projectRoot}/src/test-complex-synth-generic-wrapper/**/*.generated.*\""
166166
],
167167
"parallel": false
168+
},
169+
"test-resolver-filename-case": {
170+
"commands": [
171+
"rimraf -g \"{projectRoot}/src/test-resolver-filename-case/**/resolvers/\"",
172+
"rimraf -g \"{projectRoot}/src/test-resolver-filename-case/**/*.generated.*\""
173+
],
174+
"parallel": false
168175
}
169176
}
170177
},
@@ -191,7 +198,8 @@
191198
"nx graphql-codegen typescript-resolver-files-e2e -c test-resolvers-auto-wireup --verbose",
192199
"nx graphql-codegen typescript-resolver-files-e2e -c test-federation --verbose",
193200
"nx graphql-codegen typescript-resolver-files-e2e -c test-deep-modules --verbose",
194-
"nx graphql-codegen typescript-resolver-files-e2e -c test-complex-synth-generic-wrapper --verbose"
201+
"nx graphql-codegen typescript-resolver-files-e2e -c test-complex-synth-generic-wrapper --verbose",
202+
"nx graphql-codegen typescript-resolver-files-e2e -c test-resolver-filename-case --verbose"
195203
],
196204
"parallel": false
197205
},
@@ -269,6 +277,9 @@
269277
},
270278
"test-complex-synth-generic-wrapper": {
271279
"configFile": "{projectRoot}/src/test-complex-synth-generic-wrapper/codegen.ts"
280+
},
281+
"test-resolver-filename-case": {
282+
"configFile": "{projectRoot}/src/test-resolver-filename-case/codegen.ts"
272283
}
273284
},
274285
"dependsOn": ["prepare-e2e-modules"]
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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-resolver-filename-case/graphql/schemas':
10+
defineConfig(
11+
{
12+
fileOutputCasing: 'kebab-case',
13+
},
14+
{
15+
schema: [
16+
'packages/typescript-resolver-files-e2e/src/test-resolver-filename-case/graphql/schemas/**/*.graphqls',
17+
'packages/typescript-resolver-files-e2e/src/test-resolver-filename-case/graphql/schemas/**/*.graphqls.ts',
18+
],
19+
}
20+
),
21+
},
22+
};
23+
24+
export default config;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
scalar DateTime
2+
3+
type Query {
4+
# Simple: "query" -> "query.ts"
5+
query: RandomResult!
6+
# Strange: "api-query.ts"
7+
APIQuery: RandomResult!
8+
}
9+
10+
type Mutation {
11+
# Strange: "prefixed-api-mutation.ts"
12+
prefixedAPIMutation: RandomResult!
13+
}
14+
15+
type RandomResult {
16+
id: ID!
17+
name: String!
18+
createdAt: DateTime!
19+
updatedAt: DateTime!
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/* This file was automatically generated. DO NOT UPDATE MANUALLY. */
2+
import type { Resolvers } from './types.generated';
3+
import { APIQuery as Query_APIQuery } from './resolvers/Query/api-query';
4+
import { query as Query_query } from './resolvers/Query/query';
5+
import { user as Query_user } from './resolvers/Query/user';
6+
import { userProfile as Query_userProfile } from './resolvers/Query/user-profile';
7+
import { prefixedAPIMutation as Mutation_prefixedAPIMutation } from './resolvers/Mutation/prefixed-api-mutation';
8+
import { RandomResult } from './resolvers/random-result';
9+
import { User } from './resolvers/user';
10+
import { UserProfile } from './resolvers/user-profile';
11+
import { DateTimeResolver } from 'graphql-scalars';
12+
export const resolvers: Resolvers = {
13+
Query: {
14+
APIQuery: Query_APIQuery,
15+
query: Query_query,
16+
user: Query_user,
17+
userProfile: Query_userProfile,
18+
},
19+
Mutation: { prefixedAPIMutation: Mutation_prefixedAPIMutation },
20+
21+
RandomResult: RandomResult,
22+
User: User,
23+
UserProfile: UserProfile,
24+
DateTime: DateTimeResolver,
25+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import type { MutationResolvers } from './../../types.generated';
2+
export const prefixedAPIMutation: NonNullable<
3+
MutationResolvers['prefixedAPIMutation']
4+
> = async (_parent, _arg, _ctx) => {
5+
/* Implement Mutation.prefixedAPIMutation resolver logic here */
6+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import type { QueryResolvers } from './../../types.generated';
2+
export const APIQuery: NonNullable<QueryResolvers['APIQuery']> = async (
3+
_parent,
4+
_arg,
5+
_ctx
6+
) => {
7+
/* Implement Query.APIQuery resolver logic here */
8+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import type { QueryResolvers } from './../../types.generated';
2+
export const query: NonNullable<QueryResolvers['query']> = async (
3+
_parent,
4+
_arg,
5+
_ctx
6+
) => {
7+
/* Implement Query.query resolver logic here */
8+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import type { QueryResolvers } from './../../types.generated';
2+
export const userProfile: NonNullable<QueryResolvers['userProfile']> = async (
3+
_parent,
4+
_arg,
5+
_ctx
6+
) => {
7+
/* Implement Query.userProfile resolver logic here */
8+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import type { QueryResolvers } from './../../types.generated';
2+
export const user: NonNullable<QueryResolvers['user']> = async (
3+
_parent,
4+
_arg,
5+
_ctx
6+
) => {
7+
/* Implement Query.user resolver logic here */
8+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import type { RandomResultResolvers } from './../types.generated';
2+
export const RandomResult: RandomResultResolvers = {
3+
/* Implement RandomResult resolver logic here */
4+
};

0 commit comments

Comments
 (0)