@decaf-ts/fabric-weaver
Version:
template for ts projects
118 lines • 13.7 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseCLI = void 0;
const commander_1 = require("commander");
const index_1 = require("../../index.cjs");
const logging_1 = require("@decaf-ts/logging");
const path_1 = require("../../utils-old/path.cjs");
const env_vars_1 = require("../constants/env-vars.cjs");
const banner_1 = require("../../utils-old/banner.cjs");
const fs_1 = __importDefault(require("fs"));
const path_2 = __importDefault(require("path"));
const parsers_1 = require("../../utils/parsers.cjs");
/**
* @class BaseCLI
* @description Base class for creating command-line interfaces using Commander
* @summary This class provides a foundation for building CLIs in the Fabric Weaver project.
* It sets up a Commander program with basic configuration and logging.
*
* @example
* class MyCLI extends BaseCLI {
* constructor() {
* super("my-cli", "My CLI description");
* this.setupCommands();
* }
*
* private setupCommands() {
* this.program
* .command("hello")
* .description("Say hello")
* .action(() => console.log("Hello, world!"));
* }
* }
*
* const cli = new MyCLI();
* cli.run();
*/
class BaseCLI {
/**
* @constructor
* @param {string} name - The name of the CLI program
* @param {string} description - A brief description of the CLI program
*/
constructor(name, description) {
this.program = new commander_1.Command();
this.log = logging_1.Logging.for(this.constructor.name);
this.program
.name(name)
.description(description)
.version(index_1.VERSION)
.option("-s, --skip-banner", "Suppress the Fabric Weaver banner")
.option("-l, --limiter", "Supress the line after the command output")
.hook("preAction", (cmd) => {
const skipBanner = cmd.opts().skipBanner === true;
const skipLimiter = cmd.opts().limiter === true;
(0, banner_1.printBanner)(skipBanner);
this.log.debug(`Skip banner: ${skipBanner}`);
this.log.debug(`Skip Limiter: ${skipLimiter}`);
this.log.debug(`Starting ${this.program.name()} v${index_1.VERSION}`);
(0, path_1.addFabricToPath)(process.env[env_vars_1.EnvVars.FABRIC_BIN_FOLDER]);
})
.hook("postAction", (cmd) => {
const skipLimiter = cmd.opts().limiter === true;
(0, banner_1.printBorder)(skipLimiter);
});
this.sleep();
this.copy();
}
sleep() {
this.program
.command("sleep")
.option("--time <number>", "sleep time in seconds", parsers_1.safeParseInt)
.action(async () => {
const time = this.program.opts().time || 120;
const ms = time * 1000;
await new Promise((resolve) => setTimeout(resolve, ms));
});
}
copy() {
this.program
.command("copy")
.description("Copy a file from origin to destination")
.requiredOption("--origin <string>", "Origin file path")
.requiredOption("--dest <string>", "Destination file path")
.action(async (options) => {
try {
const { origin, dest } = options;
// Check if the origin file exists
if (!fs_1.default.existsSync(origin)) {
this.log.error(`Origin file does not exist: ${origin}`);
return;
}
// Ensure the destination directory exists
const destDir = path_2.default.dirname(dest);
if (!fs_1.default.existsSync(destDir)) {
fs_1.default.mkdirSync(destDir, { recursive: true });
}
// Copy the file
fs_1.default.copyFileSync(origin, dest);
this.log.info(`File copied successfully from ${origin} to ${dest}`);
}
catch (error) {
this.log.error(`Error copying file: ${error.message}`);
}
});
}
/**
* @method run
* @description Parses the command-line arguments and executes the appropriate command
*/
run() {
this.program.parse(process.argv);
}
}
exports.BaseCLI = BaseCLI;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jbGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9jbGkvYmFzZS1jbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEseUNBQW9DO0FBQ3BDLHVDQUFzQztBQUN0QywrQ0FBb0Q7QUFDcEQsK0NBQXVEO0FBQ3ZELG9EQUFnRDtBQUNoRCxtREFBa0U7QUFDbEUsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4QixpREFBbUQ7QUFFbkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBc0IsT0FBTztJQUkzQjs7OztPQUlHO0lBQ0gsWUFBWSxJQUFZLEVBQUUsV0FBbUI7UUFDM0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLG1CQUFPLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsR0FBRyxHQUFHLGlCQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFOUMsSUFBSSxDQUFDLE9BQU87YUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ1YsV0FBVyxDQUFDLFdBQVcsQ0FBQzthQUN4QixPQUFPLENBQUMsZUFBTyxDQUFDO2FBQ2hCLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxtQ0FBbUMsQ0FBQzthQUNoRSxNQUFNLENBQUMsZUFBZSxFQUFFLDJDQUEyQyxDQUFDO2FBQ3BFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN6QixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQztZQUNsRCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQztZQUNoRCxJQUFBLG9CQUFXLEVBQUMsVUFBVSxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLFVBQVUs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QUNQLENBQUM7SUFFRDs7O09BR0c7SUFDSSxHQUFHO1FBQ1IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQXhGRCwwQkF3RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgVkVSU0lPTiB9IGZyb20gXCIuLi8uLi9pbmRleFwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBhZGRGYWJyaWNUb1BhdGggfSBmcm9tIFwiLi4vLi4vdXRpbHMtb2xkL3BhdGhcIjtcbmltcG9ydCB7IEVudlZhcnMgfSBmcm9tIFwiLi4vY29uc3RhbnRzL2Vudi12YXJzXCI7XG5pbXBvcnQgeyBwcmludEJhbm5lciwgcHJpbnRCb3JkZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMtb2xkL2Jhbm5lclwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IHNhZmVQYXJzZUludCB9IGZyb20gXCIuLi8uLi91dGlscy9wYXJzZXJzXCI7XG5cbi8qKlxuICogQGNsYXNzIEJhc2VDTElcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIGNsYXNzIGZvciBjcmVhdGluZyBjb21tYW5kLWxpbmUgaW50ZXJmYWNlcyB1c2luZyBDb21tYW5kZXJcbiAqIEBzdW1tYXJ5IFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBmb3VuZGF0aW9uIGZvciBidWlsZGluZyBDTElzIGluIHRoZSBGYWJyaWMgV2VhdmVyIHByb2plY3QuXG4gKiBJdCBzZXRzIHVwIGEgQ29tbWFuZGVyIHByb2dyYW0gd2l0aCBiYXNpYyBjb25maWd1cmF0aW9uIGFuZCBsb2dnaW5nLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjbGFzcyBNeUNMSSBleHRlbmRzIEJhc2VDTEkge1xuICogICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICBzdXBlcihcIm15LWNsaVwiLCBcIk15IENMSSBkZXNjcmlwdGlvblwiKTtcbiAqICAgICB0aGlzLnNldHVwQ29tbWFuZHMoKTtcbiAqICAgfVxuICpcbiAqICAgcHJpdmF0ZSBzZXR1cENvbW1hbmRzKCkge1xuICogICAgIHRoaXMucHJvZ3JhbVxuICogICAgICAgLmNvbW1hbmQoXCJoZWxsb1wiKVxuICogICAgICAgLmRlc2NyaXB0aW9uKFwiU2F5IGhlbGxvXCIpXG4gKiAgICAgICAuYWN0aW9uKCgpID0+IGNvbnNvbGUubG9nKFwiSGVsbG8sIHdvcmxkIVwiKSk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBjb25zdCBjbGkgPSBuZXcgTXlDTEkoKTtcbiAqIGNsaS5ydW4oKTtcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VDTEkge1xuICBwcm90ZWN0ZWQgcHJvZ3JhbTogQ29tbWFuZDtcbiAgcHJvdGVjdGVkIGxvZzogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgQ0xJIHByb2dyYW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uIC0gQSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgQ0xJIHByb2dyYW1cbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZykge1xuICAgIHRoaXMucHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG4gICAgdGhpcy5sb2cgPSBMb2dnaW5nLmZvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuXG4gICAgdGhpcy5wcm9ncmFtXG4gICAgICAubmFtZShuYW1lKVxuICAgICAgLmRlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKVxuICAgICAgLnZlcnNpb24oVkVSU0lPTilcbiAgICAgIC5vcHRpb24oXCItcywgLS1za2lwLWJhbm5lclwiLCBcIlN1cHByZXNzIHRoZSBGYWJyaWMgV2VhdmVyIGJhbm5lclwiKVxuICAgICAgLm9wdGlvbihcIi1sLCAtLWxpbWl0ZXJcIiwgXCJTdXByZXNzIHRoZSBsaW5lIGFmdGVyIHRoZSBjb21tYW5kIG91dHB1dFwiKVxuICAgICAgLmhvb2soXCJwcmVBY3Rpb25cIiwgKGNtZCkgPT4ge1xuICAgICAgICBjb25zdCBza2lwQmFubmVyID0gY21kLm9wdHMoKS5za2lwQmFubmVyID09PSB0cnVlO1xuICAgICAgICBjb25zdCBza2lwTGltaXRlciA9IGNtZC5vcHRzKCkubGltaXRlciA9PT0gdHJ1ZTtcbiAgICAgICAgcHJpbnRCYW5uZXIoc2tpcEJhbm5lcik7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTa2lwIGJhbm5lcjogJHtza2lwQmFubmVyfWApO1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2tpcCBMaW1pdGVyOiAke3NraXBMaW1pdGVyfWApO1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU3RhcnRpbmcgJHt0aGlzLnByb2dyYW0ubmFtZSgpfSB2JHtWRVJTSU9OfWApO1xuICAgICAgICBhZGRGYWJyaWNUb1BhdGgocHJvY2Vzcy5lbnZbRW52VmFycy5GQUJSSUNfQklOX0ZPTERFUl0pO1xuICAgICAgfSlcbiAgICAgIC5ob29rKFwicG9zdEFjdGlvblwiLCAoY21kKSA9PiB7XG4gICAgICAgIGNvbnN0IHNraXBMaW1pdGVyID0gY21kLm9wdHMoKS5saW1pdGVyID09PSB0cnVlO1xuICAgICAgICBwcmludEJvcmRlcihza2lwTGltaXRlcik7XG4gICAgICB9KTtcblxuICAgIHRoaXMuc2xlZXAoKTtcbiAgICB0aGlzLmNvcHkoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2xlZXAoKSB7XG4gICAgdGhpcy5wcm9ncmFtXG4gICAgICAuY29tbWFuZChcInNsZWVwXCIpXG4gICAgICAub3B0aW9uKFwiLS10aW1lIDxudW1iZXI+XCIsIFwic2xlZXAgdGltZSBpbiBzZWNvbmRzXCIsIHNhZmVQYXJzZUludClcbiAgICAgIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lID0gdGhpcy5wcm9ncmFtLm9wdHMoKS50aW1lIHx8IDEyMDtcbiAgICAgICAgY29uc3QgbXMgPSB0aW1lICogMTAwMDtcblxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvcHkoKSB7XG4gICAgdGhpcy5wcm9ncmFtXG4gICAgICAuY29tbWFuZChcImNvcHlcIilcbiAgICAgIC5kZXNjcmlwdGlvbihcIkNvcHkgYSBmaWxlIGZyb20gb3JpZ2luIHRvIGRlc3RpbmF0aW9uXCIpXG4gICAgICAucmVxdWlyZWRPcHRpb24oXCItLW9yaWdpbiA8c3RyaW5nPlwiLCBcIk9yaWdpbiBmaWxlIHBhdGhcIilcbiAgICAgIC5yZXF1aXJlZE9wdGlvbihcIi0tZGVzdCA8c3RyaW5nPlwiLCBcIkRlc3RpbmF0aW9uIGZpbGUgcGF0aFwiKVxuICAgICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgb3JpZ2luLCBkZXN0IH0gPSBvcHRpb25zO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG9yaWdpbiBmaWxlIGV4aXN0c1xuICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhvcmlnaW4pKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgT3JpZ2luIGZpbGUgZG9lcyBub3QgZXhpc3Q6ICR7b3JpZ2lufWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVuc3VyZSB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgICAgIGNvbnN0IGRlc3REaXIgPSBwYXRoLmRpcm5hbWUoZGVzdCk7XG4gICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGRlc3REaXIpKSB7XG4gICAgICAgICAgICBmcy5ta2RpclN5bmMoZGVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ29weSB0aGUgZmlsZVxuICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhvcmlnaW4sIGRlc3QpO1xuXG4gICAgICAgICAgdGhpcy5sb2cuaW5mbyhgRmlsZSBjb3BpZWQgc3VjY2Vzc2Z1bGx5IGZyb20gJHtvcmlnaW59IHRvICR7ZGVzdH1gKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgRXJyb3IgY29weWluZyBmaWxlOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBydW5cbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBhbmQgZXhlY3V0ZXMgdGhlIGFwcHJvcHJpYXRlIGNvbW1hbmRcbiAgICovXG4gIHB1YmxpYyBydW4oKTogdm9pZCB7XG4gICAgdGhpcy5wcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndik7XG4gIH1cbn1cbiJdfQ==