Skip to content

Commit 853f91b

Browse files
committed
fix: allow configuration of enum type names with namingConvention
1 parent 1bf4597 commit 853f91b

File tree

4 files changed

+45
-9
lines changed

4 files changed

+45
-9
lines changed

src/config.ts

+18
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { TypeScriptPluginConfig } from '@graphql-codegen/typescript';
2+
import { NamingConvention, NamingConventionMap } from '@graphql-codegen/visitor-plugin-common';
23

34
export type ValidationSchema = 'yup' | 'zod' | 'myzod';
45
export type ValidationSchemaExportType = 'function' | 'const';
@@ -226,6 +227,23 @@ export interface ValidationSchemaPluginConfig extends TypeScriptPluginConfig {
226227
* ```
227228
*/
228229
useEnumTypeAsDefaultValue?: boolean
230+
/**
231+
* @description Uses the full path of the enum type as the default value instead of the stringified value.
232+
* @default { enumValues: "change-case-all#pascalCase" }
233+
*
234+
* @exampleMarkdown
235+
* ```yml
236+
* generates:
237+
* path/to/file.ts:
238+
* plugins:
239+
* - typescript
240+
* - graphql-codegen-validation-schema
241+
* config:
242+
* namingConvention:
243+
* enumValues: change-case-all#pascalCase
244+
* ```
245+
*/
246+
namingConvention?: NamingConventionMap
229247
/**
230248
* @description Generates validation schema with more API based on directive schema.
231249
* @exampleMarkdown

src/myzod/index.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { DeclarationBlock, indent } from '@graphql-codegen/visitor-plugin-common';
1+
import { DeclarationBlock, convertNameParts, indent } from '@graphql-codegen/visitor-plugin-common';
22
import type {
33
EnumTypeDefinitionNode,
44
FieldDefinitionNode,
@@ -14,7 +14,6 @@ import type {
1414
import {
1515
Kind,
1616
} from 'graphql';
17-
import { pascalCase } from "change-case";
1817

1918
import type { ValidationSchemaPluginConfig } from '../config';
2019
import { buildApi, formatDirectiveConfig } from '../directive';
@@ -28,6 +27,7 @@ import {
2827
isNamedType,
2928
isNonNullType,
3029
} from './../graphql';
30+
import { resolveExternalModuleAndFn } from '@graphql-codegen/plugin-helpers';
3131

3232
const anySchema = `definedNonNullAnySchema`;
3333

@@ -284,7 +284,13 @@ function generateFieldTypeMyZodSchema(config: ValidationSchemaPluginConfig, visi
284284

285285
if (defaultValue?.kind === Kind.STRING || defaultValue?.kind === Kind.ENUM) {
286286
if (config.useEnumTypeAsDefaultValue && defaultValue?.kind !== Kind.STRING) {
287-
appliedDirectivesGen = `${appliedDirectivesGen}.default(${visitor.convertName(type.name.value)}.${pascalCase(defaultValue.value)})`;
287+
let value = convertNameParts(defaultValue.value, resolveExternalModuleAndFn("change-case-all#pascalCase"));
288+
289+
if (config.namingConvention?.enumValues) {
290+
value = convertNameParts(defaultValue.value, resolveExternalModuleAndFn(config.namingConvention?.enumValues));
291+
}
292+
293+
appliedDirectivesGen = `${appliedDirectivesGen}.default(${visitor.convertName(type.name.value)}.${value})`;
288294
} else {
289295
appliedDirectivesGen = `${appliedDirectivesGen}.default("${defaultValue.value}")`;
290296
}

src/yup/index.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { DeclarationBlock, indent } from '@graphql-codegen/visitor-plugin-common';
1+
import { DeclarationBlock, convertNameParts, indent } from '@graphql-codegen/visitor-plugin-common';
22
import type {
33
EnumTypeDefinitionNode,
44
FieldDefinitionNode,
@@ -14,7 +14,6 @@ import type {
1414
import {
1515
Kind,
1616
} from 'graphql';
17-
import { pascalCase } from "change-case";
1817

1918
import type { ValidationSchemaPluginConfig } from '../config';
2019
import { buildApi, formatDirectiveConfig } from '../directive';
@@ -28,6 +27,7 @@ import {
2827
isNamedType,
2928
isNonNullType,
3029
} from './../graphql';
30+
import { resolveExternalModuleAndFn } from '@graphql-codegen/plugin-helpers';
3131

3232
export class YupSchemaVisitor extends BaseSchemaVisitor {
3333
constructor(schema: GraphQLSchema, config: ValidationSchemaPluginConfig) {
@@ -285,7 +285,13 @@ function shapeFields(fields: readonly (FieldDefinitionNode | InputValueDefinitio
285285

286286
if (defaultValue?.kind === Kind.STRING || defaultValue?.kind === Kind.ENUM) {
287287
if (config.useEnumTypeAsDefaultValue && defaultValue?.kind !== Kind.STRING) {
288-
fieldSchema = `${fieldSchema}.default(${visitor.convertName(field.name.value)}.${pascalCase(defaultValue.value)})`;
288+
let value = convertNameParts(defaultValue.value, resolveExternalModuleAndFn("change-case-all#pascalCase"));
289+
290+
if (config.namingConvention?.enumValues) {
291+
value = convertNameParts(defaultValue.value, resolveExternalModuleAndFn(config.namingConvention?.enumValues));
292+
}
293+
294+
fieldSchema = `${fieldSchema}.default(${visitor.convertName(field.name.value)}.${value})`;
289295
} else {
290296
fieldSchema = `${fieldSchema}.default("${defaultValue.value}")`;
291297
}

src/zod/index.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { DeclarationBlock, indent } from '@graphql-codegen/visitor-plugin-common';
1+
import { DeclarationBlock, convertNameParts, indent } from '@graphql-codegen/visitor-plugin-common';
22
import type {
33
EnumTypeDefinitionNode,
44
FieldDefinitionNode,
@@ -14,7 +14,6 @@ import type {
1414
import {
1515
Kind,
1616
} from 'graphql';
17-
import { pascalCase } from "change-case";
1817

1918
import type { ValidationSchemaPluginConfig } from '../config';
2019
import { buildApi, formatDirectiveConfig } from '../directive';
@@ -28,6 +27,7 @@ import {
2827
isNamedType,
2928
isNonNullType,
3029
} from './../graphql';
30+
import { resolveExternalModuleAndFn } from '@graphql-codegen/plugin-helpers';
3131

3232
const anySchema = `definedNonNullAnySchema`;
3333

@@ -297,7 +297,13 @@ function generateFieldTypeZodSchema(config: ValidationSchemaPluginConfig, visito
297297

298298
if (defaultValue?.kind === Kind.STRING || defaultValue?.kind === Kind.ENUM) {
299299
if (config.useEnumTypeAsDefaultValue && defaultValue?.kind !== Kind.STRING) {
300-
appliedDirectivesGen = `${appliedDirectivesGen}.default(${type.name.value}.${pascalCase(defaultValue.value)})`;
300+
let value = convertNameParts(defaultValue.value, resolveExternalModuleAndFn("change-case-all#pascalCase"));
301+
302+
if (config.namingConvention?.enumValues) {
303+
value = convertNameParts(defaultValue.value, resolveExternalModuleAndFn(config.namingConvention?.enumValues));
304+
}
305+
306+
appliedDirectivesGen = `${appliedDirectivesGen}.default(${type.name.value}.${value})`;
301307
} else {
302308
appliedDirectivesGen = `${appliedDirectivesGen}.default("${defaultValue.value}")`;
303309
}

0 commit comments

Comments
 (0)