@foal/cli
Version:
CLI tool for FoalTS
81 lines (80 loc) • 4.28 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CreateRestApiCommandService = void 0;
// std
const path_1 = require("path");
// 3p
const safe_1 = require("colors/safe");
// FoalTS
const services_1 = require("../../../services");
const utils_1 = require("../utils");
/**
* Service for creating a new REST API endpoint (entity and controller).
*/
class CreateRestApiCommandService {
generator;
constructor(generator) {
this.generator = generator;
}
/**
* Create a new REST API endpoint (entity and controller).
*
* @param {string} name - The name of the REST API endpoint
* @param {boolean} register - Whether to register the controller in app.controller.ts
* @param {boolean} auth - Whether to include authentication/authorization
* @returns {void}
*/
run({ name, register, auth }) {
auth = auth || false;
if (this.generator.projectHasDependency('mongodb')) {
throw new services_1.ClientError('"npx foal generate|g rest-api <name>" cannot be used in a MongoDB project.');
}
if (this.generator.exists('src/app/entities') && this.generator.exists('src/app/controllers')) {
this.generator.cd('src/app');
}
else if (!this.generator.exists('entities') || !this.generator.exists('controllers')) {
throw new services_1.ClientError('Impossible to generate a REST API endpoint. '
+ 'The directories controllers/ and entities/ (or src/app/controllers and src/app/entities) were not found.');
}
const locals = {
...(0, utils_1.getNames)((0, path_1.basename)(name)),
entitiesPath: `${name.split('/').map(() => '../').join('')}entities`,
createDataSourcePath: `${name.split('/').map(() => '../').join('')}../db`,
};
const subdir = (0, path_1.dirname)(name);
const parentControllerPath = `${subdir === '.' ? 'app' : (0, path_1.basename)(subdir)}.controller.ts`;
const entityFileName = `${locals.kebabName}.entity.ts`;
this.generator
.cd('entities')
.renderOnlyIf(!auth, 'rest-api/entities/entity.ts', entityFileName, locals)
.renderOnlyIf(auth, 'rest-api/entities/entity.auth.ts', entityFileName, locals)
.ensureFile('index.ts')
.addNamedExportIn('index.ts', locals.upperFirstCamelName, `./${locals.kebabName}.entity`)
.cd('..');
const controllerClassName = `${locals.upperFirstCamelName}Controller`;
const controllerFileName = `${locals.kebabName}.controller.ts`;
const controllerSpecFileName = `${locals.kebabName}.controller.spec.ts`;
this.generator
.cd('controllers')
.ensureDir(subdir)
.cd(subdir)
.renderOnlyIf(!auth, 'rest-api/controllers/controller.ts', controllerFileName, locals)
.renderOnlyIf(auth, 'rest-api/controllers/controller.auth.ts', controllerFileName, locals)
.renderOnlyIf(!auth, 'rest-api/controllers/controller.spec.ts', controllerSpecFileName, locals)
.renderOnlyIf(auth, 'rest-api/controllers/controller.spec.auth.ts', controllerSpecFileName, locals)
.ensureFile('index.ts')
.addNamedExportIn('index.ts', controllerClassName, `./${locals.kebabName}.controller`)
.cd('..');
if (register) {
this.generator
.addOrExtendNamedImportIn(parentControllerPath, 'controller', '@foal/core', { logs: false })
.addOrExtendNamedImportIn(parentControllerPath, controllerClassName, `./${subdir === '.' ? 'controllers' : (0, path_1.basename)(subdir)}`, { logs: false })
.addOrExtendClassArrayPropertyIn(parentControllerPath, 'subControllers', `controller('/${locals.kebabName}s', ${controllerClassName})`);
}
if (process.env.P1Z7kEbSUUPMxF8GqPwD8Gx_FOAL_CLI_TEST !== 'true') {
console.log(`\n${(0, safe_1.underline)('Next steps:')} Complete ${locals.upperFirstCamelName} (${locals.kebabName}.entity)`
+ ` and ${locals.camelName}Schema (${locals.kebabName}.controller).`);
}
}
}
exports.CreateRestApiCommandService = CreateRestApiCommandService;