@graphql-codegen/typescript-enum-array
Version:
GraphQL Code Generator plugin for adding const array
62 lines (61 loc) • 2.21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.plugin = void 0;
const graphql_1 = require("graphql");
const visitor_plugin_common_1 = require("@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 = (0, visitor_plugin_common_1.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}";`];
}
const plugin = (schema, _documents, config) => {
// https://github.com/graphql/graphql-js/issues/1575#issuecomment-454978897
const enums = getEnumTypeMap((0, graphql_1.buildSchema)((0, graphql_1.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;
};
exports.plugin = plugin;
exports.default = { plugin: exports.plugin };