@graphql-codegen/typescript-enum-array
Version:
GraphQL Code Generator plugin for adding const array
58 lines (57 loc) • 2.01 kB
JavaScript
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 };