@avleon/cli
Version:
> **🚧 This project is in active development.** > > It is **not stable** and **not ready** for live environments. > Use **only for testing, experimentation, or internal evaluation**. > > ####❗ Risks of using this in production: > > - 🔄 Breaking
93 lines (92 loc) • 4.51 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createController = createController;
const fs_1 = require("fs");
const path_1 = __importDefault(require("path"));
const path_helper_1 = require("./helpers/path-helper");
const promises_1 = __importDefault(require("node:fs/promises"));
const file_helper_1 = require("./helpers/file-helper");
const lodash_1 = require("lodash");
function capitalize(str) {
if (!str)
return '';
return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
}
function lower(str) {
return str.toLowerCase();
}
function exportNamesAndPath(input) {
const parts = input.split('/');
const lastPart = parts.pop();
const filePath = parts.length ? parts.join('/') + '/' : '.';
// Normalize base name by removing trailing "Controller" (case-insensitive)
const rawName = lastPart.replace(/controller$/i, '');
// Create className in PascalCase + Controller
const className = (0, lodash_1.upperFirst)((0, lodash_1.camelCase)(rawName));
// Create fileName in kebab-case + .controller.ts
const fileName = `${(0, lodash_1.kebabCase)(rawName)}.controller.ts`;
return { className, fileName, filePath };
}
const controllersStubs = {
basic: path_helper_1.pathHelper.stubPath('controllers/basic-controller.stub'),
rest: path_helper_1.pathHelper.stubPath('controllers/basic-controller.stub'),
ormRest: path_helper_1.pathHelper.stubPath('controllers/orm-rest-controller.stub')
};
async function createController(name, options = { force: false, resource: false, prefix: true, rest: false, model: null, root: null }, p) {
if (!name) {
throw new Error("Controller name not found. use --name or npx avleon make:controller HomeController");
}
// determine stub for generate
let stubPath = controllersStubs.basic;
if (options.rest) {
stubPath = controllersStubs.rest;
if (options.model) {
stubPath = controllersStubs.ormRest;
}
}
// determine root path for create controller file
const rootPath = options.root ? 'src/' + options.root + '/' : 'src/controllers/';
// ensure file create directory exits
if (name.split("/").length > 1) {
if (!(0, fs_1.existsSync)(path_1.default.join(rootPath, name.split("/").splice(-1, 1).join("/")))) {
await promises_1.default.mkdir(path_1.default.join(rootPath, name.replace('/' + file_helper_1.fh.filenameFromPath(name), '')), { recursive: true });
}
}
// read stub content from stub file
const content = await promises_1.default.readFile(stubPath, 'utf8');
const names = (0, file_helper_1.resolveNames)(file_helper_1.fh.filenameFromPath(name), 'Controller');
const className = names.className.replace("Controller", '');
if (options.model) {
await createRestService(className, options.model);
}
let replacedContent = content
.replaceAll('{Controller}', className)
.replaceAll('{controller}', names.varName);
if (options.model) {
replacedContent = replacedContent
.replaceAll('{Model}', capitalize(options.model))
.replaceAll('{model}', lower(options.model));
}
if (!options.prefix) {
replacedContent = replacedContent.replace(/@ApiController\s*\(([^)]*)\)/g, '@ApiController');
}
await promises_1.default.writeFile(path_1.default.join(rootPath, (0, file_helper_1.getFilePathWithoutName)(name) + "/" + (0, lodash_1.kebabCase)(className) + '.controller.ts'), replacedContent, 'utf8');
console.log("Controller created succssessfully!");
}
async function createRestService(name, model) {
let stubPath = path_helper_1.pathHelper.stubPath('services/rest-service.stub');
const content = await promises_1.default.readFile(stubPath, 'utf8');
const names = (0, file_helper_1.resolveNames)(file_helper_1.fh.filenameFromPath(name), 'Controller');
let replacedContent = content
.replaceAll('{Service}', name);
if (model) {
replacedContent = replacedContent
.replaceAll('{Model}', capitalize(model))
.replaceAll('{model}', lower(model));
}
await promises_1.default.writeFile(path_1.default.join('src/services/', (0, lodash_1.kebabCase)(name) + '.service.ts'), replacedContent, 'utf8');
console.log("Service created succssessfully!");
}