diff --git a/packages/plugins/typescript/enum-array/src/config.ts b/packages/plugins/typescript/enum-array/src/config.ts index 5554fafedb..5ff6bfc6f7 100644 --- a/packages/plugins/typescript/enum-array/src/config.ts +++ b/packages/plugins/typescript/enum-array/src/config.ts @@ -14,4 +14,9 @@ export interface EnumArrayPluginConfig extends RawTypesConfig { * @description use enum members instead of string literals. Defaults to false */ useMembers?: boolean; + /** + * @description generate non-empty tuple types [EnumType, ...EnumType[]] instead of EnumType[]. + * Preserves original enum type in Zod parsed schemas. Defaults to false + */ + asNonEmptyTuple?: boolean; } diff --git a/packages/plugins/typescript/enum-array/src/index.ts b/packages/plugins/typescript/enum-array/src/index.ts index 05c7115963..98ad3ffd1e 100644 --- a/packages/plugins/typescript/enum-array/src/index.ts +++ b/packages/plugins/typescript/enum-array/src/index.ts @@ -39,6 +39,8 @@ function buildArrayDefinition(e: GraphQLEnumType, config: EnumArrayPluginConfig) if (config.constArrays) { return `export const ${upperName} = [${values}] as const;`; + } else if (config.asNonEmptyTuple) { + return `export const ${upperName}: [${enumName}, ...${enumName}[]] = [${values}];`; } else { return `export const ${upperName}: ${enumName}[] = [${values}];`; } diff --git a/packages/plugins/typescript/enum-array/tests/enum-array.spec.ts b/packages/plugins/typescript/enum-array/tests/enum-array.spec.ts index d9761d0c0b..486c2eb0a0 100644 --- a/packages/plugins/typescript/enum-array/tests/enum-array.spec.ts +++ b/packages/plugins/typescript/enum-array/tests/enum-array.spec.ts @@ -136,4 +136,47 @@ describe('TypeScript', () => { `); }); }); + + describe('with asNonEmptyTuple', () => { + it('Should declare the array as a non-empty tuple', async () => { + const schema = buildSchema(/* GraphQL */ ` + "custom enum" + enum MyEnum { + "this is a" + A + "this is b" + B + } + `); + const result = (await plugin(schema, [], { + asNonEmptyTuple: true, + })) as Types.ComplexPluginOutput; + + expect(result.prepend).toBeSimilarStringTo(``); + expect(result.content).toBeSimilarStringTo(` + export const MY_ENUM: [MyEnum, ...MyEnum[]] = ['A', 'B']; + `); + }); + + it('Should be ignored when constArrays is true', async () => { + const schema = buildSchema(/* GraphQL */ ` + "custom enum" + enum MyEnum { + "this is a" + A + "this is b" + B + } + `); + const result = (await plugin(schema, [], { + asNonEmptyTuple: true, + constArrays: true, + })) as Types.ComplexPluginOutput; + + expect(result.prepend).toBeSimilarStringTo(``); + expect(result.content).toBeSimilarStringTo(` + export const MY_ENUM = ['A', 'B'] as const; + `); + }); + }); });