UNPKG

@graphql-codegen/typescript-enum-array

Version:
58 lines (57 loc) 2.01 kB
import { buildSchema, printSchema } from 'graphql'; import { convertFactory } from '@graphql-codegen/visitor-plugin-common'; function getEnumTypeMap(schema) { var _a; const typeMap = schema.getTypeMap(); const result = []; for (const key in typeMap) { if (((_a = typeMap[key].astNode) === null || _a === void 0 ? void 0 : _a.kind) === 'EnumTypeDefinition') { result.push(typeMap[key]); } } return result; } function buildArrayDefinition(e, config) { var _a; const convert = convertFactory(config); const enumName = convert(e.astNode, { prefix: ((_a = config.enumPrefix) !== null && _a !== void 0 ? _a : true) ? config.typesPrefix : undefined, suffix: config.typesSuffix, }); const upperName = e.name .replace(/[A-Z]/g, letter => `_${letter}`) .slice(1) .toUpperCase(); const values = e .getValues() .map(v => { if (config.useMembers) { return `${enumName}.${convert(v.astNode, { transformUnderscore: true })}`; } else { return `'${v.value}'`; } }) .join(', '); if (config.constArrays) { return `export const ${upperName} = [${values}] as const;`; } else { return `export const ${upperName}: ${enumName}[] = [${values}];`; } } function buildImportStatement(enums, importFrom) { const names = Object.values(enums).map(e => e.name); return [`import { ${names.join(', ')} } from "${importFrom}";`]; } export const plugin = (schema, _documents, config) => { // https://github.com/graphql/graphql-js/issues/1575#issuecomment-454978897 const enums = getEnumTypeMap(buildSchema(printSchema(schema))); const content = enums.map(e => buildArrayDefinition(e, config)).join('\n'); const result = { content }; if (config.importFrom) { result['prepend'] = buildImportStatement(enums, config.importFrom); } return result; }; export default { plugin };