diff --git a/terminus-plugin-manager/package.json b/terminus-plugin-manager/package.json index 12cdeba1..7c392899 100644 --- a/terminus-plugin-manager/package.json +++ b/terminus-plugin-manager/package.json @@ -36,7 +36,8 @@ "rxjs": "5.3.0" }, "dependencies": { - "axios": "^0.16.2" + "axios": "^0.16.2", + "mz": "^2.6.0" }, "false": {} } diff --git a/terminus-plugin-manager/src/services/pluginManager.service.ts b/terminus-plugin-manager/src/services/pluginManager.service.ts index f1645f6c..2e4ab379 100644 --- a/terminus-plugin-manager/src/services/pluginManager.service.ts +++ b/terminus-plugin-manager/src/services/pluginManager.service.ts @@ -1,8 +1,10 @@ -import { Observable } from 'rxjs' -import { Injectable } from '@angular/core' -import { Logger, LogService, ConfigService } from 'terminus-core' +import * as path from 'path' +import * as fs from 'mz/fs' import { exec } from 'mz/child_process' import axios from 'axios' +import { Observable } from 'rxjs' +import { Injectable } from '@angular/core' +import { Logger, LogService, ConfigService, HostAppService, Platform } from 'terminus-core' const NAME_PREFIX = 'terminus-' const KEYWORD = 'terminus-plugin' @@ -23,17 +25,35 @@ export class PluginManagerService { builtinPluginsPath: string = (window as any).builtinPluginsPath userPluginsPath: string = (window as any).userPluginsPath installedPlugins: IPluginInfo[] = (window as any).installedPlugins + npmPath: string constructor ( log: LogService, private config: ConfigService, + private hostApp: HostAppService, ) { this.logger = log.create('pluginManager') + this.detectPath() + } + + async detectPath () { + this.npmPath = this.config.store.npm + if (this.hostApp.platform !== Platform.Windows) { + let searchPaths = (await exec('bash -c -l "echo $PATH"'))[0].toString().trim().split(':') + for (let searchPath of searchPaths) { + if (await fs.exists(path.join(searchPath, 'npm'))) { + this.logger.debug('Found npm in', searchPath) + this.npmPath = path.join(searchPath, 'npm') + return + } + } + } } async isNPMInstalled (): Promise { + await this.detectPath() try { - await exec(`${this.config.store.npm} -v`) + await exec(`${this.npmPath} -v`) return true } catch (_) { return false @@ -56,14 +76,14 @@ export class PluginManagerService { } async installPlugin (plugin: IPluginInfo) { - let result = await exec(`${this.config.store.npm} --prefix "${this.userPluginsPath}" install ${plugin.packageName}@${plugin.version}`) + let result = await exec(`${this.npmPath} --prefix "${this.userPluginsPath}" install ${plugin.packageName}@${plugin.version}`) console.log(result) this.installedPlugins = this.installedPlugins.filter(x => x.packageName !== plugin.packageName) this.installedPlugins.push(plugin) } async uninstallPlugin (plugin: IPluginInfo) { - await exec(`${this.config.store.npm} --prefix "${this.userPluginsPath}" remove ${plugin.packageName}`) + await exec(`${this.npmPath} --prefix "${this.userPluginsPath}" remove ${plugin.packageName}`) this.installedPlugins = this.installedPlugins.filter(x => x.packageName !== plugin.packageName) } } diff --git a/terminus-plugin-manager/webpack.config.js b/terminus-plugin-manager/webpack.config.js index ddb6c731..086543fb 100644 --- a/terminus-plugin-manager/webpack.config.js +++ b/terminus-plugin-manager/webpack.config.js @@ -37,10 +37,10 @@ module.exports = { }, externals: [ 'fs', - 'fs-promise', 'font-manager', 'path', 'node-pty', + 'mz/fs', 'mz/child_process', 'winreg', /^rxjs/,