diff --git a/app/main.js b/app/main.js index 88b8ec13..836c736e 100644 --- a/app/main.js +++ b/app/main.js @@ -27,7 +27,9 @@ if (!process.env.TERMINUS_PLUGINS) { process.env.TERMINUS_PLUGINS = '' } -process.env.TERMINUS_PLUGINS += `:${path.resolve(__dirname, '..')}` +if (process.env.DEV) { + process.env.TERMINUS_PLUGINS += `:${path.resolve(__dirname, '..')}` +} setupWindowManagement = () => { let windowCloseable diff --git a/app/src/entry.ts b/app/src/entry.ts index a6be61de..b633d484 100644 --- a/app/src/entry.ts +++ b/app/src/entry.ts @@ -12,7 +12,7 @@ import { enableProdMode } from '@angular/core' import { platformBrowserDynamic } from '@angular/platform-browser-dynamic' import { getRootModule } from './app.module' -import { loadPlugins } from './plugins' +import { findPlugins, loadPlugins } from './plugins' if ((global).require('electron-is-dev')) { console.warn('Running in debug mode') @@ -20,9 +20,10 @@ if ((global).require('electron-is-dev')) { enableProdMode() } -loadPlugins((current, total) => { - (document.querySelector('.progress .bar')).style.width = 100 * current / total + '%' -}).then(async plugins => { - let module = await getRootModule(plugins) +findPlugins().then(async plugins => { + let pluginsModules = loadPlugins(plugins, (current, total) => { + (document.querySelector('.progress .bar')).style.width = 100 * current / total + '%' + }) + let module = await getRootModule(pluginsModules) platformBrowserDynamic().bootstrapModule(module) }) diff --git a/app/src/plugins.ts b/app/src/plugins.ts index 3e2721eb..c0ff98ff 100644 --- a/app/src/plugins.ts +++ b/app/src/plugins.ts @@ -19,27 +19,46 @@ if (process.env.TERMINUS_PLUGINS) { export declare type ProgressCallback = (current, total) => void -interface IFoundPlugin { +interface IPluginEntry { name: string path: string + info: any } -export async function loadPlugins (progress: ProgressCallback): Promise { +export async function findPlugins (): Promise { let paths = nodeModule.globalPaths - let plugins: any[] = [] - let foundPlugins: IFoundPlugin[] = [] + let foundPlugins: IPluginEntry[] = [] - progress(0, 1) for (let pluginDir of paths) { pluginDir = normalizePath(pluginDir) if (!await fs.exists(pluginDir)) { continue } let pluginNames = await fs.readdir(pluginDir) - pluginNames.filter(pluginName => /^terminus-/.exec(pluginName)).forEach(name => { - foundPlugins.push({ name, path: path.join(pluginDir, name) }) - }) + for (let pluginName of pluginNames.filter(x => /^terminus-/.exec(x))) { + let pluginPath = path.join(pluginDir, pluginName) + let infoPath = path.join(pluginPath, 'package.json') + if (!await fs.exists(infoPath)) { + continue + } + try { + foundPlugins.push({ + name: pluginName, + path: pluginPath, + info: await fs.readJson(infoPath), + }) + } catch (error) { + console.error('Cannot load package info for', pluginName) + } + } } + + return foundPlugins +} + +export function loadPlugins (foundPlugins: IPluginEntry[], progress: ProgressCallback): any[] { + let plugins: any[] = [] + progress(0, 1) foundPlugins.forEach((foundPlugin, index) => { console.info(`Loading ${foundPlugin.name}: ${(global).require.resolve(foundPlugin.path)}`) progress(index, foundPlugins.length) @@ -50,7 +69,6 @@ export async function loadPlugins (progress: ProgressCallback): Promise { console.error(`Could not load ${foundPlugin.name}:`, error) } }) - progress(1, 1) return plugins } diff --git a/terminus-settings/webpack.config.js b/terminus-settings/webpack.config.js index 9ffcf7ee..f5685e68 100644 --- a/terminus-settings/webpack.config.js +++ b/terminus-settings/webpack.config.js @@ -40,7 +40,6 @@ module.exports = { 'fs-promise', 'path', 'node-pty', - 'child-process-promise', 'fs-promise', /^rxjs/, /^@angular/, diff --git a/terminus-terminal/package.json b/terminus-terminal/package.json index 9bdda5ea..ddad79a3 100644 --- a/terminus-terminal/package.json +++ b/terminus-terminal/package.json @@ -12,6 +12,7 @@ "license": "MIT", "devDependencies": { "@types/deep-equal": "^1.0.0", + "@types/mz": "0.0.31", "@types/node": "7.0.12", "@types/webpack-env": "1.13.0", "@types/winreg": "^1.2.30", @@ -38,10 +39,10 @@ "rxjs": "5.3.0" }, "dependencies": { - "child-process-promise": "2.2.1", "font-manager": "0.2.2", "fs-promise": "2.0.2", "hterm-commonjs": "1.0.0", + "mz": "^2.6.0", "node-pty": "0.6.2", "winreg": "^1.2.3" } diff --git a/terminus-terminal/src/components/terminalSettingsTab.component.ts b/terminus-terminal/src/components/terminalSettingsTab.component.ts index 505eb248..40af0bf7 100644 --- a/terminus-terminal/src/components/terminalSettingsTab.component.ts +++ b/terminus-terminal/src/components/terminalSettingsTab.component.ts @@ -1,9 +1,9 @@ import { Observable } from 'rxjs' import * as fs from 'fs-promise' import * as path from 'path' +import { exec } from 'mz/child_process' const equal = require('deep-equal') const fontManager = require('font-manager') -const { exec } = require('child-process-promise') import { Component, Inject } from '@angular/core' import { ConfigService, HostAppService, Platform } from 'terminus-core' @@ -44,8 +44,8 @@ export class TerminalSettingsTabComponent { this.fonts.sort() } if (this.hostApp.platform == Platform.Linux) { - exec('fc-list :spacing=mono').then((result) => { - this.fonts = result.stdout + exec('fc-list :spacing=mono').then(([stdout, _]) => { + this.fonts = stdout .split('\n') .filter(x => !!x) .map(x => x.split(':')[1].trim()) diff --git a/terminus-terminal/src/persistenceProviders.ts b/terminus-terminal/src/persistenceProviders.ts index ce753aeb..d7ddef50 100644 --- a/terminus-terminal/src/persistenceProviders.ts +++ b/terminus-terminal/src/persistenceProviders.ts @@ -1,5 +1,5 @@ import * as fs from 'fs-promise' -const { exec, spawn } = require('child-process-promise') +import { exec, spawn } from 'mz/child_process' import { Injectable } from '@angular/core' import { Logger, LogService } from 'terminus-core' @@ -13,7 +13,7 @@ interface IChildProcess { } async function listProcesses (): Promise { - return (await exec(`ps -A -o pid,ppid,command`)).stdout + return (await exec(`ps -A -o pid,ppid,command`))[0].toString() .split('\n') .slice(1) .map(line => line.split(' ').filter(x => x).slice(0, 3)) @@ -38,7 +38,7 @@ export class ScreenPersistenceProvider extends SessionPersistenceProvider { async attachSession (recoveryId: any): Promise { let lines: string[] try { - lines = (await exec('screen -list')).stdout.split('\n') + lines = (await exec('screen -list'))[0].toString().split('\n') } catch (result) { lines = result.stdout.split('\n') } diff --git a/terminus-terminal/src/services/sessions.service.ts b/terminus-terminal/src/services/sessions.service.ts index ba834a77..3aadd5fa 100644 --- a/terminus-terminal/src/services/sessions.service.ts +++ b/terminus-terminal/src/services/sessions.service.ts @@ -3,7 +3,7 @@ import * as fs from 'fs-promise' import { Subject } from 'rxjs' import { Injectable } from '@angular/core' import { Logger, LogService } from 'terminus-core' -const { exec } = require('child-process-promise') +import { exec } from 'mz/child_process' import { SessionOptions, SessionPersistenceProvider } from '../api' @@ -85,7 +85,7 @@ export class Session { this.kill() } else { await new Promise((resolve) => { - this.kill('SIGTERM') + this.kill('SIGTERM') setImmediate(() => { if (!this.open) { resolve() @@ -114,7 +114,7 @@ export class Session { async getWorkingDirectory (): Promise { if (process.platform == 'darwin') { - let lines = (await exec(`lsof -p ${this.truePID} -Fn`)).stdout.split('\n') + let lines = (await exec(`lsof -p ${this.truePID} -Fn`))[0].toString().split('\n') return lines[2].substring(1) } if (process.platform == 'linux') { diff --git a/terminus-terminal/webpack.config.js b/terminus-terminal/webpack.config.js index 1a5b65dd..96d52e5d 100644 --- a/terminus-terminal/webpack.config.js +++ b/terminus-terminal/webpack.config.js @@ -40,7 +40,7 @@ module.exports = { 'font-manager', 'path', 'node-pty', - 'child-process-promise', + 'mz/child_process', 'winreg', /^rxjs/, /^@angular/,