UNPKG

@tsclean/scaffold

Version:

This CLI creates an initial structure of a project based on clean architecture.

149 lines (148 loc) 7.07 kB
"use strict"; 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