firmament
Version:
Modularized shell for NodeJS CLI applications
53 lines (49 loc) • 1.75 kB
text/typescript
import {injectable, inject} from 'inversify';
import {ModuleManagement} from '../interfaces/ModuleManagement';
import {CommandUtil, Spawn} from 'firmament-yargs';
import path = require('path');
import fs = require('fs');
import * as _ from 'lodash';
()
export class ModuleManagementImpl implements ModuleManagement {
constructor(('CommandUtil') private commandUtil: CommandUtil,
('Spawn') private spawn: Spawn) {
}
get modulePrefix(): string {
return 'firmament-';
}
installModule(argv: any) {
const me = this;
if(!argv.name) {
me.commandUtil.processExit(1, `\nPlease provide a module name using the '--name <module_name>' switch\n`);
}
if(!_.startsWith(argv.name, me.modulePrefix)) {
argv.name = `${me.modulePrefix}${argv.name}`;
//me.commandUtil.processExit(1, `\nModule names must start with '${me.modulePrefix}'\n`);
}
const prefix = path.resolve(__dirname, '../..');
const cmd = ['npm', 'install', '--save', '--prefix', `${prefix}`, argv.name];
me.spawn.spawnShellCommandAsync(cmd, null,
() => {
},
(err: Error) => {
if(err) {
//Assume the error was permission related and retry under 'sudo'
me.spawn.sudoSpawnAsync(cmd, null,
() => {
},
(err: Error) => {
if(err) {
me.commandUtil.processExitWithError(err);
} else {
me.commandUtil.processExit(0, `Looks like module '${argv.name}' installed successfully!`);
}
}
);
} else {
me.commandUtil.processExit(0, `Looks like module '${argv.name}' installed successfully!`);
}
}
);
}
}