diff --git a/src/builder.ts b/src/builder.ts index 9f5cc682..9181200f 100644 --- a/src/builder.ts +++ b/src/builder.ts @@ -139,6 +139,7 @@ import { graphql15InterfaceConfig, graphql15InterfaceType, invariantGuard, + isArray, isObject, mapValues, objValues, @@ -952,7 +953,7 @@ export class SchemaBuilder { private buildEnumType(config: NexusEnumTypeConfig) { const { members } = config const values: GraphQLEnumValueConfigMap = {} - if (Array.isArray(members)) { + if (isArray(members)) { members.forEach((m) => { if (typeof m === 'string') { values[m] = { value: m } diff --git a/src/definitions/enumType.ts b/src/definitions/enumType.ts index 0d8908a0..463e0406 100644 --- a/src/definitions/enumType.ts +++ b/src/definitions/enumType.ts @@ -34,7 +34,7 @@ export interface NexusEnumTypeConfig { sourceType?: SourceTypingDef /** All members of the enum, either as an array of strings/definition objects, as an object, or as a TypeScript enum */ members: - | Array + | ReadonlyArray | Record | TypeScriptEnumLike /** diff --git a/src/utils.ts b/src/utils.ts index 05cfc3e9..d0351b3d 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -600,3 +600,12 @@ export function graphql15InterfaceType( } return type as T & { getInterfaces(): GraphQLInterfaceType[] } } + +/** + * A specially typed version of `Array.isArray` to work around [this issue](https://github.com/microsoft/TypeScript/issues/17002). + */ +export function isArray( + arg: T | {} +): arg is T extends readonly any[] ? (unknown extends T ? never : readonly any[]) : any[] { + return Array.isArray(arg) +}