UNPKG

@alma3lol/represent-cli

Version:

A command-line interface for RepresentJS

317 lines 12.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.cli = void 0; const tslib_1 = require("tslib"); const commander_1 = require("commander"); const inquirer_1 = tslib_1.__importDefault(require("inquirer")); const lodash_1 = tslib_1.__importDefault(require("lodash")); const chalk_1 = require("chalk"); const process_1 = require("process"); const fs_1 = require("fs"); const templates_1 = require("../templates"); const models_1 = require("./models"); const orange = chalk_1.hex("#F56E00"); exports.cli = new commander_1.Command(); exports.cli.option("-s, --src-dir <srcDir>", "Directory to look for models. [Default: 'src/models']", "src/models"); exports.cli.option("-p, --package <packageFile>", "package.json file path. [Default: './package.json']", "package.json"); exports.cli.option("-m, --manager <manager>", "Package manager. Accepts: 'npm', 'yarn', 'autodetect'. [Default: 'autodetect']", "autodetect"); exports.cli.command("interactive") .action(async () => { console.clear(); const { action } = await inquirer_1.default.prompt([ { name: "action", message: "Choose an action:", type: "list", choices: [ { name: "Create a model", value: "create" }, { name: "Delete a model", value: "delete" }, { name: "Update a model", value: "update" } ] } ]); switch (action) { case "delete": // break; case "update": // break; default: exports.cli.parse(["", "", "model"]); break; } }) .alias("i"); exports.cli.command("model") .arguments("[name]") .action(async (name) => { console.clear(); let modelName = name !== null && name !== void 0 ? name : ""; if (modelName === "") { const { inputModelName } = await inquirer_1.default.prompt([ { name: 'inputModelName', message: 'Model name: ', type: 'input' } ]); modelName = inputModelName; } if (modelName === "") { console.error(chalk_1.red("Model name is required!")); process_1.exit(1); } console.log(); exports.cli.parse(["", "", "property", "add", modelName]); }) .alias("m"); exports.cli.command("property") .arguments("<operation> [model] [name]") .exitOverride(err => { if (/'operation'/.test(err.message)) { console.error(chalk_1.red("Operation is required and must be either 'add', 'update', or 'delete'!")); process_1.exit(1); } }) .action(async (operation, model, name) => { let modelInstance = new templates_1.ModelTemplate({ name: model !== null && model !== void 0 ? model : "", uri: "", properties: [], table: "", relations: [] }); if (!model) { console.clear(); const { shouldCreateNewModel } = await inquirer_1.default.prompt([ { name: "shouldCreateNewModel", type: "confirm", message: "Create a new model?", default: true } ]); const choices = []; if (!shouldCreateNewModel) { models_1.Models.getExistingModels().forEach(modelName => { choices.push({ name: modelName, value: modelName }); }); } const { inputModelName, existingModelName } = await inquirer_1.default.prompt([ { name: 'inputModelName', message: 'Model name: ', type: 'input', when: () => shouldCreateNewModel }, { name: "existingModelName", message: "Choose a model: ", type: "list", choices, when: () => !shouldCreateNewModel } ]); model = inputModelName !== null && inputModelName !== void 0 ? inputModelName : existingModelName; if (existingModelName) { modelInstance = templates_1.ModelTemplate.render(fs_1.readFileSync(`${exports.cli.opts()["srcDir"]}/${templates_1.ModelTemplate.generateFileName(existingModelName)}.ts`).toString("utf8")); } else { modelInstance.name = inputModelName; } } else { if (fs_1.existsSync(`${exports.cli.opts()["srcDir"]}/${templates_1.ModelTemplate.generateFileName(model)}.ts`)) { modelInstance = templates_1.ModelTemplate.render(fs_1.readFileSync(`${exports.cli.opts()["srcDir"]}/${templates_1.ModelTemplate.generateFileName(model)}.ts`).toString("utf8")); } } if (!model) { console.error(chalk_1.red("Model name is required!")); process_1.exit(1); } let uri = modelInstance.URI; if (!uri) { const { inputURI } = await inquirer_1.default.prompt([ { name: "inputURI", message: "Model's URI: ", type: "input", } ]); uri = inputURI; } if (!uri) { console.error(chalk_1.red("URI is required!")); process_1.exit(1); } modelInstance.URI = uri; console.log(); switch (operation) { case "add": const properties = []; modelInstance.properties.find().forEach(property => { properties.push({ propertyType: property.type, propertyName: property.name, required: property.required, idProperty: property.id, defaultValue: property.defaultValue, propertyArrayType: property.arrType }); }); let idPropertyHasBeenTaken = lodash_1.default.find(modelInstance.properties.find(), { id: true }) ? true : false; while (true) { const property = await inquirer_1.default.prompt([ { name: "propertyName", message: "Property name: ", type: "input", default: name, when: () => !name, validate: propertyName => { const result = !lodash_1.default.find(properties, { propertyName }); if (!result) { return chalk_1.red("Property name already exist!"); } return result; } }, { name: "idProperty", default: false, message: "Is this the ID property?", type: "confirm", when: answer => answer.propertyName && !idPropertyHasBeenTaken }, { name: "propertyType", message: "Type: ", type: "list", choices: [ { name: "String", value: "string" }, { name: "Boolean", value: "boolean" }, { name: "Number", value: "number" }, { name: "Object", value: "object" }, { name: "Array", value: "array" } ], when: answer => answer.propertyName }, { name: "propertyArrayType", message: "Array Type: ", type: "list", choices: [ { name: "String", value: "string" }, { name: "Boolean", value: "boolean" }, { name: "Number", value: "number" }, { name: "Object", value: "object" } ], when: answer => answer.propertyName && answer.propertyType === "array" }, { name: "required", message: "Is it required?", type: "confirm", default: true, when: answer => answer.propertyName && !answer.idProperty }, { name: "shouldHaveDefaultValue", message: "Does it have a default value?", type: "confirm", default: false, when: answer => !answer.idProperty && !answer.required && answer.propertyName }, { name: "defaultValue", message: "Default value: ", type: "input", when: answer => answer.shouldHaveDefaultValue } ]); if (property.propertyName === "") break; if (property.idProperty === true) idPropertyHasBeenTaken = true; lodash_1.default.unset(property, "shouldHaveDefaultValue"); properties.push(property); console.log(); } if (properties.length === 0) { console.error(chalk_1.red("No properties has been provided!")); process_1.exit(1); } modelInstance = new templates_1.ModelTemplate({ name: modelInstance.name, uri: modelInstance.URI, table: modelInstance.table, properties: [], relations: modelInstance.relations.find() }); properties.forEach(property => { const prop = { type: property.propertyType, name: property.propertyName }; if (property.idProperty) prop.id = true; if (property.propertyArrayType) prop.arrType = property.propertyArrayType; if (property.defaultValue) prop.defaultValue = property.defaultValue; if (property.required || property.idProperty) prop.required = true; modelInstance.properties.add(prop); }); fs_1.writeFileSync(`${exports.cli.opts()["srcDir"]}/${templates_1.ModelTemplate.generateFileName(modelInstance.name)}.ts`, modelInstance.generate(), { encoding: "utf8" }); break; case "update": // break; case "delete": // break; } }) .alias("p"); //# sourceMappingURL=commander.js.map