@alma3lol/represent-cli
Version:
A command-line interface for RepresentJS
317 lines • 12.3 kB
JavaScript
"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