@toptal/davinci-graphql-codegen-extensions
Version:
Toptal Graphql codegen extensions
56 lines (44 loc) • 1.58 kB
JavaScript
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
},
}