From 6348e7b8f0c96b6674aaabb26a4593a87f600f5e Mon Sep 17 00:00:00 2001 From: Nikolaos Stefanou Date: Mon, 24 Feb 2020 17:42:28 +0000 Subject: [PATCH] first working version of serial port integration --- package.json | 5 +- terminus-serial/package.json | 38 + terminus-serial/src/api.ts | 154 ++ terminus-serial/src/buttonProvider.ts | 36 + .../editConnectionModal.component.pug | 140 ++ .../editConnectionModal.component.ts | 77 + .../src/components/promptModal.component.pug | 14 + .../src/components/promptModal.component.ts | 31 + .../src/components/serialModal.component.pug | 32 + .../src/components/serialModal.component.scss | 5 + .../src/components/serialModal.component.ts | 108 ++ .../serialSettingsTab.component.pug | 28 + .../components/serialSettingsTab.component.ts | 131 ++ .../src/components/serialTab.component.pug | 11 + .../src/components/serialTab.component.scss | 71 + .../src/components/serialTab.component.ts | 111 ++ terminus-serial/src/config.ts | 19 + terminus-serial/src/hotkeys.ts | 17 + terminus-serial/src/icons/serial.svg | 27 + terminus-serial/src/index.ts | 51 + terminus-serial/src/recoveryProvider.ts | 21 + .../src/services/serial.service.ts | 68 + terminus-serial/src/settings.ts | 16 + terminus-serial/tsconfig.json | 7 + terminus-serial/tsconfig.typings.json | 15 + terminus-serial/webpack.config.js | 59 + terminus-serial/yarn.lock | 1375 +++++++++++++++++ .../src/components/sshTab.component.ts | 2 +- webpack.config.js | 1 + 29 files changed, 2667 insertions(+), 3 deletions(-) create mode 100644 terminus-serial/package.json create mode 100644 terminus-serial/src/api.ts create mode 100644 terminus-serial/src/buttonProvider.ts create mode 100644 terminus-serial/src/components/editConnectionModal.component.pug create mode 100644 terminus-serial/src/components/editConnectionModal.component.ts create mode 100644 terminus-serial/src/components/promptModal.component.pug create mode 100644 terminus-serial/src/components/promptModal.component.ts create mode 100644 terminus-serial/src/components/serialModal.component.pug create mode 100644 terminus-serial/src/components/serialModal.component.scss create mode 100644 terminus-serial/src/components/serialModal.component.ts create mode 100644 terminus-serial/src/components/serialSettingsTab.component.pug create mode 100644 terminus-serial/src/components/serialSettingsTab.component.ts create mode 100644 terminus-serial/src/components/serialTab.component.pug create mode 100644 terminus-serial/src/components/serialTab.component.scss create mode 100644 terminus-serial/src/components/serialTab.component.ts create mode 100644 terminus-serial/src/config.ts create mode 100644 terminus-serial/src/hotkeys.ts create mode 100644 terminus-serial/src/icons/serial.svg create mode 100644 terminus-serial/src/index.ts create mode 100644 terminus-serial/src/recoveryProvider.ts create mode 100644 terminus-serial/src/services/serial.service.ts create mode 100644 terminus-serial/src/settings.ts create mode 100644 terminus-serial/tsconfig.json create mode 100644 terminus-serial/tsconfig.typings.json create mode 100644 terminus-serial/webpack.config.js create mode 100644 terminus-serial/yarn.lock diff --git a/package.json b/package.json index 26de2a50..943cf955 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "pug-static-loader": "2.0.0", "raw-loader": "4.0.0", "sass-loader": "^8.0.0", + "serialport": "^8.0.0", "shelljs": "0.8.3", "source-code-pro": "^2.30.2", "source-sans-pro": "3.6.0", @@ -58,8 +59,8 @@ "*/node-abi": "^2.14.0" }, "scripts": { - "build": "npm run build:typings && webpack --color --config app/webpack.main.config.js && webpack --color --config app/webpack.config.js && webpack --color --config terminus-core/webpack.config.js && webpack --color --config terminus-settings/webpack.config.js && webpack --color --config terminus-terminal/webpack.config.js && webpack --color --config terminus-plugin-manager/webpack.config.js && webpack --color --config terminus-community-color-schemes/webpack.config.js && webpack --color --config terminus-ssh/webpack.config.js", - "build:typings": "tsc --project terminus-core/tsconfig.typings.json && tsc --project terminus-settings/tsconfig.typings.json && tsc --project terminus-terminal/tsconfig.typings.json && tsc --project terminus-plugin-manager/tsconfig.typings.json && tsc --project terminus-ssh/tsconfig.typings.json", + "build": "npm run build:typings && webpack --color --config app/webpack.main.config.js && webpack --color --config app/webpack.config.js && webpack --color --config terminus-core/webpack.config.js && webpack --color --config terminus-settings/webpack.config.js && webpack --color --config terminus-terminal/webpack.config.js && webpack --color --config terminus-plugin-manager/webpack.config.js && webpack --color --config terminus-community-color-schemes/webpack.config.js && webpack --color --config terminus-ssh/webpack.config.js && webpack --color --config terminus-serial/webpack.config.js", + "build:typings": "tsc --project terminus-core/tsconfig.typings.json && tsc --project terminus-settings/tsconfig.typings.json && tsc --project terminus-terminal/tsconfig.typings.json && tsc --project terminus-plugin-manager/tsconfig.typings.json && tsc --project terminus-ssh/tsconfig.typings.json && tsc --project terminus-serial/tsconfig.typings.json", "watch": "cross-env TERMINUS_DEV=1 webpack --progress --color --watch", "start": "cross-env TERMINUS_DEV=1 electron app --debug", "prod": "cross-env TERMINUS_DEV=1 electron app", diff --git a/terminus-serial/package.json b/terminus-serial/package.json new file mode 100644 index 00000000..6c674a7f --- /dev/null +++ b/terminus-serial/package.json @@ -0,0 +1,38 @@ +{ + "name": "terminus-serial", + "version": "1.0.99-nightly.0", + "description": "Serial connection manager for Terminus", + "keywords": [ + "terminus-builtin-plugin" + ], + "main": "dist/index.js", + "typings": "typings/index.d.ts", + "scripts": { + "build": "webpack --progress --color", + "watch": "webpack --progress --color --watch" + }, + "files": [ + "dist" + ], + "author": "Eugene Pankov", + "license": "MIT", + "devDependencies": { + "@types/node": "12.7.3", + "@types/ssh2": "^0.5.35", + "ansi-colors": "^4.1.1", + "cli-spinner": "^0.2.10", + "electron-rebuild": "^1.10.0", + "serialport": "^8.0.0", + "terminus-terminal": "^1.0.98-nightly.0" + }, + "peerDependencies": { + "@angular/common": "^7", + "@angular/core": "^7", + "@angular/forms": "^7", + "@ng-bootstrap/ng-bootstrap": "^1", + "rxjs": "^5", + "terminus-core": "*", + "terminus-settings": "*", + "terminus-terminal": "*" + } +} diff --git a/terminus-serial/src/api.ts b/terminus-serial/src/api.ts new file mode 100644 index 00000000..9f2b7f02 --- /dev/null +++ b/terminus-serial/src/api.ts @@ -0,0 +1,154 @@ +import { BaseSession } from 'terminus-terminal' +import { SerialPort } from 'serialport' +import { Logger } from 'terminus-core' +import { Subject, Observable } from 'rxjs' + +export interface LoginScript { + expect: string + send: string + isRegex?: boolean + optional?: boolean +} + +export interface SerialConnection { + name: string + port: string + baudrate: number + databits: number + stopbits: number + parity: string + rtscts: boolean + xon: boolean + xoff: boolean + xany: boolean + group: string | null + scripts?: LoginScript[] + color?: string +} + +export class SerialSession extends BaseSession { + scripts?: LoginScript[] + serial: SerialPort + logger: Logger + + get serviceMessage$ (): Observable { return this.serviceMessage } + private serviceMessage = new Subject() + + constructor (public connection: SerialConnection) { + super() + this.scripts = connection.scripts || [] + } + + async start () { + this.open = true + + this.serial.on('data', data => { + const dataString = data.toString() + this.emitOutput(data) + + if (this.scripts) { + let found = false + for (const script of this.scripts) { + let match = false + let cmd = '' + if (script.isRegex) { + const re = new RegExp(script.expect, 'g') + if (dataString.match(re)) { + cmd = dataString.replace(re, script.send) + match = true + found = true + } + } else { + if (dataString.includes(script.expect)) { + cmd = script.send + match = true + found = true + } + } + + if (match) { + this.logger.info('Executing script: "' + cmd + '"') + this.serial.write(cmd + '\n') + this.scripts = this.scripts.filter(x => x !== script) + } else { + if (script.optional) { + this.logger.debug('Skip optional script: ' + script.expect) + found = true + this.scripts = this.scripts.filter(x => x !== script) + } else { + break + } + } + } + + if (found) { + this.executeUnconditionalScripts() + } + } + }) + + this.serial.on('end', () => { + this.logger.info('Shell session ended') + if (this.open) { + this.destroy() + } + }) + + this.executeUnconditionalScripts() + } + + emitServiceMessage (msg: string) { + this.serviceMessage.next(msg) + this.logger.info(msg) + } + + write (data) { + if (this.serial) { + this.serial.write(data) + } + } + + async destroy (): Promise { + this.serviceMessage.complete() + await super.destroy() + } + + resize (columns, rows) { + console.log('resize') + } + + kill (signal?: string) { + console.log('valar morghulis') + } + + async getChildProcesses (): Promise { + return [] + } + + async gracefullyKillProcess (): Promise { + this.kill('TERM') + } + + async getWorkingDirectory (): Promise { + return null + } + + private executeUnconditionalScripts () { + if (this.scripts) { + for (const script of this.scripts) { + if (!script.expect) { + console.log('Executing script:', script.send) + this.serial.write(script.send + '\n') + this.scripts = this.scripts.filter(x => x !== script) + } else { + break + } + } + } + } +} + +export interface SerialConnectionGroup { + name: string + connections: SerialConnection[] +} diff --git a/terminus-serial/src/buttonProvider.ts b/terminus-serial/src/buttonProvider.ts new file mode 100644 index 00000000..4dc4235a --- /dev/null +++ b/terminus-serial/src/buttonProvider.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@angular/core' +import { NgbModal } from '@ng-bootstrap/ng-bootstrap' +import { HotkeysService, ToolbarButtonProvider, ToolbarButton } from 'terminus-core' +import { SerialModalComponent } from './components/serialModal.component' + +/** @hidden */ +@Injectable() +export class ButtonProvider extends ToolbarButtonProvider { + constructor ( + private ngbModal: NgbModal, + hotkeys: HotkeysService, + ) { + super() + hotkeys.matchedHotkey.subscribe(async (hotkey: string) => { + if (hotkey === 'serial') { + this.activate() + } + }) + } + + activate () { + this.ngbModal.open(SerialModalComponent) + } + + provide (): ToolbarButton[] { + return [{ + icon: require('./icons/serial.svg'), + weight: 5, + title: 'Serial connections', + touchBarNSImage: 'NSTouchBarOpenInBrowserTemplate', + click: async () => { + this.activate() + }, + }] + } +} diff --git a/terminus-serial/src/components/editConnectionModal.component.pug b/terminus-serial/src/components/editConnectionModal.component.pug new file mode 100644 index 00000000..b909b1b7 --- /dev/null +++ b/terminus-serial/src/components/editConnectionModal.component.pug @@ -0,0 +1,140 @@ +.modal-body + ngb-tabset([activeId]='basic') + ngb-tab(id='basic') + ng-template(ngbTabTitle) General + ng-template(ngbTabContent) + .form-group + label Name + input.form-control( + type='text', + autofocus, + [(ngModel)]='connection.name', + ) + + .form-group + label Group + input.form-control( + type='text', + placeholder='Ungrouped', + [(ngModel)]='connection.group', + ) + + .form-group + label Path + input.form-control( + type='text', + [(ngModel)]='connection.port', + ) + + .form-group + label Baud Rate + input.form-control( + type='text', + [(ngModel)]='connection.baudrate', + ) + + ngb-tab(id='advanced') + ng-template(ngbTabTitle) Advanced + ng-template(ngbTabContent) + .form-line + .header + .title Tab color + input.form-control( + type='text', + autofocus, + [(ngModel)]='connection.color', + placeholder='#000000' + ) + + .form-line + .header + .title DataBits + input.form-control( + type='number', + placeholder='8', + [(ngModel)]='connection.databits', + ) + + .form-line + .header + .title StopBits + input.form-control( + type='number', + placeholder='1', + [(ngModel)]='connection.stopbits', + ) + + .form-line + .header + .title Parity + input.form-control( + type='text', + [(ngModel)]='connection.parity', + placeholder='none' + ) + + .form-line + .header + .title RTSCTS + toggle([(ngModel)]='connection.rtscts') + + .form-line + .header + .title Xon + toggle([(ngModel)]='connection.xon') + + .form-line + .header + .title Xoff + toggle([(ngModel)]='connection.xoff') + + .form-line + .header + .title Xany + toggle([(ngModel)]='connection.xany') + + ngb-tab(id='scripts') + ng-template(ngbTabTitle) Login scripts + ng-template(ngbTabContent) + table(*ngIf='connection.scripts.length > 0') + tr + th String to expect + th String to be sent + th.pl-2 Regex + th.pl-2 Optional + th.pl-2 Actions + tr(*ngFor='let script of connection.scripts') + td.pr-2 + input.form-control( + type='text', + [(ngModel)]='script.expect' + ) + td + input.form-control( + type='text', + [(ngModel)]='script.send' + ) + td.pl-2 + checkbox( + [(ngModel)]='script.isRegex', + ) + td.pl-2 + checkbox( + [(ngModel)]='script.optional', + ) + td.pl-2 + .input-group.flex-nowrap + button.btn.btn-outline-info.ml-0((click)='moveScriptUp(script)') + i.fas.fa-arrow-up + button.btn.btn-outline-info.ml-0((click)='moveScriptDown(script)') + i.fas.fa-arrow-down + button.btn.btn-outline-danger.ml-0((click)='deleteScript(script)') + i.fas.fa-trash + + button.btn.btn-outline-info.mt-2((click)='addScript()') + i.fas.fa-plus + span New item + +.modal-footer + button.btn.btn-outline-primary((click)='save()') Save + button.btn.btn-outline-danger((click)='cancel()') Cancel diff --git a/terminus-serial/src/components/editConnectionModal.component.ts b/terminus-serial/src/components/editConnectionModal.component.ts new file mode 100644 index 00000000..b121bf75 --- /dev/null +++ b/terminus-serial/src/components/editConnectionModal.component.ts @@ -0,0 +1,77 @@ +import { Component } from '@angular/core' +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' +import { ElectronService, HostAppService } from 'terminus-core' +import { SerialConnection, LoginScript } from '../api' +// import { PromptModalComponent } from './promptModal.component' + +/** @hidden */ +@Component({ + template: require('./editConnectionModal.component.pug'), +}) +export class EditConnectionModalComponent { + connection: SerialConnection + + constructor ( + private modalInstance: NgbActiveModal, + private electron: ElectronService, + private hostApp: HostAppService, + // private ngbModal: NgbModal, + ) { + } + + async ngOnInit () { + this.connection.scripts = this.connection.scripts || [] + } + + save () { + this.modalInstance.close(this.connection) + } + + cancel () { + this.modalInstance.dismiss() + } + + moveScriptUp (script: LoginScript) { + if (!this.connection.scripts) { + this.connection.scripts = [] + } + const index = this.connection.scripts.indexOf(script) + if (index > 0) { + this.connection.scripts.splice(index, 1) + this.connection.scripts.splice(index - 1, 0, script) + } + } + + moveScriptDown (script: LoginScript) { + if (!this.connection.scripts) { + this.connection.scripts = [] + } + const index = this.connection.scripts.indexOf(script) + if (index >= 0 && index < this.connection.scripts.length - 1) { + this.connection.scripts.splice(index, 1) + this.connection.scripts.splice(index + 1, 0, script) + } + } + + async deleteScript (script: LoginScript) { + if (this.connection.scripts && (await this.electron.showMessageBox( + this.hostApp.getWindow(), + { + type: 'warning', + message: 'Delete this script?', + detail: script.expect, + buttons: ['Keep', 'Delete'], + defaultId: 1, + } + )).response === 1) { + this.connection.scripts = this.connection.scripts.filter(x => x !== script) + } + } + + addScript () { + if (!this.connection.scripts) { + this.connection.scripts = [] + } + this.connection.scripts.push({ expect: '', send: '' }) + } +} diff --git a/terminus-serial/src/components/promptModal.component.pug b/terminus-serial/src/components/promptModal.component.pug new file mode 100644 index 00000000..ddcfaf3f --- /dev/null +++ b/terminus-serial/src/components/promptModal.component.pug @@ -0,0 +1,14 @@ +.modal-body + input.form-control( + [type]='"text"', + autofocus, + [(ngModel)]='value', + #input, + [placeholder]='prompt', + (keyup.enter)='ok()', + (keyup.esc)='cancel()', + ) + .d-flex.align-items-start.mt-2 + button.btn.btn-primary.ml-auto( + (click)='ok()', + ) Enter diff --git a/terminus-serial/src/components/promptModal.component.ts b/terminus-serial/src/components/promptModal.component.ts new file mode 100644 index 00000000..ee648432 --- /dev/null +++ b/terminus-serial/src/components/promptModal.component.ts @@ -0,0 +1,31 @@ +import { Component, Input, ViewChild, ElementRef } from '@angular/core' +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' + +/** @hidden */ +@Component({ + template: require('./promptModal.component.pug'), +}) +export class PromptModalComponent { + @Input() value: string + @ViewChild('input') input: ElementRef + + constructor ( + private modalInstance: NgbActiveModal, + ) { } + + ngOnInit () { + setTimeout(() => { + this.input.nativeElement.focus() + }) + } + + ok () { + this.modalInstance.close({ + value: this.value, + }) + } + + cancel () { + this.modalInstance.close(null) + } +} diff --git a/terminus-serial/src/components/serialModal.component.pug b/terminus-serial/src/components/serialModal.component.pug new file mode 100644 index 00000000..1520934c --- /dev/null +++ b/terminus-serial/src/components/serialModal.component.pug @@ -0,0 +1,32 @@ +.modal-body + input.form-control( + type='text', + [(ngModel)]='quickTarget', + autofocus, + placeholder='Quick connect: path@baudrate', + (ngModelChange)='refresh()', + (keyup.enter)='quickConnect()' + ) + + .list-group.mt-3(*ngIf='lastConnection') + a.list-group-item.list-group-item-action.d-flex.align-items-center((click)='connect(lastConnection)') + i.fas.fa-fw.fa-history + .mr-auto {{lastConnection.name}} + button.btn.btn-outline-danger.btn-sm((click)='clearLastConnection(); $event.stopPropagation()') + i.fas.fa-trash + + .list-group.mt-3.connections-list(*ngIf='childGroups.length') + ng-container(*ngFor='let group of childGroups') + .list-group-item.list-group-item-action.d-flex.align-items-center( + (click)='groupCollapsed[group.name] = !groupCollapsed[group.name]' + ) + .fa.fa-fw.fa-chevron-right(*ngIf='groupCollapsed[group.name]') + .fa.fa-fw.fa-chevron-down(*ngIf='!groupCollapsed[group.name]') + .ml-2 {{group.name || "Ungrouped"}} + ng-container(*ngIf='!groupCollapsed[group.name]') + .list-group-item.list-group-item-action.pl-5.d-flex.align-items-center( + *ngFor='let connection of group.connections', + (click)='connect(connection)' + ) + .mr-2 {{connection.name}} + .text-muted {{connection.port}} diff --git a/terminus-serial/src/components/serialModal.component.scss b/terminus-serial/src/components/serialModal.component.scss new file mode 100644 index 00000000..eae336fa --- /dev/null +++ b/terminus-serial/src/components/serialModal.component.scss @@ -0,0 +1,5 @@ +.list-group.connections-list { + display: block; + max-height: 70vh; + overflow-y: auto; +} diff --git a/terminus-serial/src/components/serialModal.component.ts b/terminus-serial/src/components/serialModal.component.ts new file mode 100644 index 00000000..238358f6 --- /dev/null +++ b/terminus-serial/src/components/serialModal.component.ts @@ -0,0 +1,108 @@ +import { Component } from '@angular/core' +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' +import { ToastrService } from 'ngx-toastr' +import { ConfigService, AppService } from 'terminus-core' +import { SettingsTabComponent } from 'terminus-settings' +import { SerialService } from '../services/serial.service' +import { SerialConnection, SerialConnectionGroup } from '../api' + +/** @hidden */ +@Component({ + template: require('./serialModal.component.pug'), + styles: [require('./serialModal.component.scss')], +}) +export class SerialModalComponent { + connections: SerialConnection[] + childFolders: SerialConnectionGroup[] + quickTarget: string + lastConnection: SerialConnection|null = null + childGroups: SerialConnectionGroup[] + groupCollapsed: {[id: string]: boolean} = {} + + constructor ( + public modalInstance: NgbActiveModal, + private config: ConfigService, + private serial: SerialService, + private app: AppService, + private toastr: ToastrService, + ) { } + + ngOnInit () { + this.connections = this.config.store.serial.connections + if (window.localStorage.lastSerialConnection) { + this.lastConnection = JSON.parse(window.localStorage.lastSerialConnection) + } + this.refresh() + } + + quickConnect () { + let path = this.quickTarget + let baudrate = 115200 + if (this.quickTarget.includes('@')) { + baudrate = parseInt(path.split('@')[1]) + path = path.split('@')[0] + } + const connection: SerialConnection = { + name: this.quickTarget, + group: null, + port: path, + baudrate: baudrate, + databits: 8, + parity: "none", + rtscts: false, + stopbits: 1, + xany: false, + xoff: false, + xon: false, + } + window.localStorage.lastSerialConnection = JSON.stringify(connection) + this.connect(connection) + } + + clearLastConnection () { + window.localStorage.lastSerialConnection = null + this.lastConnection = null + } + + connect (connection: SerialConnection) { + this.close() + this.serial.openTab(connection).catch(error => { + this.toastr.error(`Could not connect: ${error}`) + }).then(() => { + setTimeout(() => { + this.app.activeTab.emitFocused() + }) + }) + } + + manageConnections () { + this.close() + this.app.openNewTab(SettingsTabComponent, { activeTab: 'serial' }) + } + + close () { + this.modalInstance.close() + } + + refresh () { + this.childGroups = [] + + let connections = this.connections + if (this.quickTarget) { + connections = connections.filter((connection: SerialConnection) => (connection.name + connection.group!).toLowerCase().includes(this.quickTarget)) + } + + for (const connection of connections) { + connection.group = connection.group || null + let group = this.childGroups.find(x => x.name === connection.group) + if (!group) { + group = { + name: connection.group!, + connections: [], + } + this.childGroups.push(group!) + } + group.connections.push(connection) + } + } +} diff --git a/terminus-serial/src/components/serialSettingsTab.component.pug b/terminus-serial/src/components/serialSettingsTab.component.pug new file mode 100644 index 00000000..ba99d107 --- /dev/null +++ b/terminus-serial/src/components/serialSettingsTab.component.pug @@ -0,0 +1,28 @@ +h3 Connections + +.list-group.list-group-flush.mt-3.mb-3 + ng-container(*ngFor='let group of childGroups') + .list-group-item.list-group-item-action.d-flex.align-items-center( + (click)='groupCollapsed[group.name] = !groupCollapsed[group.name]' + ) + .fa.fa-fw.fa-chevron-right(*ngIf='groupCollapsed[group.name]') + .fa.fa-fw.fa-chevron-down(*ngIf='!groupCollapsed[group.name]') + span.ml-3.mr-auto {{group.name || "Ungrouped"}} + button.btn.btn-outline-info.ml-2((click)='editGroup(group)') + i.fas.fa-edit + button.btn.btn-outline-danger.ml-1((click)='deleteGroup(group)') + i.fas.fa-trash + ng-container(*ngIf='!groupCollapsed[group.name]') + .list-group-item.list-group-item-action.pl-5.d-flex.align-items-center( + *ngFor='let connection of group.connections', + (click)='editConnection(connection)' + ) + .mr-auto + div {{connection.name}} + .text-muted {{connection.port}} + button.btn.btn-outline-danger.ml-1((click)='$event.stopPropagation(); deleteConnection(connection)') + i.fas.fa-trash + +button.btn.btn-primary((click)='createConnection()') + i.fas.fa-fw.fa-plus + span.ml-2 Add connection diff --git a/terminus-serial/src/components/serialSettingsTab.component.ts b/terminus-serial/src/components/serialSettingsTab.component.ts new file mode 100644 index 00000000..3165b3ee --- /dev/null +++ b/terminus-serial/src/components/serialSettingsTab.component.ts @@ -0,0 +1,131 @@ +import { Component } from '@angular/core' +import { NgbModal } from '@ng-bootstrap/ng-bootstrap' +import { ConfigService, ElectronService, HostAppService } from 'terminus-core' +import { SerialConnection, SerialConnectionGroup } from '../api' +import { EditConnectionModalComponent } from './editConnectionModal.component' +import { PromptModalComponent } from './promptModal.component' + +/** @hidden */ +@Component({ + template: require('./serialSettingsTab.component.pug'), +}) +export class SerialSettingsTabComponent { + connections: SerialConnection[] + childGroups: SerialConnectionGroup[] + groupCollapsed: {[id: string]: boolean} = {} + + constructor ( + public config: ConfigService, + private electron: ElectronService, + private hostApp: HostAppService, + private ngbModal: NgbModal, + ) { + this.connections = this.config.store.serial.connections + this.refresh() + } + + createConnection () { + const connection: SerialConnection = { + name: '', + group: null, + port: '', + baudrate: 115200, + databits: 8, + parity: "none", + rtscts: false, + stopbits: 1, + xany: false, + xoff: false, + xon: false, + } + + const modal = this.ngbModal.open(EditConnectionModalComponent) + modal.componentInstance.connection = connection + modal.result.then(result => { + this.connections.push(result) + this.config.store.serial.connections = this.connections + this.config.save() + this.refresh() + }) + } + + editConnection (connection: SerialConnection) { + const modal = this.ngbModal.open(EditConnectionModalComponent, { size: 'lg' }) + modal.componentInstance.connection = Object.assign({}, connection) + modal.result.then(result => { + Object.assign(connection, result) + this.config.store.serial.connections = this.connections + this.config.save() + this.refresh() + }) + } + + async deleteConnection (connection: SerialConnection) { + if ((await this.electron.showMessageBox( + this.hostApp.getWindow(), + { + type: 'warning', + message: `Delete "${connection.name}"?`, + buttons: ['Keep', 'Delete'], + defaultId: 1, + } + )).response === 1) { + this.connections = this.connections.filter(x => x !== connection) + this.config.store.serial.connections = this.connections + this.config.save() + this.refresh() + } + } + + editGroup (group: SerialConnectionGroup) { + const modal = this.ngbModal.open(PromptModalComponent) + modal.componentInstance.prompt = 'New group name' + modal.componentInstance.value = group.name + modal.result.then(result => { + if (result) { + for (const connection of this.connections.filter(x => x.group === group.name)) { + connection.group = result.value + } + this.config.store.serial.connections = this.connections + this.config.save() + this.refresh() + } + }) + } + + async deleteGroup (group: SerialConnectionGroup) { + if ((await this.electron.showMessageBox( + this.hostApp.getWindow(), + { + type: 'warning', + message: `Delete "${group}"?`, + buttons: ['Keep', 'Delete'], + defaultId: 1, + } + )).response === 1) { + for (const connection of this.connections.filter(x => x.group === group.name)) { + connection.group = null + } + this.config.save() + this.refresh() + } + } + + refresh () { + this.connections = this.config.store.serial.connections + this.childGroups = [] + + for (const connection of this.connections) { + connection.group = connection.group || null + let group = this.childGroups.find(x => x.name === connection.group) + if (!group) { + group = { + name: connection.group!, + connections: [], + } + this.childGroups.push(group!) + } + group.connections.push(connection) + } + } +} diff --git a/terminus-serial/src/components/serialTab.component.pug b/terminus-serial/src/components/serialTab.component.pug new file mode 100644 index 00000000..714aa78d --- /dev/null +++ b/terminus-serial/src/components/serialTab.component.pug @@ -0,0 +1,11 @@ +.serial-tab-toolbar + .btn.btn-outline-secondary.reveal-button + i.fas.fa-ellipsis-h + .toolbar(*ngIf='session', [class.show]='!session.open') + i.fas.fa-circle.text-success.mr-2(*ngIf='session.open') + i.fas.fa-circle.text-danger.mr-2(*ngIf='!session.open') + strong.mr-auto(*ngIf='session') {{session.connection.port}} ({{session.connection.baudrate}}) + + button.btn.btn-info((click)='reconnect()', *ngIf='!session.open') + i.fas.fa-reload + span Reconnect diff --git a/terminus-serial/src/components/serialTab.component.scss b/terminus-serial/src/components/serialTab.component.scss new file mode 100644 index 00000000..2794832c --- /dev/null +++ b/terminus-serial/src/components/serialTab.component.scss @@ -0,0 +1,71 @@ +:host { + flex: auto; + display: flex; + flex-direction: column; + overflow: hidden; + position: relative; + + &> .content { + flex: auto; + position: relative; + display: block; + overflow: hidden; + margin: 15px; + } + + .serial-tab-toolbar { + position: absolute; + top: 0; + left: 0; + right: 0; + z-index: 4; + pointer-events: none; + + .reveal-button { + position: absolute; + top: 10px; + right: 30px; + border-radius: 50%; + width: 35px; + padding: 0; + height: 35px; + line-height: 35px; + transition: 0.125s opacity; + opacity: .5; + pointer-events: all; + } + + &:hover .reveal-button { + opacity: 0; + } + + &:hover .toolbar { + opacity: 1; + } + + .toolbar { + opacity: 0; + background: rgba(0, 0, 0, .75); + padding: 10px 20px; + transition: 0.25s opacity; + display: flex; + align-items: center; + z-index: 1; + will-change: transform; + + &>* { + pointer-events: all; + } + } + + &.show { + .reveal-button { + opacity: 0; + } + + .toolbar { + opacity: 1; + } + } + } +} diff --git a/terminus-serial/src/components/serialTab.component.ts b/terminus-serial/src/components/serialTab.component.ts new file mode 100644 index 00000000..54c0d4bc --- /dev/null +++ b/terminus-serial/src/components/serialTab.component.ts @@ -0,0 +1,111 @@ +import colors from 'ansi-colors' +import { Spinner } from 'cli-spinner' +import { Component } from '@angular/core' +// import { NgbModal } from '@ng-bootstrap/ng-bootstrap' +import { first } from 'rxjs/operators' +import { BaseTerminalTabComponent } from 'terminus-terminal' +import { SerialService } from '../services/serial.service' +import { SerialConnection, SerialSession } from '../api' +import { Subscription } from 'rxjs'; + +/** @hidden */ +@Component({ + selector: 'serial-tab', + template: BaseTerminalTabComponent.template + require('./serialTab.component.pug'), + styles: [require('./serialTab.component.scss'), ...BaseTerminalTabComponent.styles], + animations: BaseTerminalTabComponent.animations, +}) +export class SerialTabComponent extends BaseTerminalTabComponent { + connection: SerialConnection + serial: SerialService + session: SerialSession + // private ngbModal: NgbModal + private homeEndSubscription: Subscription + + ngOnInit () { + // this.ngbModal = this.injector.get(NgbModal) + + this.logger = this.log.create('terminalTab') + this.serial = this.injector.get(SerialService) + + this.homeEndSubscription = this.hotkeys.matchedHotkey.subscribe(hotkey => { + if (!this.hasFocus) { + return + } + switch (hotkey) { + case 'home': + this.sendInput('\x1b[H' ) + break + case 'end': + this.sendInput('\x1b[F' ) + break + } + }) + + this.frontendReady$.pipe(first()).subscribe(() => { + this.initializeSession() + }) + + super.ngOnInit() + + setImmediate(() => { + this.setTitle(this.connection.name) + }) + } + + async initializeSession () { + if (!this.connection) { + this.logger.error('No Serial connection info supplied') + return + } + + this.session = this.serial.createSession(this.connection) + this.session.serviceMessage$.subscribe(msg => { + this.write('\r\n' + colors.black.bgWhite(' serial ') + ' ' + msg + '\r\n') + this.session.resize(this.size.columns, this.size.rows) + }) + this.attachSessionHandlers() + this.write(`Connecting to `) + + const spinner = new Spinner({ + text: 'Connecting', + stream: { + write: x => this.write(x), + }, + }) + spinner.setSpinnerString(6) + spinner.start() + + try { + await this.serial.connectSession(this.session, (message: string) => { + spinner.stop(true) + this.write(message + '\r\n') + spinner.start() + }) + spinner.stop(true) + } catch (e) { + spinner.stop(true) + this.write(colors.black.bgRed(' X ') + ' ' + colors.red(e.message) + '\r\n') + return + } + await this.session.start() + this.session.resize(this.size.columns, this.size.rows) + } + + async getRecoveryToken (): Promise { + return { + type: 'app:serial-tab', + connection: this.connection, + savedState: this.frontend?.saveState(), + } + } + + reconnect () { + this.initializeSession() + } + + ngOnDestroy () { + this.homeEndSubscription.unsubscribe() + super.ngOnDestroy() + } +} diff --git a/terminus-serial/src/config.ts b/terminus-serial/src/config.ts new file mode 100644 index 00000000..08c6209b --- /dev/null +++ b/terminus-serial/src/config.ts @@ -0,0 +1,19 @@ +import { ConfigProvider } from 'terminus-core' + +/** @hidden */ +export class SerialConfigProvider extends ConfigProvider { + defaults = { + serial: { + connections: [], + options: { + }, + }, + hotkeys: { + serial: [ + 'Alt-K', + ], + }, + } + + platformDefaults = { } +} diff --git a/terminus-serial/src/hotkeys.ts b/terminus-serial/src/hotkeys.ts new file mode 100644 index 00000000..e0ac50ab --- /dev/null +++ b/terminus-serial/src/hotkeys.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@angular/core' +import { HotkeyDescription, HotkeyProvider } from 'terminus-core' + +/** @hidden */ +@Injectable() +export class SerialHotkeyProvider extends HotkeyProvider { + hotkeys: HotkeyDescription[] = [ + { + id: 'serial', + name: 'Show Serial connections', + }, + ] + + async provide (): Promise { + return this.hotkeys + } +} diff --git a/terminus-serial/src/icons/serial.svg b/terminus-serial/src/icons/serial.svg new file mode 100644 index 00000000..ae097150 --- /dev/null +++ b/terminus-serial/src/icons/serial.svg @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/terminus-serial/src/index.ts b/terminus-serial/src/index.ts new file mode 100644 index 00000000..c3b68949 --- /dev/null +++ b/terminus-serial/src/index.ts @@ -0,0 +1,51 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +import { FormsModule } from '@angular/forms' +import { NgbModule } from '@ng-bootstrap/ng-bootstrap' +import { ToastrModule } from 'ngx-toastr' +import TerminusCoreModule, { ToolbarButtonProvider, ConfigProvider, TabRecoveryProvider, HotkeyProvider } from 'terminus-core' +import { SettingsTabProvider } from 'terminus-settings' +import TerminusTerminalModule from 'terminus-terminal' + +import { EditConnectionModalComponent } from './components/editConnectionModal.component' +import { SerialModalComponent } from './components/serialModal.component' +import { SerialSettingsTabComponent } from './components/serialSettingsTab.component' +import { SerialTabComponent } from './components/serialTab.component' + +import { ButtonProvider } from './buttonProvider' +import { SerialConfigProvider } from './config' +import { SerialSettingsTabProvider } from './settings' +import { RecoveryProvider } from './recoveryProvider' +import { SerialHotkeyProvider } from './hotkeys' + +/** @hidden */ +@NgModule({ + imports: [ + NgbModule, + CommonModule, + FormsModule, + ToastrModule, + TerminusCoreModule, + TerminusTerminalModule, + ], + providers: [ + { provide: ToolbarButtonProvider, useClass: ButtonProvider, multi: true }, + { provide: ConfigProvider, useClass: SerialConfigProvider, multi: true }, + { provide: SettingsTabProvider, useClass: SerialSettingsTabProvider, multi: true }, + { provide: TabRecoveryProvider, useClass: RecoveryProvider, multi: true }, + { provide: HotkeyProvider, useClass: SerialHotkeyProvider, multi: true }, + ], + entryComponents: [ + EditConnectionModalComponent, + SerialModalComponent, + SerialSettingsTabComponent, + SerialTabComponent, + ], + declarations: [ + EditConnectionModalComponent, + SerialModalComponent, + SerialSettingsTabComponent, + SerialTabComponent, + ], +}) +export default class SerialModule { } // eslint-disable-line @typescript-eslint/no-extraneous-class diff --git a/terminus-serial/src/recoveryProvider.ts b/terminus-serial/src/recoveryProvider.ts new file mode 100644 index 00000000..2062cc97 --- /dev/null +++ b/terminus-serial/src/recoveryProvider.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@angular/core' +import { TabRecoveryProvider, RecoveredTab } from 'terminus-core' + +import { SerialTabComponent } from './components/serialTab.component' + +/** @hidden */ +@Injectable() +export class RecoveryProvider extends TabRecoveryProvider { + async recover (recoveryToken: any): Promise { + if (recoveryToken && recoveryToken.type === 'app:serial-tab') { + return { + type: SerialTabComponent, + options: { + connection: recoveryToken.connection, + savedState: recoveryToken.savedState, + }, + } + } + return null + } +} diff --git a/terminus-serial/src/services/serial.service.ts b/terminus-serial/src/services/serial.service.ts new file mode 100644 index 00000000..41e4ff77 --- /dev/null +++ b/terminus-serial/src/services/serial.service.ts @@ -0,0 +1,68 @@ +import { Injectable, NgZone } from '@angular/core' +const SerialPort = require('serialport') +import { ToastrService } from 'ngx-toastr' +import { AppService, LogService } from 'terminus-core' +import { SerialConnection, SerialSession } from '../api' +import { SerialTabComponent } from '../components/serialTab.component' + +@Injectable({ providedIn: 'root' }) +export class SerialService { + + private constructor ( + private log: LogService, + private app: AppService, + private zone: NgZone, + private toastr: ToastrService, + ) { + + } + + async openTab (connection: SerialConnection): Promise { + const tab = this.zone.run(() => this.app.openNewTab( + SerialTabComponent, + { connection } + ) as SerialTabComponent) + if (connection.color) { + (this.app.getParentTab(tab) || tab).color = connection.color + } + return tab + } + + createSession (connection: SerialConnection): SerialSession { + const session = new SerialSession(connection) + session.logger = this.log.create(`serial-${connection.port}`) + return session + } + + async connectSession (session: SerialSession, logCallback?: (s: any) => void): Promise { + const serial = new SerialPort(session.connection.port, { autoOpen: false, baudRate: session.connection.baudrate, + dataBits: session.connection.databits, stopBits: session.connection.stopbits, parity: session.connection.parity, + rtscts: session.connection.rtscts, xon: session.connection.xon, xoff: session.connection.xoff, + xany: session.connection.xany }) + session.serial = serial + let connected = false + await new Promise(async (resolve, reject) => { + serial.on('open', () => { + connected = true + this.zone.run(resolve) + }) + serial.on('error', error => { + this.zone.run(() => { + if (connected) { + this.toastr.error(error.toString()) + } else { + reject(error) + } + }) + }) + + try { + serial.open() + } catch (e) { + this.toastr.error(e.message) + reject(e) + } + + }) + } +} diff --git a/terminus-serial/src/settings.ts b/terminus-serial/src/settings.ts new file mode 100644 index 00000000..aa6623e3 --- /dev/null +++ b/terminus-serial/src/settings.ts @@ -0,0 +1,16 @@ +import { Injectable } from '@angular/core' +import { SettingsTabProvider } from 'terminus-settings' + +import { SerialSettingsTabComponent } from './components/serialSettingsTab.component' + +/** @hidden */ +@Injectable() +export class SerialSettingsTabProvider extends SettingsTabProvider { + id = 'serial' + icon = 'keyboard' + title = 'Serial' + + getComponentType (): any { + return SerialSettingsTabComponent + } +} diff --git a/terminus-serial/tsconfig.json b/terminus-serial/tsconfig.json new file mode 100644 index 00000000..a863b98a --- /dev/null +++ b/terminus-serial/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig.json", + "exclude": ["node_modules", "dist", "typings"], + "compilerOptions": { + "baseUrl": "src" + } +} diff --git a/terminus-serial/tsconfig.typings.json b/terminus-serial/tsconfig.typings.json new file mode 100644 index 00000000..95da756c --- /dev/null +++ b/terminus-serial/tsconfig.typings.json @@ -0,0 +1,15 @@ +{ + "extends": "../tsconfig.json", + "exclude": ["node_modules", "dist", "typings"], + "include": ["src"], + "compilerOptions": { + "baseUrl": "src", + "emitDeclarationOnly": true, + "declaration": true, + "declarationDir": "./typings", + "paths": { + "terminus-*": ["../../terminus-*"], + "*": ["../../app/node_modules/*"] + } + } +} diff --git a/terminus-serial/webpack.config.js b/terminus-serial/webpack.config.js new file mode 100644 index 00000000..334e57fb --- /dev/null +++ b/terminus-serial/webpack.config.js @@ -0,0 +1,59 @@ +const path = require('path') + +module.exports = { + target: 'node', + entry: 'src/index.ts', + context: __dirname, + devtool: 'source-map', + output: { + path: path.resolve(__dirname, 'dist'), + filename: 'index.js', + pathinfo: true, + libraryTarget: 'umd', + devtoolModuleFilenameTemplate: 'webpack-terminus-serial:///[resource-path]', + }, + mode: process.env.TERMINUS_DEV ? 'development' : 'production', + optimization:{ + minimize: false, + }, + resolve: { + modules: ['.', 'src', 'node_modules', '../app/node_modules'].map(x => path.join(__dirname, x)), + extensions: ['.ts', '.js', '.node'], + }, + module: { + rules: [ + { + test: /\.ts$/, + use: { + loader: 'awesome-typescript-loader', + options: { + configFileName: path.resolve(__dirname, 'tsconfig.json'), + typeRoots: [ + path.resolve(__dirname, 'node_modules/@types'), + path.resolve(__dirname, '../node_modules/@types'), + ], + paths: { + "terminus-*": [path.resolve(__dirname, '../terminus-*')], + "*": [path.resolve(__dirname, '../app/node_modules/*')], + }, + }, + }, + }, + { test: /\.pug$/, use: ['apply-loader', 'pug-loader'] }, + { test: /\.scss$/, use: ['to-string-loader', 'css-loader', 'sass-loader'] }, + { test: /\.svg/, use: ['svg-inline-loader'] }, + ], + }, + externals: [ + 'fs', + 'keytar', + 'path', + 'serialport', + 'ngx-toastr', + 'windows-process-tree/build/Release/windows_process_tree.node', + /^rxjs/, + /^@angular/, + /^@ng-bootstrap/, + /^terminus-/, + ], +} diff --git a/terminus-serial/yarn.lock b/terminus-serial/yarn.lock new file mode 100644 index 00000000..5287f6b7 --- /dev/null +++ b/terminus-serial/yarn.lock @@ -0,0 +1,1375 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@serialport/binding-abstract@^8.0.6": + version "8.0.6" + resolved "https://registry.yarnpkg.com/@serialport/binding-abstract/-/binding-abstract-8.0.6.tgz#78e6d7995a95c46d480445303e6f32ca4d53edcd" + integrity sha512-1swwUVoRyQ9ubxrkJ8JPppykohUpTAP4jkGr36e9NjbVocSPfqeX6tFZFwl/IdUlwJwxGdbKDqq7FvXniCQUMw== + dependencies: + debug "^4.1.1" + +"@serialport/binding-mock@^8.0.6": + version "8.0.6" + resolved "https://registry.yarnpkg.com/@serialport/binding-mock/-/binding-mock-8.0.6.tgz#41a8f827269c6a0e58546513a274e12023134155" + integrity sha512-BIbY5/PsDDo0QWDNCCxDgpowAdks+aZR8BOsEtK2GoASTTcJCy1fBwPIfH870o7rnbH901wY3C+yuTfdOvSO9A== + dependencies: + "@serialport/binding-abstract" "^8.0.6" + debug "^4.1.1" + +"@serialport/bindings@^8.0.7": + version "8.0.7" + resolved "https://registry.yarnpkg.com/@serialport/bindings/-/bindings-8.0.7.tgz#2a58f60f1e24ee4549be6f9e0e37b3359d038a1c" + integrity sha512-IqudDL8ne2Y2S0W5fKA6wdgHCIA2e2OIaPVYhGy6duE6legNHFY+05CLicHAyAeTocXmHU7rVNxzVQrOG5tM4g== + dependencies: + "@serialport/binding-abstract" "^8.0.6" + "@serialport/parser-readline" "^8.0.6" + bindings "^1.5.0" + debug "^4.1.1" + nan "^2.14.0" + prebuild-install "^5.3.0" + +"@serialport/parser-byte-length@^8.0.6": + version "8.0.6" + resolved "https://registry.yarnpkg.com/@serialport/parser-byte-length/-/parser-byte-length-8.0.6.tgz#efb6195692b1088e6c095fd43bae196fc30674d0" + integrity sha512-92mrFxFEvq3gRvSM7ANK/jfbmHslz91a5oYJy/nbSn4H/MCRXjxR2YOkQgVXuN+zLt+iyDoW3pcOP4Sc1nWdqQ== + +"@serialport/parser-cctalk@^8.0.6": + version "8.0.6" + resolved "https://registry.yarnpkg.com/@serialport/parser-cctalk/-/parser-cctalk-8.0.6.tgz#4134a3c479d465df3b152a21e16b8ecf1bc818c3" + integrity sha512-pqtCYQPgxnxHygiXUPCfgX7sEx+fdR/ObjpscidynEULUq2fFrC5kBkrxRbTfHRtTaU2ii9DyjFq0JVRCbhI0Q== + +"@serialport/parser-delimiter@^8.0.6": + version "8.0.6" + resolved "https://registry.yarnpkg.com/@serialport/parser-delimiter/-/parser-delimiter-8.0.6.tgz#0e467cb07a40bd3006835c48e488666bd7de22cc" + integrity sha512-ogKOcPisPMlVtirkuDu3SFTF0+xT0ijxoH7XjpZiYL41EVi367MwuCnEmXG+dEKKnF0j9EPqOyD2LGSJxaFmhQ== + +"@serialport/parser-readline@^8.0.6": + version "8.0.6" + resolved "https://registry.yarnpkg.com/@serialport/parser-readline/-/parser-readline-8.0.6.tgz#8a6a296a1bec08a4855bf7a62bc6335d52972e4a" + integrity sha512-OYBT2mpczh9QUI3MTw8j0A0tIlPVjpVipvuVnjRkYwxrxPeq04RaLFhaDpuRzua5rTKMt89c1y3btYeoDXMjAA== + dependencies: + "@serialport/parser-delimiter" "^8.0.6" + +"@serialport/parser-ready@^8.0.6": + version "8.0.6" + resolved "https://registry.yarnpkg.com/@serialport/parser-ready/-/parser-ready-8.0.6.tgz#d6e95e53ee70d298ae0b4147995007f4ba62651c" + integrity sha512-xcEqv4rc119WR5JzAuu8UeJOlAwET2PTdNb6aIrrLlmTxhvuBbuRFcsnF3BpH9jUL30Kh7a6QiNXIwVG+WR/1Q== + +"@serialport/parser-regex@^8.0.6": + version "8.0.6" + resolved "https://registry.yarnpkg.com/@serialport/parser-regex/-/parser-regex-8.0.6.tgz#70aa1abe31899d1b986f44cfb6777a76e26755bf" + integrity sha512-J8KY75Azz5ZyExmyM5YfUxbXOWBkZCytKgCCmZ966ttwZS0bUZOuoCaZj2Zp4VILJAiLuxHoqc0foi67Fri5+g== + +"@serialport/stream@^8.0.6": + version "8.0.6" + resolved "https://registry.yarnpkg.com/@serialport/stream/-/stream-8.0.6.tgz#3395dbac788c00797c2435c61c2ecb4e99fbf41d" + integrity sha512-ym1PwM0rwLrj90vRBB66I1hwMXbuMw9wGTxqns75U3N/tuNFOH85mxXaYVF2TpI66aM849NoI1jMm50fl9equg== + dependencies: + debug "^4.1.1" + +"@types/node@*": + version "13.7.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.7.4.tgz#76c3cb3a12909510f52e5dc04a6298cdf9504ffd" + integrity sha512-oVeL12C6gQS/GAExndigSaLxTrKpQPxewx9bOcwfvJiJge4rr7wNaph4J+ns5hrmIV2as5qxqN8YKthn9qh0jw== + +"@types/node@12.7.3": + version "12.7.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.3.tgz#27b3f40addaf2f580459fdb405222685542f907a" + integrity sha512-3SiLAIBkDWDg6vFo0+5YJyHPWU9uwu40Qe+v+0MH8wRKYBimHvvAOyk3EzMrD/TrIlLYfXrqDqrg913PynrMJQ== + +"@types/ssh2-streams@*": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@types/ssh2-streams/-/ssh2-streams-0.1.6.tgz#1ff5b1fe50c15f282efe9fd092c68494f8702bc2" + integrity sha512-NB+SYftagfHTDPdgVyvSZCeg5MURyHECd/PycGIW9hwhnEbTFxIdDbFtf3jxUO3rRnfr0lfdtkZFiv28T1cAsg== + dependencies: + "@types/node" "*" + +"@types/ssh2@^0.5.35": + version "0.5.40" + resolved "https://registry.yarnpkg.com/@types/ssh2/-/ssh2-0.5.40.tgz#b65465897f40c67e66e630b1f059f13a1ea7f1fa" + integrity sha512-Yrs2vFIirdscR+xY4leiUosHTClRbVBiFLlm5gA0JMZMjbCulHKO3qcgMqATElrquiZal5sSHoXMk4t8DzDawA== + dependencies: + "@types/node" "*" + "@types/ssh2-streams" "*" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +ajv@^6.5.5: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" + integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.0.tgz#3611ec00579fd18561754360b21e9f784500ff88" + integrity sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A== + dependencies: + readable-stream "^3.0.1" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^2.0.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-spinner@^0.2.10: + version "0.2.10" + resolved "https://registry.yarnpkg.com/cli-spinner/-/cli-spinner-0.2.10.tgz#f7d617a36f5c47a7bc6353c697fc9338ff782a47" + integrity sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q== + +cli-spinners@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.2.0.tgz#e8b988d9206c692302d8ee834e7a85c0144d8f77" + integrity sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ== + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +colors@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +debug@^2.5.1: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decompress-response@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" + integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== + dependencies: + mimic-response "^2.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +electron-rebuild@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/electron-rebuild/-/electron-rebuild-1.10.0.tgz#06d72f70879e67af8d30b5c0ecfe8aadaba06602" + integrity sha512-n10i30GJg7JH8yZL3ZY3x80YtKmSYuuN8cl+3Feljm+sQDU4rUW1jbnYGu0eUHlK3kPOiNWPtW7srGcwZ9p1zQ== + dependencies: + colors "^1.3.3" + debug "^4.1.1" + detect-libc "^1.0.3" + fs-extra "^8.1.0" + node-abi "^2.11.0" + node-gyp "^6.0.1" + ora "^3.4.0" + spawn-rx "^3.0.0" + yargs "^14.2.0" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +env-paths@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" + integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== + +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" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= + +glob@^7.1.3, glob@^7.1.4: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= + +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +mime-db@1.43.0: + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-response@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" + integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nan@^2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +napi-build-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.1.tgz#1381a0f92c39d66bf19852e7873432fc2123e508" + integrity sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA== + +node-abi@^2.11.0, node-abi@^2.7.0: + version "2.15.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.15.0.tgz#51d55cc711bd9e4a24a572ace13b9231945ccb10" + integrity sha512-FeLpTS0F39U7hHZU1srAK4Vx+5AHNVOTP+hxBNQknR/54laTHSFIJkDWDqiquY1LeLUgTfPN7sLPhMubx0PLAg== + dependencies: + semver "^5.4.1" + +node-gyp@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-6.1.0.tgz#64e31c61a4695ad304c1d5b82cf6b7c79cc79f3f" + integrity sha512-h4A2zDlOujeeaaTx06r4Vy+8MZ1679lU+wbCKDS4ZtvY2A37DESo37oejIw0mtmR3+rvNwts5B6Kpt1KrNYdNw== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.1.2" + request "^2.88.0" + rimraf "^2.6.3" + semver "^5.7.1" + tar "^4.4.12" + which "^1.3.1" + +noop-logger@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" + integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +npmlog@^4.0.1, npmlog@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +ora@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== + dependencies: + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-spinners "^2.0.0" + log-symbols "^2.2.0" + strip-ansi "^5.2.0" + wcwidth "^1.0.1" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-limit@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +prebuild-install@^5.3.0: + version "5.3.3" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.3.tgz#ef4052baac60d465f5ba6bf003c9c1de79b9da8e" + integrity sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g== + dependencies: + detect-libc "^1.0.3" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.0" + mkdirp "^0.5.1" + napi-build-utils "^1.0.1" + node-abi "^2.7.0" + noop-logger "^0.1.1" + npmlog "^4.0.1" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^3.0.3" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + which-pm-runs "^1.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +psl@^1.1.28: + version "1.7.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" + integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^2.0.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.1, readable-stream@^3.1.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +request@^2.88.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rxjs@^6.3.1: + version "6.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" + integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^5.4.1, semver@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +serialport@^8.0.0: + version "8.0.7" + resolved "https://registry.yarnpkg.com/serialport/-/serialport-8.0.7.tgz#9f28b1b7c47333a0962f5505a1c3feb1d90f89a9" + integrity sha512-R9bfNebs2dblYf5sD/Aaa7j8+siP4X7TGT02lqHM9DF5fyjlrPGXmsLw9+LKOz1AvjGjkxf2NzBVnDpqRX7clQ== + dependencies: + "@serialport/binding-mock" "^8.0.6" + "@serialport/bindings" "^8.0.7" + "@serialport/parser-byte-length" "^8.0.6" + "@serialport/parser-cctalk" "^8.0.6" + "@serialport/parser-delimiter" "^8.0.6" + "@serialport/parser-readline" "^8.0.6" + "@serialport/parser-ready" "^8.0.6" + "@serialport/parser-regex" "^8.0.6" + "@serialport/stream" "^8.0.6" + debug "^4.1.1" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +simple-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" + integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= + +simple-get@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" + integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== + dependencies: + decompress-response "^4.2.0" + once "^1.3.1" + simple-concat "^1.0.0" + +spawn-rx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spawn-rx/-/spawn-rx-3.0.0.tgz#1d33511e13ec26337da51d78630e08beb57a6767" + integrity sha512-dw4Ryg/KMNfkKa5ezAR5aZe9wNwPdKlnHEXtHOjVnyEDSPQyOpIPPRtcIiu7127SmtHhaCjw21yC43HliW0iIg== + dependencies: + debug "^2.5.1" + lodash.assign "^4.2.0" + rxjs "^6.3.1" + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +tar-fs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.0.0.tgz#677700fc0c8b337a78bee3623fdc235f21d7afad" + integrity sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA== + dependencies: + chownr "^1.1.1" + mkdirp "^0.5.1" + pump "^3.0.0" + tar-stream "^2.0.0" + +tar-stream@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.0.tgz#d1aaa3661f05b38b5acc9b7020efdca5179a2cc3" + integrity sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw== + dependencies: + bl "^3.0.0" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar@^4.4.12: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.8.6" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + +terminus-terminal@^1.0.98-nightly.0: + version "1.0.98-nightly.0" + resolved "https://registry.yarnpkg.com/terminus-terminal/-/terminus-terminal-1.0.98-nightly.0.tgz#10df71b0a81adf76a076fb21a91c859dd2f8bef7" + integrity sha512-JLxkeoQkORcfe6cRW6BJF5ZPSbvKA8IWUAb7fzBONVmNfRKj2Mq/uYPy76UXsdmb9F1n+rYIg+DShNp57asMKA== + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tslib@^1.9.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.0.tgz#f1f3528301621a53220d58373ae510ff747a66bc" + integrity sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which-pm-runs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" + integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= + +which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^3.0.0, yallist@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.0.tgz#cdd7a97490ec836195f59f3f4dbe5ea9e8f75f08" + integrity sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^14.2.0: + version "14.2.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.2.tgz#2769564379009ff8597cdd38fba09da9b493c4b5" + integrity sha512-/4ld+4VV5RnrynMhPZJ/ZpOCGSCeghMykZ3BhdFBDa9Wy/RH6uEGNWDJog+aUlq+9OM1CFTgtYRW5Is1Po9NOA== + dependencies: + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^15.0.0" diff --git a/terminus-ssh/src/components/sshTab.component.ts b/terminus-ssh/src/components/sshTab.component.ts index b5d94fb3..b6b23a3e 100644 --- a/terminus-ssh/src/components/sshTab.component.ts +++ b/terminus-ssh/src/components/sshTab.component.ts @@ -7,7 +7,7 @@ import { BaseTerminalTabComponent } from 'terminus-terminal' import { SSHService } from '../services/ssh.service' import { SSHConnection, SSHSession } from '../api' import { SSHPortForwardingModalComponent } from './sshPortForwardingModal.component' -import {Subscription} from "rxjs"; +import { Subscription } from 'rxjs'; /** @hidden */ @Component({ diff --git a/webpack.config.js b/webpack.config.js index 06e8aa05..28bfce33 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -7,4 +7,5 @@ module.exports = [ require('./terminus-community-color-schemes/webpack.config.js'), require('./terminus-plugin-manager/webpack.config.js'), require('./terminus-ssh/webpack.config.js'), + require('./terminus-serial/webpack.config.js'), ]