@boostercloud/cli
Version:
CLI of the Booster Framework, the next level of abstraction for cloud-native applications
90 lines (89 loc) • 4.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DEPLOYMENT_SANDBOX = void 0;
exports.createDeploymentSandbox = createDeploymentSandbox;
exports.cleanDeploymentSandbox = cleanDeploymentSandbox;
exports.compileProjectAndLoadConfig = compileProjectAndLoadConfig;
exports.compileProject = compileProject;
exports.cleanProject = cleanProject;
const path = require("path");
const errors_1 = require("../common/errors");
const project_checker_1 = require("./project-checker");
const environment_1 = require("./environment");
const sandbox_1 = require("../common/sandbox");
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");
exports.DEPLOYMENT_SANDBOX = path.join(process.cwd(), '.deploy');
async function createDeploymentSandbox() {
const config = await compileProjectAndLoadConfig(process.cwd());
const sandboxRelativePath = (0, sandbox_1.createSandboxProject)(exports.DEPLOYMENT_SANDBOX, config.assets);
const effect = (0, effect_1.gen)(function* ($) {
const { setProjectRoot, installProductionDependencies } = yield* $(package_manager_1.PackageManagerService);
yield* $(setProjectRoot(sandboxRelativePath));
yield* $(installProductionDependencies());
});
await (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 production dependencies'),
});
return sandboxRelativePath;
}
async function cleanDeploymentSandbox() {
(0, sandbox_1.removeSandboxProject)(exports.DEPLOYMENT_SANDBOX);
}
async function compileProjectAndLoadConfig(userProjectPath) {
await (0, project_checker_1.checkItIsABoosterProject)(userProjectPath);
await compileProject(userProjectPath);
return readProjectConfig(userProjectPath);
}
async function compileProject(projectPath) {
const effect = compileProjectEff(projectPath);
return await (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)('Project contains compilation errors'),
});
}
const compileProjectEff = (projectPath) => (0, effect_1.gen)(function* ($) {
const { setProjectRoot, build } = yield* $(package_manager_1.PackageManagerService);
yield* $(setProjectRoot(projectPath));
yield* $(cleanProjectEff(projectPath));
return yield* $(build([]));
});
async function cleanProject(projectPath) {
const effect = cleanProjectEff(projectPath);
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 clean project'),
});
}
const cleanProjectEff = (projectPath) => (0, effect_1.gen)(function* ($) {
const { setProjectRoot, runScript } = yield* $(package_manager_1.PackageManagerService);
yield* $(setProjectRoot(projectPath));
yield* $(runScript('clean', []));
});
function readProjectConfig(userProjectPath) {
const userProject = loadUserProject(userProjectPath);
return new Promise((resolve) => {
userProject.Booster.configureCurrentEnv((config) => {
checkEnvironmentWasConfigured(userProject);
resolve(config);
});
});
}
function loadUserProject(userProjectPath) {
const projectIndexJSPath = path.resolve(path.join(userProjectPath, 'dist', 'index.js'));
return require(projectIndexJSPath);
}
function checkEnvironmentWasConfigured(userProject) {
if (userProject.Booster.configuredEnvironments.size == 0) {
throw new Error("You haven't configured any environment. Please make sure you have at least one environment configured by calling 'Booster.configure' method (normally done inside the folder 'src/config')");
}
const currentEnv = (0, environment_1.currentEnvironment)();
if (!currentEnv) {
throw new Error("You haven't provided any environment. Please make sure you are using option '-e' with a valid environment name");
}
if (!userProject.Booster.configuredEnvironments.has(currentEnv)) {
throw new Error(`The environment '${currentEnv}' does not match any of the environments you used to configure your Booster project, which are: '${Array.from(userProject.Booster.configuredEnvironments).join(', ')}'`);
}
}