UNPKG

@kontent-ai/model-generator

Version:

This utility generates strongly-typed models for Delivery JS SDK, Migration toolkit or just general scripting to improve the experience when referencing Kontent.ai related objects.

98 lines 4.49 kB
import Chalk from "chalk"; import { itemsConfig } from "../../config.js"; import { wrapComment } from "../../core/comment.utils.js"; import { resolveCase } from "../../core/resolvers.js"; export function getItemsGenerator(config) { const getItemCodenameType = (typeCodename, items) => { return `export type ${resolveCase(typeCodename, "pascalCase")}Codenames = ${items.map((item) => `'${item.system.codename}'`).join(" | ")};`; }; const getItemCodenamesProp = (typeCodename, items) => { const values = items.reduce((code, item, index) => { const isLast = index === items.length - 1; return `${code}\n ${wrapComment(item.system.name, { disableComments: config.disableComments })} ${item.system.codename}: { codename: '${item.system.codename}', id: '${item.system.id}' }${!isLast ? ",\n" : ""}`; }, ""); return `export const ${typeCodename}Items = { ${values} } as const;`; }; const groupItemsByType = (items) => { return items.reduce((itemsByType, item) => { const existingGroupItems = itemsByType.get(item.system.type); if (existingGroupItems) { itemsByType.set(item.system.type, [...existingGroupItems, item]); } else { itemsByType.set(item.system.type, [item]); } return itemsByType; }, new Map()); }; return { getItemFiles() { return { folderName: itemsConfig.itemsFolderName, files: Array.from(groupItemsByType(config.environmentData.items)).map(([typeCodename, items]) => { const type = config.environmentData.types.find((t) => t.codename.toLowerCase() === typeCodename.toLowerCase()); if (!type) { throw new Error(`Type with codename '${Chalk.red(typeCodename)}' not found`); } return { filename: `${typeCodename}.items.ts`, text: `${wrapComment("Object representing identifiers of available items", { disableComments: config.disableComments, lines: [ { name: "Type name", value: type.name, }, { name: "Codename", value: type.codename, }, { name: "Id", value: type.id, }, ], })} ${getItemCodenamesProp(typeCodename, items)}`, }; }), }; }, getCodenameFiles() { return { folderName: itemsConfig.codenamesFolderName, files: Array.from(groupItemsByType(config.environmentData.items)).map(([typeCodename, items]) => { const type = config.environmentData.types.find((t) => t.codename.toLowerCase() === typeCodename.toLowerCase()); if (!type) { throw new Error(`Type with codename '${Chalk.red(typeCodename)}' not found`); } return { filename: `${typeCodename}.codenames.ts`, text: `${wrapComment("Type representing available item codenames", { disableComments: config.disableComments, lines: [ { name: "Type name", value: type.name, }, { name: "Type codename", value: type.codename, }, ], })} ${getItemCodenameType(typeCodename, items)}`, }; }), }; }, }; } //# sourceMappingURL=items.generator.js.map