@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
JavaScript
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