@boostercloud/cli
Version:
CLI of the Booster Framework, the next level of abstraction for cloud-native applications
88 lines (87 loc) • 3.76 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateConfigFiles = generateConfigFiles;
exports.installDependencies = installDependencies;
exports.generateRootDirectory = generateRootDirectory;
exports.initializeGit = initializeGit;
exports.projectDir = projectDir;
const fs = require("fs-extra");
const execa_1 = require("execa");
const Mustache = require("mustache");
const path = require("path");
const tsConfig = require("../templates/project/tsconfig-json");
const tsConfigEsLint = require("../templates/project/tsconfig.eslint-json");
const esLintIgnore = require("../templates/project/eslintignore");
const esLintRc = require("../templates/project/eslintrc-js");
const gitIgnore = require("../templates/project/gitignore");
const packageJson = require("../templates/project/package-json");
const configTs = require("../templates/project/config-ts");
const indexTs = require("../templates/project/index-ts");
const prettierRc = require("../templates/project/prettierrc-yaml");
const mochaRc = require("../templates/project/mocharc-yml");
const errors_1 = require("../common/errors");
const package_manager_1 = require("./package-manager");
const effect_1 = require("@boostercloud/framework-types/dist/effect");
const live_impl_1 = require("./package-manager/live.impl");
async function generateConfigFiles(config) {
await Promise.all(filesToGenerate.map(renderToFile(config)));
}
async function installDependencies(config) {
const effect = installDependenciesEff(config);
return (0, effect_1.unsafeRunEffect)((0, effect_1.pipe)(effect, (0, effect_1.mapError)((e) => e.error)), {
layer: live_impl_1.LivePackageManager,
onError: (0, errors_1.guardError)('Could not install dependencies'),
});
}
const installDependenciesEff = (config) => (0, effect_1.gen)(function* ($) {
const { setProjectRoot, installAllDependencies } = yield* $(package_manager_1.PackageManagerService);
yield* $(setProjectRoot(projectDir(config)));
yield* $(installAllDependencies());
});
async function generateRootDirectory(config) {
const srcDir = path.join(projectDir(config), 'src');
const dirs = [
[srcDir, 'commands'],
[srcDir, 'common'],
[srcDir, 'config'],
[srcDir, 'entities'],
[srcDir, 'events'],
[srcDir, 'event-handlers'],
[srcDir, 'read-models'],
[srcDir, 'scheduled-commands'],
];
await Promise.all(dirs.map(createDirectory));
}
async function initializeGit(config) {
try {
await (0, execa_1.command)('git init && git add -A && git commit -m "Initial commit"', { cwd: projectDir(config), shell: true });
}
catch (e) {
throw (0, errors_1.wrapExecError)(e, 'Could not initialize git repository');
}
}
function renderToFile(templateData) {
return async ([filepath, template]) => {
const rendered = Mustache.render(template, templateData);
const renderPath = path.join(process.cwd(), templateData.projectName, ...filepath);
return fs.outputFile(renderPath, rendered);
};
}
function projectDir(config) {
return path.join(process.cwd(), config.projectName);
}
async function createDirectory(paths) {
return fs.mkdirs(path.join(...paths));
}
const filesToGenerate = [
[['.eslintignore'], esLintIgnore.template],
[['.eslintrc.js'], esLintRc.template],
[['.gitignore'], gitIgnore.template],
[['package.json'], packageJson.template],
[['tsconfig.json'], tsConfig.template],
[['tsconfig.eslint.json'], tsConfigEsLint.template],
[['.prettierrc.yaml'], prettierRc.template],
[['src', 'config', 'config.ts'], configTs.template],
[['src', 'index.ts'], indexTs.template],
[['.mocharc.yml'], mochaRc.template],
];