@boostercloud/cli
Version:
CLI of the Booster Framework, the next level of abstraction for cloud-native applications
85 lines (84 loc) • 3.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const core_1 = require("@oclif/core");
const base_command_1 = require("../../common/base-command");
const script_1 = require("../../common/script");
const brand_1 = require("../../common/brand");
const target_1 = require("../../services/generator/target");
const path = require("path");
const generator_1 = require("../../services/generator");
const project_checker_1 = require("../../services/project-checker");
const filenames_1 = require("../../common/filenames");
class ReadModel extends base_command_1.default {
async run() {
var _a, _b;
const { args, flags } = await this.parse(ReadModel);
try {
const fields = (_a = flags.fields) !== null && _a !== void 0 ? _a : [];
const projections = (_b = flags.projects) !== null && _b !== void 0 ? _b : [];
if (!args.readModelName)
throw "You haven't provided a read model name, but it is required, run with --help for usage";
return run(args.readModelName, fields, projections);
}
catch (error) {
console.error(error);
}
}
}
ReadModel.description = 'create a new read model';
ReadModel.flags = {
help: core_1.Flags.help({ char: 'h' }),
fields: core_1.Flags.string({
char: 'f',
description: 'fields that this read model will contain',
multiple: true,
}),
projects: core_1.Flags.string({
char: 'p',
description: 'entities that this read model will project to build its state',
multiple: true,
}),
};
ReadModel.args = {
readModelName: core_1.Args.string(),
};
exports.default = ReadModel;
const run = async (name, rawFields, rawProjections) => script_1.Script.init(`boost ${brand_1.default.energize('new:read-model')} 🚧`, (0, target_1.joinParsers)((0, target_1.parseName)(name), (0, target_1.parseFields)(rawFields), (0, target_1.parseProjections)(rawProjections)))
.step('Verifying project', project_checker_1.checkCurrentDirIsABoosterProject)
.step('Creating new read model', generateReadModel)
.info('Read model generated!')
.done();
function generateImports(info) {
const eventsImports = info.projections.map((projection) => {
const fileName = (0, filenames_1.classNameToFileName)(projection.entityName);
return {
packagePath: `../entities/${fileName}`,
commaSeparatedComponents: projection.entityName,
};
});
const coreComponents = ['ReadModel'];
if (info.projections.length > 0) {
coreComponents.push('Projects');
}
return [
{
packagePath: '@boostercloud/framework-core',
commaSeparatedComponents: coreComponents.join(', '),
},
{
packagePath: '@boostercloud/framework-types',
commaSeparatedComponents: info.projections.length > 0 ? 'UUID, ProjectionResult' : 'UUID',
},
...eventsImports,
];
}
const generateReadModel = (info) => (0, generator_1.generate)({
name: info.name,
extension: '.ts',
placementDir: path.join('src', 'read-models'),
template: (0, generator_1.template)('read-model'),
info: {
imports: generateImports(info),
...info,
},
});