@boostercloud/cli
Version:
CLI of the Booster Framework, the next level of abstraction for cloud-native applications
70 lines (69 loc) • 3.95 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.makePackageManager = exports.makeScopedRun = void 0;
const effect_1 = require("@boostercloud/framework-types/dist/effect");
const _1 = require(".");
const process_1 = require("../process");
const file_system_1 = require("../file-system");
/**
* Gets the project root directory from the reference.
* If the reference is an empty string, it will set it
* to the current working directory and return it.
*/
const ensureProjectDir = (processService, projectDirRef) => (0, effect_1.gen)(function* ($) {
const { cwd } = processService;
const pwd = yield* $(cwd());
const projectDir = yield* $(effect_1.Ref.updateAndGet_(projectDirRef, (dir) => dir || pwd));
return projectDir;
});
/**
* Checks if a script exists in the package.json file
*/
const checkScriptExists = (processService, fileSystemService, scriptName) => (0, effect_1.gen)(function* ($) {
const { cwd } = processService;
const { readFileContents } = fileSystemService;
const pwd = yield* $(cwd());
const packageJson = yield* $(readFileContents(`${pwd}/package.json`));
const packageJsonContents = JSON.parse(packageJson);
return packageJsonContents.scripts && packageJsonContents.scripts[scriptName];
});
/**
* Function that returns a function to run the build script in the project directory.
*/
const makeRunBuildScript = (command, projectDirRef) => (0, effect_1.gen)(function* ($) {
const run = yield* $((0, exports.makeScopedRun)(command, projectDirRef));
const processService = yield* $(process_1.ProcessService);
const fileSystemService = yield* $(file_system_1.FileSystemService);
return (args) => (0, effect_1.gen)(function* ($) {
const scriptExists = yield* $(checkScriptExists(processService, fileSystemService, 'compile'));
const scriptName = scriptExists ? 'compile' : 'build';
return yield* $(run('run', scriptName, args));
});
});
/**
* Returns a function that executes a package manager command in the project directory.
*/
const makeScopedRun = (packageManagerCommand, projectDirRef) => (0, effect_1.gen)(function* ($) {
const processService = yield* $(process_1.ProcessService);
return (scriptName, subscriptName, args) => (0, effect_1.gen)(function* ($) {
const projectDir = yield* $(ensureProjectDir(processService, projectDirRef));
return yield* $(processService.exec(`${packageManagerCommand} ${scriptName} ${subscriptName ? subscriptName + ' ' : ''}${args.join(' ')}`.trim(), projectDir));
});
});
exports.makeScopedRun = makeScopedRun;
const makePackageManager = (packageManagerCommand) => (0, effect_1.gen)(function* ($) {
// Create a reference to store the current project directory
const projectDirRef = yield* $(effect_1.Ref.makeRef(''));
// Create a function to run a script in the project directory
const run = yield* $((0, exports.makeScopedRun)(packageManagerCommand, projectDirRef));
const runBuild = yield* $(makeRunBuildScript(packageManagerCommand, projectDirRef));
const service = {
setProjectRoot: (projectDir) => effect_1.Ref.set_(projectDirRef, projectDir),
runScript: (scriptName, args) => (0, effect_1.pipe)(run('run', scriptName, args), (0, effect_1.mapError)((error) => new _1.RunScriptError(error.error))),
build: (args) => (0, effect_1.pipe)(runBuild(args), (0, effect_1.mapError)((error) => new _1.RunScriptError(error.error))),
installProductionDependencies: () => (0, effect_1.pipe)(run('install', null, ['--omit=dev', '--omit=optional', '--no-bin-links']), (0, effect_1.mapError)((error) => new _1.InstallDependenciesError(error.error))),
installAllDependencies: () => (0, effect_1.pipe)(run('install', null, []), (0, effect_1.mapError)((error) => new _1.InstallDependenciesError(error.error))),
};
return service;
});
exports.makePackageManager = makePackageManager;