@godspeedsystems/godspeed
Version:
Godspeed CLI
610 lines • 27.7 kB
JavaScript
;
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