UNPKG

genezio

Version:

Command line utility to interact with Genezio infrastructure.

58 lines (57 loc) 2.84 kB
import JsSdkGenerator from "./sdkGenerator/JsSdkGenerator.js"; import TsSdkGenerator from "./sdkGenerator/TsSdkGenerator.js"; import SwiftSdkGenerator from "./sdkGenerator/SwiftSdkGenerator.js"; import PythonSdkGenerator from "./sdkGenerator/PythonSdkGenerator.js"; import DartSdkGenerator from "./sdkGenerator/DartSdkGenerator.js"; import KotlinSdkGenerator from "./sdkGenerator/KotlinSdkGenerator.js"; import GoSdkGenerator from "./sdkGenerator/GoSdkGenerator.js"; import { debugLogger } from "../utils/logging.js"; import zod from "zod"; import { UserError } from "../errors.js"; /** * Asynchronously generates an SDK from a given AST array using specified plugins. * * @param {SdkGeneratorInput} sdkGeneratorInput - The input parameters for generating the SDK. * @param {string[]|undefined} plugins - An optional array of plugins to use for generating the SDK. * @returns {Promise<SdkGeneratorOutput>} A Promise that resolves with the generated SDK. * @throws {Error} If there was an error generating the SDK. */ export async function generateSdk(sdkGeneratorInput, plugins) { let pluginsImported = []; if (plugins) { pluginsImported = await Promise.all(plugins?.map(async (plugin) => { const dynamicPlugin = await import(plugin).catch((err) => { debugLogger.debug(err); throw new UserError(`Plugin(${plugin}) not found. Install it with npm install ${plugin}`); }); if (!dynamicPlugin) { throw new UserError(`Plugin(${plugin}) could not be imported.`); } // Check type of plugin at runtime const pluginSchema = zod.object({ SdkGenerator: zod.function(), supportedExtensions: zod.array(zod.string()), }); if (pluginSchema.safeParse(dynamicPlugin).success === false) { throw new UserError(`Plugin(${plugin}) is not a valid SDK generator plugin. It must export a SdkGenerator class and supportedLanguages array.`); } return dynamicPlugin; })); } pluginsImported.push(JsSdkGenerator); pluginsImported.push(TsSdkGenerator); pluginsImported.push(SwiftSdkGenerator); pluginsImported.push(PythonSdkGenerator); pluginsImported.push(DartSdkGenerator); pluginsImported.push(KotlinSdkGenerator); pluginsImported.push(GoSdkGenerator); const language = sdkGeneratorInput.language; const sdkGeneratorElem = pluginsImported.find((plugin) => { return plugin.supportedLanguages.includes(language ?? ""); }); if (!sdkGeneratorElem) { throw new UserError(`SDK language(${language}) not supported`); } const sdkGeneratorClass = new sdkGeneratorElem.SdkGenerator(); return await sdkGeneratorClass.generateSdk(sdkGeneratorInput); }