From 6cc20c3719c7a84c3ea4baf5d674db788383a8b3 Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Sun, 26 Aug 2018 17:35:04 +0200 Subject: [PATCH] allow starting commands in new tabs via CLI (fixes #304) --- .eslintrc.yml | 55 ++ app/lib/cli.js | 23 + app/lib/index.js | 304 +++++++++++ app/lib/lru.js | 15 + app/lru.js | 15 - app/main.js | 317 ------------ app/package.json | 4 +- app/src/entry.preload.ts | 2 +- app/tsconfig.json | 2 +- app/webpack.main.config.js | 49 ++ app/yarn.lock | 32 +- package.json | 12 + terminus-core/src/api/defaultTabProvider.ts | 3 - terminus-core/src/api/index.ts | 1 - .../src/components/appRoot.component.ts | 4 - terminus-core/src/services/app.service.ts | 11 +- terminus-core/src/services/hostApp.service.ts | 26 +- terminus-terminal/src/api.ts | 3 +- terminus-terminal/src/buttonProvider.ts | 33 +- .../src/services/sessions.service.ts | 21 +- .../src/services/terminal.service.ts | 3 +- webpack.config.js | 1 + yarn.lock | 481 +++++++++++++++++- 23 files changed, 1006 insertions(+), 411 deletions(-) create mode 100644 .eslintrc.yml create mode 100644 app/lib/cli.js create mode 100644 app/lib/index.js create mode 100644 app/lib/lru.js delete mode 100644 app/lru.js delete mode 100644 app/main.js create mode 100644 app/webpack.main.config.js delete mode 100644 terminus-core/src/api/defaultTabProvider.ts diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 00000000..50a6ed0e --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,55 @@ +parser: babel-eslint +extends: standard +env: + node: true + commonjs: true +rules: + no-duplicate-imports: error + import/no-duplicates: 0 + array-bracket-spacing: + - error + - never + block-scoped-var: error + brace-style: + - error + - 1tbs + computed-property-spacing: + - error + - never + comma-dangle: + - error + - always-multiline + curly: error + eol-last: error + eqeqeq: + - error + - smart + max-depth: + - 1 + - 5 + max-statements: + - 1 + - 80 + no-multiple-empty-lines: error + no-mixed-spaces-and-tabs: error + no-trailing-spaces: error + no-unused-vars: + - error + - vars: all + args: after-used + argsIgnorePattern: ^_ + no-undef: error + no-use-before-define: + - error + - nofunc + no-var: error + object-curly-spacing: + - error + - always + quote-props: + - warn + - as-needed + - keywords: true + numbers: true + strict: + - error diff --git a/app/lib/cli.js b/app/lib/cli.js new file mode 100644 index 00000000..53d5d541 --- /dev/null +++ b/app/lib/cli.js @@ -0,0 +1,23 @@ +import { app } from 'electron' + +export function parseArgs (argv, cwd) { + if (argv[0].includes('node')) { + argv = argv.slice(1) + } + + return require('yargs') + .usage('terminus [command] [arguments]') + .command('open [directory]', 'open a shell in a directory', { + directory: { type: 'string', 'default': cwd }, + }) + .command('run [command...]', 'run a command in the terminal', { + command: { type: 'string' }, + }) + .version('v', 'Show version and exit', app.getVersion()) + .alias('d', 'debug') + .describe('d', 'Show DevTools on start') + .alias('h', 'help') + .help('h') + .strict() + .parse(argv.slice(1)) +} diff --git a/app/lib/index.js b/app/lib/index.js new file mode 100644 index 00000000..cd072c1a --- /dev/null +++ b/app/lib/index.js @@ -0,0 +1,304 @@ +import { app, ipcMain, BrowserWindow, Menu, Tray, shell } from 'electron' +import * as path from 'path' +import electronDebug from 'electron-debug' +import * as fs from 'fs' +import * as yaml from 'js-yaml' +import './lru' +import { parseArgs } from './cli' +import ElectronConfig from 'electron-config' +if (process.platform === 'win32' && require('electron-squirrel-startup')) process.exit(0) + +let electronVibrancy +if (process.platform !== 'linux') { + electronVibrancy = require('electron-vibrancy') +} + +let windowConfig = new ElectronConfig({ name: 'window' }) + +if (!process.env.TERMINUS_PLUGINS) { + process.env.TERMINUS_PLUGINS = '' +} + +const setWindowVibrancy = (enabled) => { + if (enabled && !app.window.vibrancyViewID) { + app.window.vibrancyViewID = electronVibrancy.SetVibrancy(app.window, 0) + } else if (!enabled && app.window.vibrancyViewID) { + electronVibrancy.RemoveView(app.window, app.window.vibrancyViewID) + app.window.vibrancyViewID = null + } +} + +const setupTray = () => { + if (process.platform === 'darwin') { + app.tray = new Tray(`${app.getAppPath()}/assets/tray-darwinTemplate.png`) + app.tray.setPressedImage(`${app.getAppPath()}/assets/tray-darwinHighlightTemplate.png`) + } else { + app.tray = new Tray(`${app.getAppPath()}/assets/tray.png`) + } + + app.tray.on('click', () => { + app.window.show() + app.window.focus() + }) + + const contextMenu = Menu.buildFromTemplate([{ + label: 'Show', + click () { + app.window.show() + app.window.focus() + }, + }]) + + if (process.platform !== 'darwin') { + app.tray.setContextMenu(contextMenu) + } + + app.tray.setToolTip(`Terminus ${app.getVersion()}`) +} + +const setupWindowManagement = () => { + app.window.on('show', () => { + app.window.webContents.send('host:window-shown') + if (app.tray) { + app.tray.destroy() + app.tray = null + } + }) + + app.window.on('hide', () => { + if (!app.tray) { + setupTray() + } + }) + + app.window.on('enter-full-screen', () => app.window.webContents.send('host:window-enter-full-screen')) + app.window.on('leave-full-screen', () => app.window.webContents.send('host:window-leave-full-screen')) + + app.window.on('close', () => { + windowConfig.set('windowBoundaries', app.window.getBounds()) + }) + + app.window.on('closed', () => { + app.window = null + }) + + ipcMain.on('window-focus', () => { + app.window.focus() + }) + + ipcMain.on('window-maximize', () => { + app.window.maximize() + }) + + ipcMain.on('window-unmaximize', () => { + app.window.unmaximize() + }) + + ipcMain.on('window-toggle-maximize', () => { + if (app.window.isMaximized()) { + app.window.unmaximize() + } else { + app.window.maximize() + } + }) + + ipcMain.on('window-minimize', () => { + app.window.minimize() + }) + + ipcMain.on('window-set-bounds', (event, bounds) => { + app.window.setBounds(bounds) + }) + + ipcMain.on('window-set-always-on-top', (event, flag) => { + app.window.setAlwaysOnTop(flag) + }) + + ipcMain.on('window-set-vibrancy', (event, enabled) => { + setWindowVibrancy(enabled) + }) +} + +const setupMenu = () => { + let template = [{ + label: 'Application', + submenu: [ + { role: 'about', label: 'About Terminus' }, + { type: 'separator' }, + { + label: 'Preferences', + accelerator: 'Cmd+,', + click () { + app.window.webContents.send('host:preferences-menu') + }, + }, + { type: 'separator' }, + { role: 'services', submenu: [] }, + { type: 'separator' }, + { role: 'hide' }, + { role: 'hideothers' }, + { role: 'unhide' }, + { type: 'separator' }, + { + label: 'Quit', + accelerator: 'Cmd+Q', + click () { + app.quit() + }, + }, + ], + }, + { + label: 'Edit', + submenu: [ + { role: 'undo' }, + { role: 'redo' }, + { type: 'separator' }, + { role: 'cut' }, + { role: 'copy' }, + { role: 'paste' }, + { role: 'pasteandmatchstyle' }, + { role: 'delete' }, + { role: 'selectall' }, + ], + }, + { + label: 'View', + submenu: [ + { role: 'reload' }, + { role: 'forcereload' }, + { role: 'toggledevtools' }, + { type: 'separator' }, + { role: 'resetzoom' }, + { role: 'zoomin' }, + { role: 'zoomout' }, + { type: 'separator' }, + { role: 'togglefullscreen' }, + ], + }, + { + role: 'window', + submenu: [ + { role: 'minimize' }, + { role: 'zoom' }, + { type: 'separator' }, + { role: 'front' }, + ], + }, + { + role: 'help', + submenu: [ + { + label: 'Website', + click () { + shell.openExternal('https://eugeny.github.io/terminus') + }, + }, + ], + }] + + Menu.setApplicationMenu(Menu.buildFromTemplate(template)) +} + +const start = () => { + let t0 = Date.now() + + let configPath = path.join(app.getPath('userData'), 'config.yaml') + let configData + if (fs.existsSync(configPath)) { + configData = yaml.safeLoad(fs.readFileSync(configPath, 'utf8')) + } else { + configData = {} + } + + let options = { + width: 800, + height: 600, + title: 'Terminus', + minWidth: 400, + minHeight: 300, + webPreferences: { webSecurity: false }, + frame: false, + show: false, + } + Object.assign(options, windowConfig.get('windowBoundaries')) + + if ((configData.appearance || {}).frame === 'native') { + options.frame = true + } else { + if (process.platform === 'darwin') { + options.titleBarStyle = 'hiddenInset' + } + } + + if (process.platform === 'win32' && (configData.appearance || {}).vibrancy) { + options.transparent = true + } + + if (process.platform === 'linux') { + options.backgroundColor = '#131d27' + } + + app.commandLine.appendSwitch('disable-http-cache') + + app.window = new BrowserWindow(options) + app.window.once('ready-to-show', () => { + if (process.platform === 'darwin') { + app.window.setVibrancy('dark') + } else if (process.platform === 'win32' && (configData.appearance || {}).vibrancy) { + setWindowVibrancy(true) + } + app.window.show() + app.window.focus() + }) + app.window.loadURL(`file://${app.getAppPath()}/dist/index.html`, { extraHeaders: 'pragma: no-cache\n' }) + + if (process.platform !== 'darwin') { + app.window.setMenu(null) + } + + setupWindowManagement() + + if (process.platform === 'darwin') { + setupMenu() + } else { + app.window.setMenu(null) + } + + console.info(`Host startup: ${Date.now() - t0}ms`) + t0 = Date.now() + ipcMain.on('app:ready', () => { + console.info(`App startup: ${Date.now() - t0}ms`) + }) +} + +app.on('activate', () => { + if (!app.window) { + start() + } else { + app.window.show() + app.window.focus() + } +}) + +process.on('uncaughtException', function (err) { + console.log(err) + app.window.webContents.send('uncaughtException', err) +}) + +app.on('second-instance', (event, argv, cwd) => { + app.window.webContents.send('host:second-instance', parseArgs(argv, cwd)) +}) + +const argv = parseArgs(process.argv, process.cwd()) + +if (!app.requestSingleInstanceLock()) { + app.quit() + process.exit(0) +} + +if (argv.d) { + electronDebug({ enabled: true, showDevTools: 'undocked' }) +} + +app.on('ready', start) diff --git a/app/lib/lru.js b/app/lib/lru.js new file mode 100644 index 00000000..e3ffefbe --- /dev/null +++ b/app/lib/lru.js @@ -0,0 +1,15 @@ +let lru = require('lru-cache')({ max: 256, maxAge: 250 }) + +let fs = require('fs') +let origLstat = fs.realpathSync.bind(fs) + +// NB: The biggest offender of thrashing realpathSync is the node module system +// itself, which we can't get into via any sane means. +require('fs').realpathSync = function (p) { + let r = lru.get(p) + if (r) return r + + r = origLstat(p) + lru.set(p, r) + return r +} diff --git a/app/lru.js b/app/lru.js deleted file mode 100644 index a6bbd4e5..00000000 --- a/app/lru.js +++ /dev/null @@ -1,15 +0,0 @@ -var lru = require('lru-cache')({max: 256, maxAge: 250/*ms*/}); - -var fs = require('fs'); -var origLstat = fs.realpathSync.bind(fs); -console.log('s') -// NB: The biggest offender of thrashing realpathSync is the node module system -// itself, which we can't get into via any sane means. -require('fs').realpathSync = function(p) { - let r = lru.get(p); - if (r) return r; - - r = origLstat(p); - lru.set(p, r); - return r; -}; diff --git a/app/main.js b/app/main.js deleted file mode 100644 index d870d714..00000000 --- a/app/main.js +++ /dev/null @@ -1,317 +0,0 @@ -require('./lru.js') -if (process.platform == 'win32' && require('electron-squirrel-startup')) process.exit(0) - -const electron = require('electron') -let electronVibrancy -if (process.platform != 'linux') { - electronVibrancy = require('electron-vibrancy') -} - -let app = electron.app - - -const yaml = require('js-yaml') -const path = require('path') -const fs = require('fs') -const Config = require('electron-config') -let windowConfig = new Config({name: 'window'}) - - -if (!process.env.TERMINUS_PLUGINS) { - process.env.TERMINUS_PLUGINS = '' -} - -setWindowVibrancy = (enabled) => { - if (enabled && !app.window.vibrancyViewID) { - app.window.vibrancyViewID = electronVibrancy.SetVibrancy(app.window, 0) - } else if (!enabled && app.window.vibrancyViewID) { - electronVibrancy.RemoveView(app.window, app.window.vibrancyViewID) - app.window.vibrancyViewID = null - } -} - -setupWindowManagement = () => { - app.window.on('show', () => { - app.window.webContents.send('host:window-shown') - if (app.tray) { - app.tray.destroy() - app.tray = null - } - }) - - app.window.on('hide', (e) => { - if (!app.tray) { - setupTray() - } - }) - - app.window.on('enter-full-screen', () => app.window.webContents.send('host:window-enter-full-screen')) - app.window.on('leave-full-screen', () => app.window.webContents.send('host:window-leave-full-screen')) - - app.window.on('close', (e) => { - windowConfig.set('windowBoundaries', app.window.getBounds()) - }) - - app.window.on('closed', () => { - app.window = null - }) - - electron.ipcMain.on('window-focus', () => { - app.window.focus() - }) - - electron.ipcMain.on('window-maximize', () => { - app.window.maximize() - }) - - electron.ipcMain.on('window-unmaximize', () => { - app.window.unmaximize() - }) - - electron.ipcMain.on('window-toggle-maximize', () => { - if (app.window.isMaximized()) { - app.window.unmaximize() - } else { - app.window.maximize() - } - }) - - electron.ipcMain.on('window-minimize', () => { - app.window.minimize() - }) - - electron.ipcMain.on('window-set-bounds', (event, bounds) => { - app.window.setBounds(bounds) - }) - - electron.ipcMain.on('window-set-always-on-top', (event, flag) => { - app.window.setAlwaysOnTop(flag) - }) - - electron.ipcMain.on('window-set-vibrancy', (event, enabled) => { - setWindowVibrancy(enabled) - }) -} - - -setupTray = () => { - if (process.platform == 'darwin') { - app.tray = new electron.Tray(`${app.getAppPath()}/assets/tray-darwinTemplate.png`) - app.tray.setPressedImage(`${app.getAppPath()}/assets/tray-darwinHighlightTemplate.png`) - } else { - app.tray = new electron.Tray(`${app.getAppPath()}/assets/tray.png`) - } - - app.tray.on('click', () => { - app.window.show() - app.window.focus() - }) - - const contextMenu = electron.Menu.buildFromTemplate([{ - label: 'Show', - click () { - app.window.show() - app.window.focus() - } - }]) - - if (process.platform != 'darwin') { - app.tray.setContextMenu(contextMenu) - } - - app.tray.setToolTip(`Terminus ${app.getVersion()}`) -} - - -setupMenu = () => { - let template = [{ - label: "Application", - submenu: [ - { role: 'about', label: 'About Terminus' }, - { type: 'separator' }, - { - label: 'Preferences', - accelerator: 'Cmd+,', - click () { - app.window.webContents.send('host:preferences-menu') - } - }, - { type: 'separator' }, - { role: 'services', submenu: [] }, - { type: 'separator' }, - { role: 'hide' }, - { role: 'hideothers' }, - { role: 'unhide' }, - { type: 'separator' }, - { - label: 'Quit', - accelerator: 'Cmd+Q', - click () { - app.quit() - } - } - ] - }, - { - label: "Edit", - submenu: [ - {role: 'undo'}, - {role: 'redo'}, - {type: 'separator'}, - {role: 'cut'}, - {role: 'copy'}, - {role: 'paste'}, - {role: 'pasteandmatchstyle'}, - {role: 'delete'}, - {role: 'selectall'} - ] - }, - { - label: 'View', - submenu: [ - {role: 'reload'}, - {role: 'forcereload'}, - {role: 'toggledevtools'}, - {type: 'separator'}, - {role: 'resetzoom'}, - {role: 'zoomin'}, - {role: 'zoomout'}, - {type: 'separator'}, - {role: 'togglefullscreen'} - ] - }, - { - role: 'window', - submenu: [ - {role: 'minimize'}, - {role: 'zoom'}, - {type: 'separator'}, - {role: 'front'} - ] - }, - { - role: 'help', - submenu: [ - { - label: 'Website', - click () { electron.shell.openExternal('https://eugeny.github.io/terminus') } - } - ] - }] - - electron.Menu.setApplicationMenu(electron.Menu.buildFromTemplate(template)) -} - - -start = () => { - let t0 = Date.now() - - let configPath = path.join(electron.app.getPath('userData'), 'config.yaml') - let configData - if (fs.existsSync(configPath)) { - configData = yaml.safeLoad(fs.readFileSync(configPath, 'utf8')) - } else { - configData = {} - } - - let options = { - width: 800, - height: 600, - title: 'Terminus', - minWidth: 400, - minHeight: 300, - webPreferences: {webSecurity: false}, - frame: false, - show: false, - } - Object.assign(options, windowConfig.get('windowBoundaries')) - - if ((configData.appearance || {}).frame == 'native') { - options.frame = true - } else { - if (process.platform == 'darwin') { - options.titleBarStyle = 'hiddenInset' - } - } - - if (process.platform == 'win32' && (configData.appearance || {}).vibrancy) { - options.transparent = true - } - - if (process.platform == 'linux') { - options.backgroundColor = '#131d27' - } - - app.commandLine.appendSwitch('disable-http-cache') - - app.window = new electron.BrowserWindow(options) - app.window.once('ready-to-show', () => { - if (process.platform == 'darwin') { - app.window.setVibrancy('dark') - } else if (process.platform == 'win32' && (configData.appearance || {}).vibrancy) { - setWindowVibrancy(true) - } - app.window.show() - app.window.focus() - }) - app.window.loadURL(`file://${app.getAppPath()}/dist/index.html`, {extraHeaders: "pragma: no-cache\n"}) - - if (process.platform != 'darwin') { - app.window.setMenu(null) - } - - setupWindowManagement() - - if (process.platform == 'darwin') { - setupMenu() - } else { - app.window.setMenu(null) - } - - console.info(`Host startup: ${Date.now() - t0}ms`) - t0 = Date.now() - electron.ipcMain.on('app:ready', () => { - console.info(`App startup: ${Date.now() - t0}ms`) - }) -} - -app.on('activate', () => { - if (!app.window) - start() - else { - app.window.show() - app.window.focus() - } -}) - -process.on('uncaughtException', function(err) { - console.log(err) - app.window.webContents.send('uncaughtException', err) -}) - - - -const argv = require('yargs') - .usage('terminus [command] [arguments]') - .version('v', 'Show version and exit', app.getVersion()) - .alias('d', 'debug') - .describe('d', 'Show DevTools on start') - .alias('h', 'help') - .help('h') - .strict() - .argv - -app.on('second-instance', (argv, cwd) => { - app.window.webContents.send('host:second-instance', argv, cwd) -}) - -if (!app.requestSingleInstanceLock()) { - app.quit() - process.exit(0) -} - -if (argv.d) { - require('electron-debug')({enabled: true, showDevTools: 'undocked'}) -} - -app.on('ready', start) diff --git a/app/package.json b/app/package.json index 96d3a421..e3573fe1 100644 --- a/app/package.json +++ b/app/package.json @@ -5,7 +5,7 @@ "name": "Eugene Pankov", "email": "e@ajenti.org" }, - "main": "main.js", + "main": "dist/main.js", "version": "1.0.0-alpha.1", "scripts": { "build": "webpack --progress --color --display-modules", @@ -22,7 +22,7 @@ "@ng-bootstrap/ng-bootstrap": "^2.0.0", "devtron": "1.4.0", "electron-config": "0.2.1", - "electron-debug": "^1.0.1", + "electron-debug": "^2.0.0", "electron-is-dev": "0.1.2", "electron-squirrel-startup": "^1.0.0", "electron-vibrancy": "^0.1.3", diff --git a/app/src/entry.preload.ts b/app/src/entry.preload.ts index 4c847648..b415e078 100644 --- a/app/src/entry.preload.ts +++ b/app/src/entry.preload.ts @@ -1,4 +1,4 @@ -import '../lru.js' +import '../lib/lru.js' import 'source-sans-pro' import 'font-awesome/css/font-awesome.css' import 'ngx-toastr/toastr.css' diff --git a/app/tsconfig.json b/app/tsconfig.json index b3e4adf8..2b1acbeb 100644 --- a/app/tsconfig.json +++ b/app/tsconfig.json @@ -17,7 +17,7 @@ "lib": [ "dom", "es2015", - "es2015.iterable.ts", + "es2015.iterable", "es2017", "es7" ] diff --git a/app/webpack.main.config.js b/app/webpack.main.config.js new file mode 100644 index 00000000..dcc33770 --- /dev/null +++ b/app/webpack.main.config.js @@ -0,0 +1,49 @@ +const path = require('path') +const webpack = require('webpack') + +module.exports = { + name: 'terminus-main', + target: 'node', + entry: { + main: path.resolve(__dirname, 'lib/index.js'), + }, + mode: process.env.DEV ? 'development' : 'production', + context: __dirname, + devtool: 'source-map', + output: { + path: path.join(__dirname, 'dist'), + pathinfo: true, + filename: '[name].js', + }, + resolve: { + modules: ['lib/', 'node_modules', '../node_modules'].map(x => path.join(__dirname, x)), + extensions: ['.ts', '.js'], + }, + module: { + rules: [ + { + test: /lib[\\/].*\.js$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader', + options: { + presets: ['babel-preset-es2015'], + }, + }, + }, + ], + }, + externals: { + electron: 'commonjs electron', + 'electron-config': 'commonjs electron-config', + 'electron-vibrancy': 'commonjs electron-vibrancy', + 'electron-squirrel-startup': 'commonjs electron-squirrel-startup', + fs: 'commonjs fs', + mz: 'commonjs mz', + path: 'commonjs path', + yargs: 'commonjs yargs', + }, + plugins: [ + new webpack.optimize.ModuleConcatenationPlugin(), + ], +} diff --git a/app/yarn.lock b/app/yarn.lock index 67bcc4d6..f6d952b1 100644 --- a/app/yarn.lock +++ b/app/yarn.lock @@ -149,27 +149,33 @@ electron-config@0.2.1: dependencies: conf "^0.11.1" -electron-debug@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/electron-debug/-/electron-debug-1.2.0.tgz#22e51a73e1bf095d0bb51a6c3d97a203364c4222" +electron-debug@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/electron-debug/-/electron-debug-2.0.0.tgz#3059a6557acbfb091f138d83875f57bac80cea6d" dependencies: - electron-is-dev "^0.1.0" - electron-localshortcut "^2.0.0" + electron-is-dev "^0.3.0" + electron-localshortcut "^3.0.0" electron-is-accelerator@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz#509e510c26a56b55e17f863a4b04e111846ab27b" -electron-is-dev@0.1.2, electron-is-dev@^0.1.0: +electron-is-dev@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-0.1.2.tgz#8a1043e32b3a1da1c3f553dce28ce764246167e3" -electron-localshortcut@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/electron-localshortcut/-/electron-localshortcut-2.0.2.tgz#6a1adcd6514c957328ec7912f5ccb5e1c10706db" +electron-is-dev@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-0.3.0.tgz#14e6fda5c68e9e4ecbeff9ccf037cbd7c05c5afe" + +electron-localshortcut@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/electron-localshortcut/-/electron-localshortcut-3.1.0.tgz#10c1ffd537b8d39170aaf6e1551341f7780dd2ce" dependencies: debug "^2.6.8" electron-is-accelerator "^0.1.0" + keyboardevent-from-electron-accelerator "^1.1.0" + keyboardevents-areequal "^0.2.1" electron-squirrel-startup@^1.0.0: version "1.0.0" @@ -270,6 +276,14 @@ js-yaml@3.8.2: argparse "^1.0.7" esprima "^3.1.1" +keyboardevent-from-electron-accelerator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-1.1.0.tgz#324614f6e33490c37ffc5be5876b3e85fe223c84" + +keyboardevents-areequal@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz#88191ec738ce9f7591c25e9056de928b40277194" + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" diff --git a/package.json b/package.json index b1d43b14..a10b47d8 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,17 @@ { "name": "term", "devDependencies": { + "@types/electron-config": "^0.2.1", + "@types/electron-debug": "^1.1.0", "@types/fs-promise": "1.0.1", "@types/node": "7.0.5", "@types/webpack-env": "1.13.0", "apply-loader": "0.1.0", "awesome-typescript-loader": "^5.0.0", + "babel-core": "^6.26.3", + "babel-eslint": "^8.2.6", + "babel-loader": "^7.1.5", + "babel-preset-es2015": "^6.24.1", "core-js": "2.4.1", "cross-env": "4.0.0", "css-loader": "0.28.0", @@ -14,6 +20,12 @@ "electron-builder-squirrel-windows": "17.0.1", "electron-installer-snap": "^3.0.0", "electron-rebuild": "^1.8.2", + "eslint": "^5.4.0", + "eslint-config-standard": "^11.0.0", + "eslint-plugin-import": "^2.14.0", + "eslint-plugin-node": "^7.0.1", + "eslint-plugin-promise": "^4.0.0", + "eslint-plugin-standard": "^3.1.0", "file-loader": "^1.1.11", "font-awesome": "4.7.0", "graceful-fs": "^4.1.11", diff --git a/terminus-core/src/api/defaultTabProvider.ts b/terminus-core/src/api/defaultTabProvider.ts deleted file mode 100644 index 7d584e15..00000000 --- a/terminus-core/src/api/defaultTabProvider.ts +++ /dev/null @@ -1,3 +0,0 @@ -export abstract class DefaultTabProvider { - abstract async openNewTab (): Promise -} diff --git a/terminus-core/src/api/index.ts b/terminus-core/src/api/index.ts index fb59cd26..619f1c66 100644 --- a/terminus-core/src/api/index.ts +++ b/terminus-core/src/api/index.ts @@ -3,7 +3,6 @@ export { TabRecoveryProvider, RecoveredTab } from './tabRecovery' export { ToolbarButtonProvider, IToolbarButton } from './toolbarButtonProvider' export { ConfigProvider } from './configProvider' export { HotkeyProvider, IHotkeyDescription } from './hotkeyProvider' -export { DefaultTabProvider } from './defaultTabProvider' export { Theme } from './theme' export { AppService } from '../services/app.service' diff --git a/terminus-core/src/components/appRoot.component.ts b/terminus-core/src/components/appRoot.component.ts index b7f9527e..e1c41fbb 100644 --- a/terminus-core/src/components/appRoot.component.ts +++ b/terminus-core/src/components/appRoot.component.ts @@ -184,10 +184,6 @@ export class AppRootComponent { this.ready = true this.tabRecovery.saveTabs(this.app.tabs) - if (this.app.tabs.length === 0) { - this.app.openDefaultTab() - } - this.app.emitReady() } diff --git a/terminus-core/src/services/app.service.ts b/terminus-core/src/services/app.service.ts index 8a2e896c..e08a509f 100644 --- a/terminus-core/src/services/app.service.ts +++ b/terminus-core/src/services/app.service.ts @@ -1,6 +1,5 @@ import { Observable, Subject, AsyncSubject } from 'rxjs' -import { Injectable, ComponentFactoryResolver, Injector, Optional } from '@angular/core' -import { DefaultTabProvider } from '../api/defaultTabProvider' +import { Injectable, ComponentFactoryResolver, Injector } from '@angular/core' import { BaseTabComponent } from '../components/baseTab.component' import { Logger, LogService } from './log.service' import { ConfigService } from './config.service' @@ -28,7 +27,6 @@ export class AppService { constructor ( private componentFactoryResolver: ComponentFactoryResolver, - @Optional() private defaultTabProvider: DefaultTabProvider, private config: ConfigService, private injector: Injector, log: LogService, @@ -50,14 +48,9 @@ export class AppService { return componentRef.instance } - openDefaultTab (): void { - if (this.defaultTabProvider) { - this.defaultTabProvider.openNewTab() - } - } - selectTab (tab: BaseTabComponent) { if (this.activeTab === tab) { + this.activeTab.emitFocused() return } if (this.tabs.includes(this.activeTab)) { diff --git a/terminus-core/src/services/hostApp.service.ts b/terminus-core/src/services/hostApp.service.ts index e0d8e3a0..40d5ca0e 100644 --- a/terminus-core/src/services/hostApp.service.ts +++ b/terminus-core/src/services/hostApp.service.ts @@ -1,3 +1,4 @@ +import * as path from 'path' import { Observable, Subject } from 'rxjs' import { Injectable, NgZone, EventEmitter } from '@angular/core' import { ElectronService } from '../services/electron.service' @@ -14,11 +15,6 @@ export interface Bounds { height: number } -export interface SecondInstanceArgs { - argv: string[], - cwd: string -} - @Injectable() export class HostAppService { platform: Platform @@ -27,11 +23,15 @@ export class HostAppService { shown = new EventEmitter() isFullScreen = false private preferencesMenu = new Subject() - private secondInstance = new Subject() + private secondInstance = new Subject() + private cliOpenDirectory = new Subject() + private cliRunCommand = new Subject() private logger: Logger get preferencesMenu$ (): Observable { return this.preferencesMenu } - get secondInstance$ (): Observable { return this.secondInstance } + get secondInstance$ (): Observable { return this.secondInstance } + get cliOpenDirectory$ (): Observable { return this.cliOpenDirectory } + get cliRunCommand$ (): Observable { return this.cliRunCommand } constructor ( private zone: NgZone, @@ -64,9 +64,15 @@ export class HostAppService { this.zone.run(() => this.shown.emit()) }) - electron.ipcRenderer.on('host:second-instance', ($event, argv: string[], cwd: string) => { - this.zone.run(() => this.secondInstance.next({ argv, cwd })) - }) + electron.ipcRenderer.on('host:second-instance', ($event, argv: any, cwd: string) => this.zone.run(() => { + this.logger.info('Second instance', argv) + const op = argv._[0] + if (op === 'open') { + this.cliOpenDirectory.next(path.resolve(cwd, argv.directory)) + } else if (op === 'run') { + this.cliRunCommand.next(argv.command) + } + })) this.ready.subscribe(() => { electron.ipcRenderer.send('app:ready') diff --git a/terminus-terminal/src/api.ts b/terminus-terminal/src/api.ts index 9ceca5f1..dcafb1f9 100644 --- a/terminus-terminal/src/api.ts +++ b/terminus-terminal/src/api.ts @@ -25,6 +25,7 @@ export interface SessionOptions { height?: number recoveryId?: string recoveredTruePID$?: Observable + pauseAfterExit?: boolean } export abstract class SessionPersistenceProvider { @@ -51,7 +52,7 @@ export abstract class TerminalColorSchemeProvider { export interface IShell { id: string - name: string + name?: string command: string args?: string[] env?: any diff --git a/terminus-terminal/src/buttonProvider.ts b/terminus-terminal/src/buttonProvider.ts index 23ff5758..6cbe8db8 100644 --- a/terminus-terminal/src/buttonProvider.ts +++ b/terminus-terminal/src/buttonProvider.ts @@ -1,9 +1,7 @@ import * as fs from 'mz/fs' -import * as path from 'path' -import { first } from 'rxjs/operators' import { Injectable } from '@angular/core' import { DomSanitizer } from '@angular/platform-browser' -import { HotkeysService, ToolbarButtonProvider, IToolbarButton, ConfigService, HostAppService, ElectronService } from 'terminus-core' +import { HotkeysService, ToolbarButtonProvider, IToolbarButton, HostAppService, ElectronService } from 'terminus-core' import { TerminalService } from './services/terminal.service' @@ -12,7 +10,6 @@ export class ButtonProvider extends ToolbarButtonProvider { constructor ( private terminal: TerminalService, private domSanitizer: DomSanitizer, - private config: ConfigService, hostApp: HostAppService, electron: ElectronService, hotkeys: HotkeysService, @@ -20,24 +17,30 @@ export class ButtonProvider extends ToolbarButtonProvider { super() hotkeys.matchedHotkey.subscribe(async (hotkey) => { if (hotkey === 'new-tab') { - this.openNewTab() + this.terminal.openTab() } }) - hostApp.secondInstance$.subscribe(async ({argv, cwd}) => { - if (argv.length === 2) { - let arg = path.resolve(cwd, argv[1]) - if (await fs.exists(arg)) { - this.openNewTab(arg) + hostApp.cliOpenDirectory$.subscribe(async directory => { + if (await fs.exists(directory)) { + if ((await fs.stat(directory)).isDirectory()) { + this.terminal.openTab(null, directory) } } }) + hostApp.cliRunCommand$.subscribe(async command => { + this.terminal.openTab({ + id: '', + command: command[0], + args: command.slice(1), + }, null, true) + }) if (!electron.remote.process.env.DEV) { setImmediate(async () => { let argv: string[] = electron.remote.process.argv for (let arg of argv.slice(1).concat([electron.remote.process.argv0])) { if (await fs.exists(arg)) { if ((await fs.stat(arg)).isDirectory()) { - this.openNewTab(arg) + this.terminal.openTab(null, arg) } } } @@ -45,19 +48,13 @@ export class ButtonProvider extends ToolbarButtonProvider { } } - async openNewTab (cwd?: string): Promise { - let shells = await this.terminal.shells$.pipe(first()).toPromise() - let shell = shells.find(x => x.id === this.config.store.terminal.shell) - this.terminal.openTab(shell, cwd) - } - provide (): IToolbarButton[] { return [{ icon: this.domSanitizer.bypassSecurityTrustHtml(require('./icons/plus.svg')), title: 'New terminal', touchBarNSImage: 'NSTouchBarAddDetailTemplate', click: async () => { - this.openNewTab() + this.terminal.openTab() } }] } diff --git a/terminus-terminal/src/services/sessions.service.ts b/terminus-terminal/src/services/sessions.service.ts index 67e5b0b0..aaaab3ff 100644 --- a/terminus-terminal/src/services/sessions.service.ts +++ b/terminus-terminal/src/services/sessions.service.ts @@ -65,6 +65,7 @@ export abstract class BaseSession { export class Session extends BaseSession { private pty: any + private pauseAfterExit = false start (options: SessionOptions) { this.name = options.name @@ -110,16 +111,24 @@ export class Session extends BaseSession { }) this.pty.on('exit', () => { - if (this.open) { + console.log('session exit') + if (this.pauseAfterExit) { + return + } else if (this.open) { this.destroy() } }) this.pty.on('close', () => { - if (this.open) { + console.log('session close') + if (this.pauseAfterExit) { + this.emitOutput('\r\nPress any key to close\r\n') + } else if (this.open) { this.destroy() } }) + + this.pauseAfterExit = options.pauseAfterExit } resize (columns, rows) { @@ -129,8 +138,12 @@ export class Session extends BaseSession { } write (data) { - if (this.pty._writable) { - this.pty.write(Buffer.from(data, 'utf-8')) + if (this.open) { + if (this.pty._writable) { + this.pty.write(Buffer.from(data, 'utf-8')) + } else { + this.destroy() + } } } diff --git a/terminus-terminal/src/services/terminal.service.ts b/terminus-terminal/src/services/terminal.service.ts index fdeeec2d..31049e6c 100644 --- a/terminus-terminal/src/services/terminal.service.ts +++ b/terminus-terminal/src/services/terminal.service.ts @@ -34,7 +34,7 @@ export class TerminalService { this.shells.complete() } - async openTab (shell?: IShell, cwd?: string): Promise { + async openTab (shell?: IShell, cwd?: string, pause?: boolean): Promise { if (!cwd) { if (this.app.activeTab instanceof TerminalTabComponent && this.app.activeTab.session) { cwd = await this.app.activeTab.session.getWorkingDirectory() @@ -54,6 +54,7 @@ export class TerminalService { args: shell.args || [], cwd, env, + pauseAfterExit: pause, }) this.logger.log('Using session options:', sessionOptions) diff --git a/webpack.config.js b/webpack.config.js index 62f18381..6f007064 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,5 +1,6 @@ module.exports = [ require('./app/webpack.config.js'), + require('./app/webpack.main.config.js'), require('./terminus-core/webpack.config.js'), require('./terminus-settings/webpack.config.js'), require('./terminus-terminal/webpack.config.js'), diff --git a/yarn.lock b/yarn.lock index 5f3287e2..d2aad41d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26,6 +26,82 @@ version "4.0.2" resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-4.0.2.tgz#6abbdc22f33cab742053777a26db2e25ca527179" +"@babel/code-frame@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" + dependencies: + "@babel/highlight" "7.0.0-beta.44" + +"@babel/generator@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" + dependencies: + "@babel/types" "7.0.0-beta.44" + jsesc "^2.5.1" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-function-name@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" + dependencies: + "@babel/helper-get-function-arity" "7.0.0-beta.44" + "@babel/template" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + +"@babel/helper-get-function-arity@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" + dependencies: + "@babel/types" "7.0.0-beta.44" + +"@babel/helper-split-export-declaration@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" + dependencies: + "@babel/types" "7.0.0-beta.44" + +"@babel/highlight@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +"@babel/template@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" + dependencies: + "@babel/code-frame" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + lodash "^4.2.0" + +"@babel/traverse@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" + dependencies: + "@babel/code-frame" "7.0.0-beta.44" + "@babel/generator" "7.0.0-beta.44" + "@babel/helper-function-name" "7.0.0-beta.44" + "@babel/helper-split-export-declaration" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + debug "^3.1.0" + globals "^11.1.0" + invariant "^2.2.0" + lodash "^4.2.0" + +"@babel/types@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" + dependencies: + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^2.0.0" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -57,6 +133,14 @@ dependencies: "@types/babel-types" "*" +"@types/electron-config@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@types/electron-config/-/electron-config-0.2.1.tgz#dceb3edb856e404138fb869cd4ed539ef88b882c" + +"@types/electron-debug@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@types/electron-debug/-/electron-debug-1.1.0.tgz#b9203bad33dccc5a4ea180a89a9dbcf1961f4c3c" + "@types/fs-promise@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/fs-promise/-/fs-promise-1.0.1.tgz#a77e18c055d7757d44a34c1ed7e8bb505992f783" @@ -245,6 +329,12 @@ acorn-globals@^3.0.0: dependencies: acorn "^4.0.4" +acorn-jsx@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-4.1.1.tgz#e8e41e48ea2fe0c896740610ab6a4ffd8add225e" + dependencies: + acorn "^5.0.3" + acorn@^3.1.0: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" @@ -257,6 +347,10 @@ acorn@^5.0.0, acorn@^5.6.2: version "5.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" +acorn@^5.0.3, acorn@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.2.tgz#91fa871883485d06708800318404e72bfb26dcc5" + agent-base@4, agent-base@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" @@ -269,7 +363,7 @@ agentkeepalive@^3.3.0: dependencies: humanize-ms "^1.2.1" -ajv-keywords@^3.1.0, ajv-keywords@^3.2.0: +ajv-keywords@^3.0.0, ajv-keywords@^3.1.0, ajv-keywords@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" @@ -289,7 +383,7 @@ ajv@^5.1.0, ajv@^5.3.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -ajv@^6.1.0, ajv@^6.5.2: +ajv@^6.0.1, ajv@^6.1.0, ajv@^6.5.0, ajv@^6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" dependencies: @@ -670,7 +764,7 @@ babel-code-frame@^6.11.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.26.0: +babel-core@^6.26.0, babel-core@^6.26.3: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" dependencies: @@ -694,6 +788,17 @@ babel-core@^6.26.0: slash "^1.0.0" source-map "^0.5.7" +babel-eslint@^8.2.6: + version "8.2.6" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" + dependencies: + "@babel/code-frame" "7.0.0-beta.44" + "@babel/traverse" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + eslint-scope "3.7.1" + eslint-visitor-keys "^1.0.0" + babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" @@ -825,6 +930,14 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" +babel-loader@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68" + dependencies: + find-cache-dir "^1.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" @@ -1134,7 +1247,7 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-preset-es2015@^6.9.0: +babel-preset-es2015@^6.24.1, babel-preset-es2015@^6.9.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" dependencies: @@ -1242,6 +1355,10 @@ babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: lodash "^4.17.4" to-fast-properties "^1.0.3" +babylon@7.0.0-beta.44: + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" + babylon@^6.17.3, babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -1635,6 +1752,16 @@ call-me-maybe@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + camel-case@3.0.x: version "3.0.0" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" @@ -1779,6 +1906,10 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + clap@^1.0.9: version "1.2.3" resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" @@ -2088,6 +2219,10 @@ constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" @@ -2411,6 +2546,10 @@ deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" @@ -2446,6 +2585,18 @@ defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -2518,6 +2669,13 @@ dmg-builder@5.3.0: parse-color "^1.0.0" sanitize-filename "^1.6.1" +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + doctrine@^0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523" @@ -2525,6 +2683,12 @@ doctrine@^0.7.2: esutils "^1.1.6" isarray "0.0.1" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + dependencies: + esutils "^2.0.2" + doctypes@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" @@ -2838,6 +3002,72 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" +eslint-config-standard@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz#87ee0d3c9d95382dc761958cbb23da9eea31e0ba" + +eslint-import-resolver-node@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-module-utils@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" + dependencies: + debug "^2.6.8" + pkg-dir "^1.0.0" + +eslint-plugin-es@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.3.1.tgz#5acb2565db4434803d1d46a9b4cbc94b345bd028" + dependencies: + eslint-utils "^1.3.0" + regexpp "^2.0.0" + +eslint-plugin-import@^2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" + dependencies: + contains-path "^0.1.0" + debug "^2.6.8" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.1" + eslint-module-utils "^2.2.0" + has "^1.0.1" + lodash "^4.17.4" + minimatch "^3.0.3" + read-pkg-up "^2.0.0" + resolve "^1.6.0" + +eslint-plugin-node@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz#a6e054e50199b2edd85518b89b4e7b323c9f36db" + dependencies: + eslint-plugin-es "^1.3.1" + eslint-utils "^1.3.1" + ignore "^4.0.2" + minimatch "^3.0.4" + resolve "^1.8.1" + semver "^5.5.0" + +eslint-plugin-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.0.0.tgz#bc15a4aa04fa6116113b6c47488c421821b758fc" + +eslint-plugin-standard@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz#2a9e21259ba4c47c02d53b2d0c9135d4b1022d47" + +eslint-scope@3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + eslint-scope@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" @@ -2845,6 +3075,64 @@ eslint-scope@^4.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-utils@^1.3.0, eslint-utils@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + +eslint@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.4.0.tgz#d068ec03006bb9e06b429dc85f7e46c1b69fac62" + dependencies: + ajv "^6.5.0" + babel-code-frame "^6.26.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^4.0.0" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^4.0.0" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.2" + imurmurhash "^0.1.4" + inquirer "^5.2.0" + is-resolvable "^1.1.0" + js-yaml "^3.11.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.5" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^2.0.0" + require-uncached "^1.0.3" + semver "^5.5.0" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^4.0.3" + text-table "^0.2.0" + +espree@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-4.0.0.tgz#253998f20a0f82db5d866385799d912a83a36634" + dependencies: + acorn "^5.6.0" + acorn-jsx "^4.1.1" + esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -2857,13 +3145,19 @@ esprima@~3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + dependencies: + estraverse "^4.0.0" + esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" dependencies: estraverse "^4.1.0" -estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -3016,6 +3310,10 @@ fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + fastparse@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" @@ -3039,6 +3337,13 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + file-loader@^1.1.11: version "1.1.11" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8" @@ -3112,6 +3417,15 @@ first-chunk-stream@^2.0.0: dependencies: readable-stream "^2.0.2" +flat-cache@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" @@ -3306,6 +3620,10 @@ function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -3450,10 +3768,25 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" +globals@^11.1.0, globals@^11.7.0: + version "11.7.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" + globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + globby@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" @@ -3812,6 +4145,10 @@ ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" +ignore@^4.0.2: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" @@ -3914,7 +4251,7 @@ into-stream@^3.1.0: from2 "^2.1.1" p-is-promise "^1.1.0" -invariant@^2.2.2: +invariant@^2.2.0, invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" dependencies: @@ -4108,6 +4445,16 @@ is-observable@^1.1.0: dependencies: symbol-observable "^1.1.0" +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + dependencies: + is-path-inside "^1.0.0" + is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" @@ -4150,6 +4497,10 @@ is-regex@^1.0.3: dependencies: has "^1.0.1" +is-resolvable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" @@ -4250,15 +4601,15 @@ js-stringify@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + "js-tokens@^3.0.0 || ^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - -js-yaml@^3.10.0, js-yaml@^3.12.0, js-yaml@^3.5.2: +js-yaml@^3.10.0, js-yaml@^3.11.0, js-yaml@^3.12.0, js-yaml@^3.5.2: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" dependencies: @@ -4320,6 +4671,10 @@ jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" +jsesc@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" @@ -4348,6 +4703,10 @@ json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" @@ -4490,6 +4849,13 @@ less@2.7.1: promise "^7.1.1" source-map "^0.5.3" +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + libnpx@9.7.1: version "9.7.1" resolved "https://registry.yarnpkg.com/libnpx/-/libnpx-9.7.1.tgz#55300b5e119bd47b714be9704ca0696ffb18b025" @@ -4707,7 +5073,7 @@ lodash.without@~4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" -lodash@^4.0.0, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.10: +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.10: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" @@ -5130,6 +5496,10 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + needle@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.2.tgz#1120ca4c41f2fcc6976fd28a8968afe239929418" @@ -5643,6 +6013,17 @@ optimist@~0.6.0: minimist "~0.0.1" wordwrap "~0.0.2" +optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + ora@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" @@ -5893,7 +6274,7 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-is-inside@^1.0.1, path-is-inside@~1.0.2: +path-is-inside@^1.0.1, path-is-inside@^1.0.2, path-is-inside@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" @@ -5965,6 +6346,12 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + dependencies: + find-up "^1.0.0" + pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" @@ -5987,6 +6374,10 @@ plist@^3.0.1: xmlbuilder "^9.0.7" xmldom "0.1.x" +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -6236,6 +6627,10 @@ postcss@^6.0.1: source-map "^0.6.1" supports-color "^5.4.0" +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + prepend-http@^1.0.0, prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" @@ -6282,6 +6677,10 @@ progress-stream@^1.1.0: speedometer "~0.1.2" through2 "~0.2.3" +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + promise-inflight@^1.0.1, promise-inflight@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -6826,6 +7225,10 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexpp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.0.tgz#b2a7534a85ca1b033bcf5ce9ff8e56d4e0755365" + regexpu-core@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" @@ -6980,6 +7383,13 @@ require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" +require-uncached@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -6993,6 +7403,10 @@ resolve-dir@^1.0.0: expand-tilde "^2.0.0" global-modules "^1.0.0" +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -7001,7 +7415,7 @@ resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" dependencies: @@ -7262,6 +7676,12 @@ slice-ansi@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + dependencies: + is-fullwidth-code-point "^2.0.0" + slide@^1.1.3, slide@^1.1.5, slide@~1.1.3, slide@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" @@ -7381,7 +7801,7 @@ source-map@^0.4.2: dependencies: amdefine ">=0.0.4" -source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1: +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -7656,6 +8076,17 @@ symbol-observable@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" +table@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" + dependencies: + ajv "^6.0.1" + ajv-keywords "^3.0.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + tapable@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" @@ -7794,6 +8225,10 @@ to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -7933,6 +8368,12 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -8394,6 +8835,10 @@ wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + worker-farm@^1.5.2: version "1.6.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" @@ -8442,6 +8887,12 @@ write-file-atomic@~2.1.0: imurmurhash "^0.1.4" slide "^1.1.5" +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"