@@ -1237,6 +1237,17 @@ export interface GraphQLEnumTypeExtensions {
12371237 [ attributeName : string ] : unknown ;
12381238}
12391239
1240+ function enumValuesFromConfig ( values : GraphQLEnumValueConfigMap ) {
1241+ return Object . entries ( values ) . map ( ( [ valueName , valueConfig ] ) => ( {
1242+ name : assertEnumValueName ( valueName ) ,
1243+ description : valueConfig . description ,
1244+ value : valueConfig . value !== undefined ? valueConfig . value : valueName ,
1245+ deprecationReason : valueConfig . deprecationReason ,
1246+ extensions : toObjMap ( valueConfig . extensions ) ,
1247+ astNode : valueConfig . astNode ,
1248+ } ) ) ;
1249+ }
1250+
12401251/**
12411252 * Enum Type Definition
12421253 *
@@ -1267,9 +1278,12 @@ export class GraphQLEnumType /* <T> */ {
12671278 astNode : Maybe < EnumTypeDefinitionNode > ;
12681279 extensionASTNodes : ReadonlyArray < EnumTypeExtensionNode > ;
12691280
1270- private _values : ReadonlyArray < GraphQLEnumValue /* <T> */ > ;
1271- private _valueLookup : ReadonlyMap < any /* T */ , GraphQLEnumValue > ;
1272- private _nameLookup : ObjMap < GraphQLEnumValue > ;
1281+ private _values :
1282+ | ReadonlyArray < GraphQLEnumValue /* <T> */ >
1283+ | ( ( ) => GraphQLEnumValueConfigMap ) ;
1284+
1285+ private _valueLookup : ReadonlyMap < any /* T */ , GraphQLEnumValue > | null ;
1286+ private _nameLookup : ObjMap < GraphQLEnumValue > | null ;
12731287
12741288 constructor ( config : Readonly < GraphQLEnumTypeConfig /* <T> */ > ) {
12751289 this . name = assertName ( config . name ) ;
@@ -1278,35 +1292,38 @@ export class GraphQLEnumType /* <T> */ {
12781292 this . astNode = config . astNode ;
12791293 this . extensionASTNodes = config . extensionASTNodes ?? [ ] ;
12801294
1281- this . _values = Object . entries ( config . values ) . map (
1282- ( [ valueName , valueConfig ] ) => ( {
1283- name : assertEnumValueName ( valueName ) ,
1284- description : valueConfig . description ,
1285- value : valueConfig . value !== undefined ? valueConfig . value : valueName ,
1286- deprecationReason : valueConfig . deprecationReason ,
1287- extensions : toObjMap ( valueConfig . extensions ) ,
1288- astNode : valueConfig . astNode ,
1289- } ) ,
1290- ) ;
1291- this . _valueLookup = new Map (
1292- this . _values . map ( ( enumValue ) => [ enumValue . value , enumValue ] ) ,
1293- ) ;
1294- this . _nameLookup = keyMap ( this . _values , ( value ) => value . name ) ;
1295+ this . _values =
1296+ typeof config . values === 'function'
1297+ ? config . values
1298+ : enumValuesFromConfig ( config . values ) ;
1299+ this . _valueLookup = null ;
1300+ this . _nameLookup = null ;
12951301 }
12961302
12971303 get [ Symbol . toStringTag ] ( ) {
12981304 return 'GraphQLEnumType' ;
12991305 }
13001306
13011307 getValues ( ) : ReadonlyArray < GraphQLEnumValue /* <T> */ > {
1308+ if ( typeof this . _values === 'function' ) {
1309+ this . _values = enumValuesFromConfig ( this . _values ( ) ) ;
1310+ }
13021311 return this . _values ;
13031312 }
13041313
13051314 getValue ( name : string ) : Maybe < GraphQLEnumValue > {
1315+ if ( this . _nameLookup === null ) {
1316+ this . _nameLookup = keyMap ( this . getValues ( ) , ( value ) => value . name ) ;
1317+ }
13061318 return this . _nameLookup [ name ] ;
13071319 }
13081320
13091321 serialize ( outputValue : unknown /* T */ ) : Maybe < string > {
1322+ if ( this . _valueLookup === null ) {
1323+ this . _valueLookup = new Map (
1324+ this . getValues ( ) . map ( ( enumValue ) => [ enumValue . value , enumValue ] ) ,
1325+ ) ;
1326+ }
13101327 const enumValue = this . _valueLookup . get ( outputValue ) ;
13111328 if ( enumValue === undefined ) {
13121329 throw new GraphQLError (
@@ -1406,13 +1423,14 @@ function didYouMeanEnumValue(
14061423export interface GraphQLEnumTypeConfig {
14071424 name : string ;
14081425 description ?: Maybe < string > ;
1409- values : GraphQLEnumValueConfigMap /* <T> */ ;
1426+ values : ThunkObjMap < GraphQLEnumValueConfig /* <T> */ > ;
14101427 extensions ?: Maybe < Readonly < GraphQLEnumTypeExtensions > > ;
14111428 astNode ?: Maybe < EnumTypeDefinitionNode > ;
14121429 extensionASTNodes ?: Maybe < ReadonlyArray < EnumTypeExtensionNode > > ;
14131430}
14141431
14151432interface GraphQLEnumTypeNormalizedConfig extends GraphQLEnumTypeConfig {
1433+ values : ObjMap < GraphQLEnumValueConfig /* <T> */ > ;
14161434 extensions : Readonly < GraphQLEnumTypeExtensions > ;
14171435 extensionASTNodes : ReadonlyArray < EnumTypeExtensionNode > ;
14181436}
0 commit comments