diff --git a/src/type/__tests__/definition-test.ts b/src/type/__tests__/definition-test.ts index 8d9eeb4044..286aa1c6c7 100644 --- a/src/type/__tests__/definition-test.ts +++ b/src/type/__tests__/definition-test.ts @@ -794,15 +794,15 @@ describe('Type System: Enums', () => { }); it('rejects an Enum type with incorrectly named values', () => { - expect( - () => - new GraphQLEnumType({ - name: 'SomeEnum', - values: { - 'bad-name': {}, - }, - }), - ).to.throw('Names must only contain [_a-zA-Z0-9] but "bad-name" does not.'); + const enumType = new GraphQLEnumType({ + name: 'SomeEnum', + values: { + 'bad-name': {}, + }, + }); + expect(() => enumType.getValues()).to.throw( + 'Names must only contain [_a-zA-Z0-9] but "bad-name" does not.', + ); }); }); diff --git a/src/type/definition.ts b/src/type/definition.ts index b35c44947e..14d077d87b 100644 --- a/src/type/definition.ts +++ b/src/type/definition.ts @@ -1563,7 +1563,7 @@ export class GraphQLEnumType /* */ implements GraphQLSchemaElement { private _values: | ReadonlyArray */> - | (() => GraphQLEnumValueConfigMap); + | (() => ReadonlyArray) /* */; private _valueLookup: ReadonlyMap | null; private _nameLookup: ObjMap | null; @@ -1576,13 +1576,7 @@ export class GraphQLEnumType /* */ implements GraphQLSchemaElement { this.astNode = config.astNode; this.extensionASTNodes = config.extensionASTNodes ?? []; - this._values = - typeof config.values === 'function' - ? config.values - : Object.entries(config.values).map( - ([valueName, valueConfig]) => - new GraphQLEnumValue(this, valueName, valueConfig), - ); + this._values = defineEnumValues.bind(undefined, this, config.values); this._valueLookup = null; this._nameLookup = null; } @@ -1593,10 +1587,7 @@ export class GraphQLEnumType /* */ implements GraphQLSchemaElement { getValues(): ReadonlyArray */> { if (typeof this._values === 'function') { - this._values = Object.entries(this._values()).map( - ([valueName, valueConfig]) => - new GraphQLEnumValue(this, valueName, valueConfig), - ); + this._values = this._values(); } return this._values; } @@ -1722,6 +1713,18 @@ export class GraphQLEnumType /* */ implements GraphQLSchemaElement { } } +function defineEnumValues( + parentEnum: GraphQLEnumType, + values: ThunkObjMap */>, +): ReadonlyArray { + const valueMap = resolveObjMapThunk(values); + + return Object.entries(valueMap).map( + ([valueName, valueConfig]) => + new GraphQLEnumValue(parentEnum, valueName, valueConfig), + ); +} + function didYouMeanEnumValue( enumType: GraphQLEnumType, unknownValueStr: string,