UNPKG

@godspeedsystems/godspeed

Version:

Godspeed CLI

610 lines 27.7 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const commander_1 = require("commander"); const cross_spawn_1 = __importDefault(require("cross-spawn")); const path_1 = __importDefault(require("path")); const fs_1 = __importStar(require("fs")); const inquirer_1 = __importDefault(require("inquirer")); const yaml = __importStar(require("js-yaml")); const process_1 = require("process"); const chalk_1 = __importDefault(require("chalk")); const ora_1 = __importDefault(require("ora")); const pluginsFilePath = path_1.default.resolve(__dirname, '../../../pluginsList.json'); if (!fs_1.default.existsSync(pluginsFilePath)) { console.error("Error: pluginsList.json file not found!"); process.exit(1); } const pluginsData = fs_1.default.readFileSync(pluginsFilePath, { encoding: "utf-8" }); const availablePlugins = JSON.parse(pluginsData); const pluginNames = availablePlugins.map((plugin) => ({ value: plugin.value, Name: plugin.name.split("plugins-")[1], Description: plugin.description, })); const program = new commander_1.Command(); async function manuallyConfigurePlugin(pluginName) { const pluginShortName = pluginName.split('/').pop()?.replace('plugins-', '') .replace('-as-eventsource', '') .replace('-as-datasource', '') || ''; let moduleType = "ES"; if (pluginName.includes('-as-datasource') && pluginName.includes('-as-eventsource')) { moduleType = "BOTH"; } else if (pluginName.includes('-as-datasource')) { moduleType = "DS"; } try { switch (moduleType) { case "BOTH": { (0, fs_1.mkdirSync)(path_1.default.join(process.cwd(), "src", "eventsources", "types"), { recursive: true, }); (0, fs_1.mkdirSync)(path_1.default.join(process.cwd(), "src", "datasources", "types"), { recursive: true, }); // Write EventSource files (0, fs_1.writeFileSync)(path_1.default.join(process.cwd(), "src", "eventsources", "types", `${pluginShortName}.ts`), ` import { EventSource } from '${pluginName}'; export default EventSource; `); (0, fs_1.writeFileSync)(path_1.default.join(process.cwd(), "src", "eventsources", `${pluginShortName}.yaml`), yaml.dump({ type: pluginShortName })); // Write DataSource files (0, fs_1.writeFileSync)(path_1.default.join(process.cwd(), "src", "datasources", "types", `${pluginShortName}.ts`), ` import { DataSource } from '${pluginName}'; export default DataSource; `); (0, fs_1.writeFileSync)(path_1.default.join(process.cwd(), "src", "datasources", `${pluginShortName}.yaml`), yaml.dump({ type: pluginShortName })); } break; case "DS": { (0, fs_1.mkdirSync)(path_1.default.join(process.cwd(), "src", "datasources", "types"), { recursive: true, }); (0, fs_1.writeFileSync)(path_1.default.join(process.cwd(), "src", "datasources", "types", `${pluginShortName}.ts`), ` import { DataSource } from '${pluginName}'; export default DataSource; `); (0, fs_1.writeFileSync)(path_1.default.join(process.cwd(), "src", "datasources", `${pluginShortName}.yaml`), yaml.dump({ type: pluginShortName })); } break; case "ES": { (0, fs_1.mkdirSync)(path_1.default.join(process.cwd(), "src", "eventsources", "types"), { recursive: true, }); (0, fs_1.writeFileSync)(path_1.default.join(process.cwd(), "src", "eventsources", "types", `${pluginShortName}.ts`), ` import { EventSource } from '${pluginName}'; export default EventSource; `); (0, fs_1.writeFileSync)(path_1.default.join(process.cwd(), "src", "eventsources", `${pluginShortName}.yaml`), yaml.dump({ type: pluginShortName })); } break; } return true; } catch (error) { console.error(`❌ Error manually configuring plugin ${pluginName}:`, error); return false; } } const addAction = async (pluginsList) => { var _a; const spinner = (0, ora_1.default)({ text: "Installing plugins... ", spinner: { frames: ["🌍 ", "🌎 ", "🌏 ", "🌐 ", "🌑 ", "🌒 ", "🌓 ", "🌔 "], interval: 180, }, }); async function installPlugin(pluginsList) { try { console.log("Starting plugin installation..."); console.log(`Plugins to install: ${pluginsList.join(', ')}`); const hasPnpm = await checkCommandExists("pnpm"); const packageManager = hasPnpm ? "pnpm" : "npm"; console.log(`Using package manager: ${packageManager}`); spinner.text = `Installing plugins with ${packageManager}...`; spinner.start(); const startTime = Date.now(); let dots = 0; const intervalId = setInterval(() => { dots = (dots + 1) % 4; const elapsed = Math.floor((Date.now() - startTime) / 1000); spinner.text = `Installing plugins with ${packageManager}${'.'.repeat(dots)} (${elapsed}s elapsed)`; }, 1000); return new Promise((resolve, reject) => { const { exec } = require('child_process'); let cmd = ''; if (packageManager === "pnpm") { cmd = `pnpm add ${pluginsList.join(' ')} --reporter=silent`; } else { cmd = `npm install ${pluginsList.join(' ')} --quiet --no-warnings --silent --progress=false`; } const childProcess = exec(cmd, { cwd: process.cwd() }); let stdoutData = ''; let stderrData = ''; childProcess.stdout?.on('data', (data) => { stdoutData += data; if (data.trim()) { // console.log(`[${packageManager} output]: ${data.trim()}`); } }); childProcess.stderr?.on('data', (data) => { stderrData += data; if (data.trim()) { console.error(`[${packageManager} error]: ${data.trim()}`); } }); childProcess.on('exit', (code) => { clearInterval(intervalId); if (code !== 0) { spinner.stop(); console.error(`Installation failed with exit code: ${code}`); console.error("Error output:", stderrData || "No error output"); reject(new Error(`Process exited with code ${code}`)); return; } const totalTime = ((Date.now() - startTime) / 1000).toFixed(1); spinner.stop(); console.log(`\nPlugins installed successfully in ${totalTime}s!`); console.log(`Installed plugins: ${pluginsList.join(', ')}`); console.log(chalk_1.default.cyan.bold("Happy coding with Godspeed! 🚀🎉\n")); resolve(); }); }); } catch (error) { spinner.stop(); console.error("Error during installation:", error.message); throw error; } } // Helper function to check if a command exists async function checkCommandExists(command) { return new Promise((resolve) => { const { exec } = require('child_process'); const checkCmd = process.platform === 'win32' ? 'where' : 'which'; exec(`${checkCmd} ${command}`, (error) => { resolve(!error); }); }); } try { await installPlugin(pluginsList); for (const pluginName of pluginsList) { try { let configSuccess = false; try { console.log(`Trying to import and configure ${pluginName}...`); const Module = await (_a = path_1.default.join(process.cwd(), "node_modules", pluginName), Promise.resolve().then(() => __importStar(require(_a)))); let moduleType = Module.SourceType; let loaderFileName = Module.Type; let yamlFileName = Module.CONFIG_FILE_NAME; let defaultConfig = Module.DEFAULT_CONFIG || {}; switch (moduleType) { case "BOTH": { (0, fs_1.mkdirSync)(path_1.default.join(process.cwd(), "src", "eventsources", "types"), { recursive: true, }); (0, fs_1.mkdirSync)(path_1.default.join(process.cwd(), "src", "datasources", "types"), { recursive: true, }); (0, fs_1.writeFileSync)(path_1.default.join(process.cwd(), "src", "eventsources", "types", `${loaderFileName}.ts`), ` import { EventSource } from '${pluginName}'; export default EventSource; `); (0, fs_1.writeFileSync)(path_1.default.join(process.cwd(), "src", "eventsources", `${yamlFileName}.yaml`), yaml.dump({ type: loaderFileName, ...defaultConfig })); (0, fs_1.writeFileSync)(path_1.default.join(process.cwd(), "src", "datasources", "types", `${loaderFileName}.ts`), ` import { DataSource } from '${pluginName}'; export default DataSource; `); (0, fs_1.writeFileSync)(path_1.default.join(process.cwd(), "src", "datasources", `${yamlFileName}.yaml`), yaml.dump({ type: loaderFileName, ...defaultConfig })); } break; case "DS": { (0, fs_1.mkdirSync)(path_1.default.join(process.cwd(), "src", "datasources", "types"), { recursive: true, }); (0, fs_1.writeFileSync)(path_1.default.join(process.cwd(), "src", "datasources", "types", `${loaderFileName}.ts`), ` import { DataSource } from '${pluginName}'; export default DataSource; `); if (Module.Type !== "prisma") { (0, fs_1.writeFileSync)(path_1.default.join(process.cwd(), "src", "datasources", `${yamlFileName}.yaml`), yaml.dump({ type: loaderFileName, ...defaultConfig })); } } break; case "ES": { (0, fs_1.mkdirSync)(path_1.default.join(process.cwd(), "src", "eventsources", "types"), { recursive: true, }); (0, fs_1.writeFileSync)(path_1.default.join(process.cwd(), "src", "eventsources", "types", `${loaderFileName}.ts`), ` import { EventSource } from '${pluginName}'; export default EventSource; `); (0, fs_1.writeFileSync)(path_1.default.join(process.cwd(), "src", "eventsources", `${yamlFileName}.yaml`), yaml.dump({ type: loaderFileName, ...defaultConfig })); } } configSuccess = true; console.log(`✅ Plugin ${pluginName} dynamically configured.`); } catch (importError) { // console.log(`Dynamic import failed for ${pluginName}: ${importError?.message}`); // console.log("Falling back to manual configuration..."); configSuccess = await manuallyConfigurePlugin(pluginName); } if (configSuccess) { console.log(`✅ Plugin "${pluginName}" installed and configured.`); } else { console.warn(`⚠️ Plugin "${pluginName}" installed but configuration may be incomplete.`); } } catch (error) { console.error("Unable to configure plugin:", error); } } } catch (error) { console.error("Plugin installation failed:", error); } }; const add = program .command("add [pluginName]") .description(`Add an eventsource/datasource plugin.`) .action(async (pluginName) => { let givenPluginName = pluginName; let pkgPath = path_1.default.join((0, process_1.cwd)(), "package.json"); let localpluginsList = (0, fs_1.existsSync)(pkgPath) ? JSON.parse((0, fs_1.readFileSync)(pkgPath, { encoding: "utf-8" })).dependencies : {}; for (const pluginName in localpluginsList) { const isGSPlugin = pluginName.includes("@godspeedsystems/plugins"); !isGSPlugin && delete localpluginsList[pluginName]; } const missingPlugins = pluginNames.filter((plugin) => !localpluginsList[plugin.value]); if (!givenPluginName) { if (pluginNames.length === 0) { console.error("No plugins found."); process.exit(1); } else { const inquirerTableCheckbox = require("@adobe/inquirer-table-checkbox"); inquirer_1.default.registerPrompt("search-table", inquirerTableCheckbox); const tableCheckboxPrompt = { type: "search-table", name: "gsPlugin", message: "Please select godspeed plugin to install:", wordWrap: true, pageSize: 5, searchable: true, style: { "padding-left": 1, "padding-right": 0, head: [], border: [], }, colWidths: [40, 80], columns: [ { name: "Name", wrapOnWordBoundary: true }, { name: "Description", wrapOnWordBoundary: true }, ], rows: missingPlugins, }; async function runPrompt() { try { const answer = await inquirer_1.default.prompt([tableCheckboxPrompt]); if (answer.gsPlugin.length !== 0) { await addAction(answer.gsPlugin); } else { console.log(chalk_1.default.red.bold("select atleast one plugin to add")); } } catch (error) { console.error(error); } } runPrompt(); } } else { let chosenPluginName = null; for (const plugin of pluginNames) { if (plugin.value === givenPluginName) { chosenPluginName = plugin; break; } } if (chosenPluginName !== null) { chosenPluginName = [`${givenPluginName}`]; await addAction(chosenPluginName); console.log(chalk_1.default.cyan("\nFor detailed documentation and examples, visit:")); console.log(chalk_1.default.yellow.bold(`https://www.npmjs.com/package/${givenPluginName}\n`)); } else { console.error(chalk_1.default.red("\nPlease provide a valid plugin name.\n")); process.exit(1); } } }); const removeAction = async (pluginsList) => { const spinner = (0, ora_1.default)({ text: "Uninstalling plugins... ", spinner: { frames: ["🌍 ", "🌎 ", "🌏 ", "🌐 ", "🌑 ", "🌒 ", "🌓 ", "🌔 "], interval: 180, }, }); async function uninstallPlugin(pluginsList) { try { spinner.start(); const child = (0, cross_spawn_1.default)("npm", [ "uninstall", ...pluginsList, "--quiet", "--no-warnings", "--silent", "--progress=false", ], { stdio: "inherit", }); await new Promise((resolve) => { child.on("close", () => { resolve(); }); }); spinner.stop(); console.log("\nPlugins uninstalled successfully!"); console.log(chalk_1.default.cyan.bold("Happy coding with Godspeed! 🚀🎉\n")); } catch (error) { spinner.stop(); console.error("Error during installation:", error.message); } } pluginsList.map(async (pluginName) => { var _a; try { const Module = await (_a = path_1.default.join(process.cwd(), "node_modules", pluginName), Promise.resolve().then(() => __importStar(require(_a)))); let moduleType = Module.SourceType; let loaderFileName = Module.Type; let yamlFileName = Module.CONFIG_FILE_NAME; let defaultConfig = Module.DEFAULT_CONFIG || {}; switch (moduleType) { case "BOTH": await removeModule("ES", pluginName, loaderFileName, yamlFileName); await removeModule("DS", pluginName, loaderFileName, yamlFileName); break; case "ES": await removeModule(moduleType, pluginName, loaderFileName, yamlFileName); break; case "DS": await removeModule(moduleType, pluginName, loaderFileName, yamlFileName); break; default: console.error("Invalid moduleType:", moduleType); break; } } catch (error) { console.error("Unable to remove the plugin.", error); } }); const removeModule = async (moduleType, pluginName, loaderFileName, yamlFileName) => { try { const tsFilePath = path_1.default.join(process.cwd(), moduleType === "ES" ? "src/eventsources/types" : "src/datasources/types", `${loaderFileName}.ts`); const yamlFilePath = path_1.default.join(process.cwd(), moduleType === "ES" ? "src/eventsources" : "src/datasources", `${yamlFileName}.yaml`); await Promise.all([ fs_1.default.unlink(tsFilePath, (err) => { }), fs_1.default.unlink(yamlFilePath, (err) => { }), ]); } catch (error) { console.error(`Unable to remove ${moduleType} module for '${pluginName}'.`, error); } }; await uninstallPlugin(pluginsList); }; const remove = program .command("remove [pluginName]") .description("Remove an eventsource/datasource plugin.") .action(async (pluginName) => { if (pluginName) { await removeAction([`${pluginName}`]); } else { let pluginsList; try { let pkgPath = path_1.default.join((0, process_1.cwd)(), "package.json"); pluginsList = (0, fs_1.existsSync)(pkgPath) ? JSON.parse((0, fs_1.readFileSync)(pkgPath, { encoding: "utf-8" })) .dependencies : {}; for (const pluginName in pluginsList) { const isGSPlugin = pluginName.includes("@godspeedsystems/plugins"); !isGSPlugin && delete pluginsList[pluginName]; } if (!pluginsList || Object.keys(pluginsList).length === 0) { throw new Error(); } } catch (error) { console.error("There are no eventsource/datasource plugins installed."); return; } let pkgPath = path_1.default.join((0, process_1.cwd)(), "package.json"); pluginsList = (0, fs_1.existsSync)(pkgPath) ? JSON.parse((0, fs_1.readFileSync)(pkgPath, { encoding: "utf-8" })).dependencies : {}; for (const pluginName in pluginsList) { const isGSPlugin = pluginName.includes("@godspeedsystems/plugins"); !isGSPlugin && delete pluginsList[pluginName]; } const commonPlugins = pluginNames.filter((plugin) => pluginsList[plugin.value]); const inquirerTableCheckbox = require("@adobe/inquirer-table-checkbox"); inquirer_1.default.registerPrompt("search-table", inquirerTableCheckbox); const tableCheckboxPrompt = { type: "search-table", name: "gsPlugin", message: "Please select godspeed plugin to uninstall:", wordWrap: true, pageSize: 5, searchable: true, style: { "padding-left": 1, "padding-right": 0, head: [], border: [] }, colWidths: [40, 80], columns: [ { name: "Name", wrapOnWordBoundary: true }, { name: "Description", wrapOnWordBoundary: true }, ], rows: commonPlugins, }; async function runPrompt() { try { const answer = await inquirer_1.default.prompt([tableCheckboxPrompt]); if (answer.gsPlugin.length !== 0) { await removeAction(answer.gsPlugin); } else { console.log(chalk_1.default.red.bold("select atleast one plugin to remove")); } } catch (error) { console.error(error); } } runPrompt(); } }); const update = program .command("update") .description(`Update an eventsource/datasource plugin.`) .action(async (pluginName) => { let pluginsList; try { let pkgPath = path_1.default.join((0, process_1.cwd)(), "package.json"); pluginsList = (0, fs_1.existsSync)(pkgPath) ? JSON.parse((0, fs_1.readFileSync)(pkgPath, { encoding: "utf-8" })).dependencies : []; for (const pluginName in pluginsList) { const isGSPlugin = pluginName.includes("@godspeedsystems/plugins"); !isGSPlugin && delete pluginsList[pluginName]; } if (!pluginsList || pluginsList.length) throw new Error(); } catch (error) { console.error("There are no eventsource/datasource plugins installed."); return; } const spinner = (0, ora_1.default)({ text: "Updating plugins... ", spinner: { frames: ["🌍 ", "🌎 ", "🌏 ", "🌐 ", "🌑 ", "🌒 ", "🌓 ", "🌔 "], interval: 180, }, }); async function updatePlugin(pluginsList) { try { spinner.start(); const child = (0, cross_spawn_1.default)("npm", [ "update", ...pluginsList, "--quiet", "--no-warnings", "--silent", "--progress=false", ], { stdio: "inherit", }); await new Promise((resolve) => { child.on("close", () => { resolve(); }); }); spinner.stop(); console.log("\nPlugins updated successfully!"); console.log(chalk_1.default.cyan.bold("Happy coding with Godspeed! 🚀🎉\n")); } catch (error) { spinner.stop(); console.error("Error during updation:", error.message); } } let pkgPath = path_1.default.join((0, process_1.cwd)(), "package.json"); pluginsList = (0, fs_1.existsSync)(pkgPath) ? JSON.parse((0, fs_1.readFileSync)(pkgPath, { encoding: "utf-8" })).dependencies : {}; for (const pluginName in pluginsList) { const isGSPlugin = pluginName.includes("@godspeedsystems/plugins"); !isGSPlugin && delete pluginsList[pluginName]; } const commonPlugins = pluginNames.filter((plugin) => pluginsList[plugin.value]); const inquirerTableCheckbox = require("@adobe/inquirer-table-checkbox"); inquirer_1.default.registerPrompt("search-table", inquirerTableCheckbox); const tableCheckboxPrompt = { type: "search-table", name: "gsPlugin", message: "Please select godspeed plugin to update:", wordWrap: true, pageSize: 5, searchable: true, style: { "padding-left": 1, "padding-right": 0, head: [], border: [] }, colWidths: [40, 80], columns: [ { name: "Name", wrapOnWordBoundary: true }, { name: "Description", wrapOnWordBoundary: true }, ], rows: commonPlugins, }; async function runPrompt() { try { const answer = await inquirer_1.default.prompt([tableCheckboxPrompt]); if (answer.gsPlugin.length !== 0) { await updatePlugin(answer.gsPlugin); } else { console.log(chalk_1.default.red.bold("select atleast one plugin to update")); } } catch (error) { console.error(error); } } runPrompt(); }); exports.default = { add, remove, update }; //# sourceMappingURL=index.js.map