UNPKG

@toptal/davinci-graphql-codegen-extensions

Version:
56 lines (44 loc) 1.58 kB
const { getCachedDocumentNodeFromSchema, } = require('@graphql-codegen/plugin-helpers') const { visit } = require('graphql') const annotationDirective = 'tt_earlySupport' module.exports = { plugin(schema) { const astNode = getCachedDocumentNodeFromSchema(schema) const enums = [] visit(astNode, { EnumTypeDefinition(node) { const enumName = node.name.value const ignoredValues = node.values.filter(value => value.directives .map(directive => directive.name.value) .includes(annotationDirective) ) if (ignoredValues.length > 0) { enums.push({ name: enumName, values: ignoredValues.map(value => value.name.value), }) } }, }) let output = '' if (enums.length > 0) { output += 'type WithOptional<Type, OptionalKeys extends keyof Type> = Omit<Type, OptionalKeys> & Partial<Pick<Type, OptionalKeys>>\n \n' const mapping = enums .map(({ name, values }) => { const keys = values.map(value => `${name}.${value}`) return `[${name}] extends [EnumType] ? WithOptional<Record<${name}, ValueType>, ${keys.join( '|' )}> \n` }) .join(':') output += `export type GraphqlEnumMapping<EnumType extends keyof any, ValueType> = \n ${mapping} : Record<EnumType, ValueType>\n` } else { output += `export type GraphqlEnumMapping<EnumType extends keyof any, ValueType> = Record<EnumType, ValueType>\n` } return output }, }