@tsclean/scaffold
Version:
This CLI creates an initial structure of a project based on clean architecture.
149 lines (148 loc) • 7.07 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AdapterCreateCommand = void 0;
const ora_1 = __importDefault(require("ora"));
const paths_1 = require("../utils/paths");
const emojis_1 = require("../utils/emojis");
const messages_1 = require("../utils/messages");
const CommandUtils_1 = require("./CommandUtils");
const constants_1 = require("../utils/constants");
const helpers_1 = require("../utils/helpers");
const DatabaseTemplate_1 = require("../templates/DatabaseTemplate");
const AdaptersTemplate_1 = require("../templates/AdaptersTemplate");
const ModelsTemplate_1 = require("../templates/ModelsTemplate");
const SingletonGenerateTemplate_1 = require("../templates/SingletonGenerateTemplate");
class AdapterCreateCommand {
constructor() {
this.command = "create:adapter-orm";
this.describe = "Generate a new adapter for ORM";
}
builder(args) {
return args
.option("name", {
alias: "n",
describe: "Name the adapter",
demandOption: true
})
.option("orm", {
alias: "orm",
describe: "Orm",
demandOption: true
})
.option("manager", {
alias: "mn",
describe: "Database manager",
demandOption: true
});
}
async handler(args) {
let spinner;
try {
setTimeout(async () => (spinner = (0, ora_1.default)(constants_1.CONSTANTS.INSTALLING).start()), 1000);
const basePath = paths_1.PATHS.BASE_PATH_ADAPTER(args.orm);
const filename = paths_1.PATHS.FILE_NAME_ADAPTER(args.name, args.manager, args.orm);
// The path for the validation of the file input is made up.
const path = `${basePath}${filename}`;
const base = process.cwd();
// Validate that the entity exists for importing into the ORM adapter.
CommandUtils_1.CommandUtils.readModelFiles(paths_1.PATHS.PATH_MODELS_ENTITY(), args.name);
// Validate that another manager is not implemented.
CommandUtils_1.CommandUtils.readManagerFiles(paths_1.PATHS.PATH_MODELS_ORM(base, args.orm), args.manager);
if (args.orm === constants_1.CONSTANTS.MONGO || args.orm === constants_1.CONSTANTS.SEQUELIZE) {
// We validate if the file exists, to throw the exception.
const fileExists = await CommandUtils_1.CommandUtils.fileExists(path);
// Throw message exception
if (fileExists)
throw messages_1.MESSAGES.FILE_EXISTS(path);
const filePath = paths_1.PATHS.PATH_SINGLETON(base);
const paramsTemplate = {
filepath: filePath,
manager: args.manager,
instance: args.orm
};
// Singleton
SingletonGenerateTemplate_1.SingletonGenerateTemplate.generate(paramsTemplate);
// Adapter
await CommandUtils_1.CommandUtils.createFile(paths_1.PATHS.PATH_ADAPTER(base, args.orm, args.name, args.manager), AdaptersTemplate_1.AdaptersTemplate.getRepositoryAdapter(args.name, args.orm, args.manager));
// Model
await CommandUtils_1.CommandUtils.createFile(paths_1.PATHS.PATH_MODEL(base, args.orm, args.name, args.manager), ModelsTemplate_1.ModelsTemplate.getModels(args.name, args.orm, args.manager));
if (args.orm === constants_1.CONSTANTS.SEQUELIZE) {
// Singletons for mysql, pg
await CommandUtils_1.CommandUtils.createFile(paths_1.PATHS.PATH_SINGLETON_INSTANCES(base, args.manager), DatabaseTemplate_1.DatabaseTemplate.getMysqlAndPostgresSingleton(args.name, args.manager));
}
if (args.orm === constants_1.CONSTANTS.MONGO) {
// Singletons for mongoose
await CommandUtils_1.CommandUtils.createFile(paths_1.PATHS.PATH_SINGLETON_INSTANCES(base, args.manager, args.orm), DatabaseTemplate_1.DatabaseTemplate.getMongooseSingleton(args.orm));
}
// Dependencies
const packageJsonContents = await CommandUtils_1.CommandUtils.readFile(base + "/package.json");
await CommandUtils_1.CommandUtils.createFile(base + "/package.json", AdapterCreateCommand.getPackageJson(packageJsonContents, args.orm, args.manager));
await (0, helpers_1.executeCommand)(constants_1.CONSTANTS.NPM_INSTALL);
// This message is only displayed in sequelize
const env = args.manager
? `${emojis_1.EMOJIS.ROCKET} ${messages_1.MESSAGES.CONFIG_ENV()}`
: "";
setTimeout(() => {
spinner.succeed(constants_1.CONSTANTS.INSTALLATION_COMPLETED);
spinner.stopAndPersist({
symbol: emojis_1.EMOJIS.ROCKET,
text: `${messages_1.MESSAGES.FILE_SUCCESS(constants_1.CONSTANTS.ADAPTER, path)}
${env}`
});
}, 1000 * 5);
}
else {
throw messages_1.MESSAGES.ERROR_ORM(args.orm);
}
}
catch (error) {
(0, helpers_1.errorMessage)(error, constants_1.CONSTANTS.ADAPTER);
}
}
/**
*
* @protected
*/
static generateProvider() {
return `
export const adapters = [];
export const services = [];
`;
}
/**
*
* @param dependencies
* @param orm
* @param manager
* @private
*/
static getPackageJson(dependencies, orm, manager) {
const updatePackages = JSON.parse(dependencies);
switch (orm) {
case constants_1.CONSTANTS.MONGO:
updatePackages.dependencies["mongoose"] = "^8.0.0";
break;
case constants_1.CONSTANTS.SEQUELIZE:
updatePackages.dependencies["sequelize"] = "^6.37.5";
updatePackages.dependencies["sequelize-typescript"] = "^2.1.6";
updatePackages.devDependencies["@types/sequelize"] = "^4.28.20";
switch (manager) {
case constants_1.CONSTANTS.MYSQL:
updatePackages.dependencies["mysql2"] = "^3.11.3";
break;
case constants_1.CONSTANTS.POSTGRES:
updatePackages.dependencies["pg"] = "^8.11.3";
updatePackages.dependencies["pg-hstore"] = "^2.3.4";
break;
default:
break;
}
}
return JSON.stringify(updatePackages, undefined, 3);
}
}
exports.AdapterCreateCommand = AdapterCreateCommand;
//# sourceMappingURL=CommandCreateAdapter.js.map