UNPKG

@boostercloud/cli

Version:

CLI of the Booster Framework, the next level of abstraction for cloud-native applications

70 lines (69 loc) 3.95 kB
"use strict"; 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;