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.

94 lines (78 loc) 3.08 kB
import type { EnvironmentModels } from "@kontent-ai/management-sdk"; import chalk from "chalk"; import type { Options } from "prettier"; import type { CliAction, CreateFilesConfig, DeliveryApiMode, GeneratedFile, GeneratedSet, ModuleFileExtension, } from "../../core/core.models.js"; import { singleItemToArray } from "../../core/core.utils.js"; import { getDeliveryKontentFetcher } from "../../fetch/delivery-kontent-fetcher.js"; import { getManagementKontentFetcher } from "../../fetch/management-kontent-fetcher.js"; import { getFileManager } from "../../files/file-manager.js"; import { getItemsGenerator } from "./items.generator.js"; export type GenerateItemsModelsConfig = { readonly environmentId: string; readonly addTimestamp: boolean; readonly managementApiKey: string; readonly moduleFileExtension: ModuleFileExtension; readonly apiMode: DeliveryApiMode; readonly filterByTypeCodenames: readonly string[]; readonly generateTypes: boolean; readonly generateObjects: boolean; readonly deliveryApiKey?: string; readonly managementBaseUrl?: string; readonly deliveryBaseUrl?: string; readonly formatOptions?: Readonly<Options>; } & CreateFilesConfig; export async function generateItemsAsync(config: GenerateItemsModelsConfig): Promise<readonly GeneratedFile[]> { console.log(chalk.green("Model generator started \n")); console.log(`Generating '${chalk.yellow("items" satisfies CliAction)}' models\n`); const { itemFiles, environmentInfo, codenameFiles } = await getFilesAsync(config); const fileManager = getFileManager({ ...config, environmentInfo, }); const setFiles = await fileManager.getSetFilesAsync([...singleItemToArray(itemFiles), ...singleItemToArray(codenameFiles)]); if (config.createFiles) { fileManager.createFiles(setFiles); } console.log(chalk.green("\nCompleted")); return setFiles; } async function getFilesAsync(config: GenerateItemsModelsConfig): Promise<{ readonly itemFiles: GeneratedSet | undefined; readonly codenameFiles: GeneratedSet | undefined; readonly environmentInfo: Readonly<EnvironmentModels.EnvironmentInformationModel>; }> { const deliveryKontentFetcher = getDeliveryKontentFetcher({ environmentId: config.environmentId, apiMode: config.apiMode, deliveryApiKey: config.deliveryApiKey, baseUrl: config.deliveryBaseUrl, }); const managementKontentFetcher = getManagementKontentFetcher({ environmentId: config.environmentId, managementApiKey: config.managementApiKey, baseUrl: config.managementBaseUrl, }); const environmentInfo = await managementKontentFetcher.getEnvironmentInfoAsync(); const [items, types] = await Promise.all([ deliveryKontentFetcher.getItemsAsync(config.filterByTypeCodenames), managementKontentFetcher.getTypesAsync(), ]); const itemsGenerator = getItemsGenerator({ environmentData: { types: types, items: items, }, }); return { itemFiles: config.generateObjects ? itemsGenerator.getItemFiles() : undefined, codenameFiles: config.generateTypes ? itemsGenerator.getCodenameFiles() : undefined, environmentInfo, }; }