mirror of
https://github.com/Eugeny/tabby.git
synced 2025-09-07 00:51:50 +00:00
Compare commits
18 Commits
v1.0.0-alp
...
v1.0.0-alp
Author | SHA1 | Date | |
---|---|---|---|
![]() |
12d1fb9334 | ||
![]() |
ab6d5e851b | ||
![]() |
952e8461e6 | ||
![]() |
702d29b5b4 | ||
![]() |
64fc36df51 | ||
![]() |
8cfaf9082b | ||
![]() |
8269a8e01b | ||
![]() |
7fcf632378 | ||
![]() |
2e6acd2fa1 | ||
![]() |
50ab4fc37e | ||
![]() |
4426d4827f | ||
![]() |
215ddf0eec | ||
![]() |
146de1a2c0 | ||
![]() |
a39eb31379 | ||
![]() |
5831e87f68 | ||
![]() |
f250756254 | ||
![]() |
6a821fa6cf | ||
![]() |
9f204eddb4 |
@@ -1,6 +1,6 @@
|
|||||||
import { app, ipcMain, Menu, Tray, shell } from 'electron'
|
import { app, ipcMain, Menu, Tray, shell } from 'electron'
|
||||||
import { loadConfig } from './config'
|
import { loadConfig } from './config'
|
||||||
import { Window } from './window'
|
import { Window, WindowOptions } from './window'
|
||||||
|
|
||||||
export class Application {
|
export class Application {
|
||||||
private tray: Tray
|
private tray: Tray
|
||||||
@@ -20,8 +20,8 @@ export class Application {
|
|||||||
app.commandLine.appendSwitch('disable-http-cache')
|
app.commandLine.appendSwitch('disable-http-cache')
|
||||||
}
|
}
|
||||||
|
|
||||||
async newWindow (): Promise<Window> {
|
async newWindow (options?: WindowOptions): Promise<Window> {
|
||||||
let window = new Window()
|
let window = new Window(options)
|
||||||
this.windows.push(window)
|
this.windows.push(window)
|
||||||
window.visible$.subscribe(visible => {
|
window.visible$.subscribe(visible => {
|
||||||
if (visible) {
|
if (visible) {
|
||||||
|
@@ -28,6 +28,10 @@ export function parseArgs (argv, cwd) {
|
|||||||
describe: 'Show DevTools on start',
|
describe: 'Show DevTools on start',
|
||||||
type: 'boolean'
|
type: 'boolean'
|
||||||
})
|
})
|
||||||
|
.option('hidden', {
|
||||||
|
describe: 'Start minimized',
|
||||||
|
type: 'boolean'
|
||||||
|
})
|
||||||
.option('version', {
|
.option('version', {
|
||||||
alias: 'v',
|
alias: 'v',
|
||||||
describe: 'Show version and exit',
|
describe: 'Show version and exit',
|
||||||
|
@@ -59,5 +59,5 @@ app.on('ready', () => {
|
|||||||
}
|
}
|
||||||
]))
|
]))
|
||||||
}
|
}
|
||||||
application.newWindow()
|
application.newWindow({ hidden: argv.hidden })
|
||||||
})
|
})
|
||||||
|
@@ -14,6 +14,10 @@ if (process.platform === 'win32') {
|
|||||||
DwmEnableBlurBehindWindow = require('windows-blurbehind').DwmEnableBlurBehindWindow
|
DwmEnableBlurBehindWindow = require('windows-blurbehind').DwmEnableBlurBehindWindow
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface WindowOptions {
|
||||||
|
hidden?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
export class Window {
|
export class Window {
|
||||||
ready: Promise<void>
|
ready: Promise<void>
|
||||||
private visible = new Subject<boolean>()
|
private visible = new Subject<boolean>()
|
||||||
@@ -23,14 +27,16 @@ export class Window {
|
|||||||
|
|
||||||
get visible$ (): Observable<boolean> { return this.visible }
|
get visible$ (): Observable<boolean> { return this.visible }
|
||||||
|
|
||||||
constructor () {
|
constructor (options?: WindowOptions) {
|
||||||
let configData = loadConfig()
|
let configData = loadConfig()
|
||||||
|
|
||||||
|
options = options || {}
|
||||||
|
|
||||||
this.windowConfig = new ElectronConfig({ name: 'window' })
|
this.windowConfig = new ElectronConfig({ name: 'window' })
|
||||||
this.windowBounds = this.windowConfig.get('windowBoundaries')
|
this.windowBounds = this.windowConfig.get('windowBoundaries')
|
||||||
|
|
||||||
let maximized = this.windowConfig.get('maximized')
|
let maximized = this.windowConfig.get('maximized')
|
||||||
let options: Electron.BrowserWindowConstructorOptions = {
|
let bwOptions: Electron.BrowserWindowConstructorOptions = {
|
||||||
width: 800,
|
width: 800,
|
||||||
height: 600,
|
height: 600,
|
||||||
title: 'Terminus',
|
title: 'Terminus',
|
||||||
@@ -41,33 +47,36 @@ export class Window {
|
|||||||
show: false,
|
show: false,
|
||||||
backgroundColor: '#00000000'
|
backgroundColor: '#00000000'
|
||||||
}
|
}
|
||||||
Object.assign(options, this.windowBounds)
|
Object.assign(bwOptions, this.windowBounds)
|
||||||
|
|
||||||
if ((configData.appearance || {}).frame === 'native') {
|
if ((configData.appearance || {}).frame === 'native') {
|
||||||
options.frame = true
|
bwOptions.frame = true
|
||||||
} else {
|
} else {
|
||||||
if (process.platform === 'darwin') {
|
if (process.platform === 'darwin') {
|
||||||
options.titleBarStyle = 'hiddenInset'
|
bwOptions.titleBarStyle = 'hiddenInset'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (process.platform === 'linux') {
|
if (process.platform === 'linux') {
|
||||||
options.backgroundColor = '#131d27'
|
bwOptions.backgroundColor = '#131d27'
|
||||||
}
|
}
|
||||||
|
|
||||||
this.window = new BrowserWindow(options)
|
this.window = new BrowserWindow(bwOptions)
|
||||||
this.window.once('ready-to-show', () => {
|
this.window.once('ready-to-show', () => {
|
||||||
if (process.platform === 'darwin') {
|
if (process.platform === 'darwin') {
|
||||||
this.window.setVibrancy('dark')
|
this.window.setVibrancy('dark')
|
||||||
} else if (process.platform === 'win32' && (configData.appearance || {}).vibrancy) {
|
} else if (process.platform === 'win32' && (configData.appearance || {}).vibrancy) {
|
||||||
this.setVibrancy(true)
|
this.setVibrancy(true)
|
||||||
}
|
}
|
||||||
if (maximized) {
|
|
||||||
this.window.maximize()
|
if (!options.hidden) {
|
||||||
} else {
|
if (maximized) {
|
||||||
this.window.show()
|
this.window.maximize()
|
||||||
|
} else {
|
||||||
|
this.window.show()
|
||||||
|
}
|
||||||
|
this.window.focus()
|
||||||
}
|
}
|
||||||
this.window.focus()
|
|
||||||
})
|
})
|
||||||
this.window.loadURL(`file://${app.getAppPath()}/dist/index.html?${this.window.id}`, { extraHeaders: 'pragma: no-cache\n' })
|
this.window.loadURL(`file://${app.getAppPath()}/dist/index.html?${this.window.id}`, { extraHeaders: 'pragma: no-cache\n' })
|
||||||
|
|
||||||
@@ -224,6 +233,17 @@ export class Window {
|
|||||||
this.window.setTitle(title)
|
this.window.setTitle(title)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
ipcMain.on('window-bring-to-front', event => {
|
||||||
|
if (event.sender !== this.window.webContents) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (this.window.isMinimized()) {
|
||||||
|
this.window.restore()
|
||||||
|
}
|
||||||
|
this.window.show()
|
||||||
|
this.window.moveTop()
|
||||||
|
})
|
||||||
|
|
||||||
this.window.webContents.on('new-window', event => event.preventDefault())
|
this.window.webContents.on('new-window', event => event.preventDefault())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -13,7 +13,7 @@
|
|||||||
"core-js": "2.4.1",
|
"core-js": "2.4.1",
|
||||||
"cross-env": "4.0.0",
|
"cross-env": "4.0.0",
|
||||||
"css-loader": "0.28.0",
|
"css-loader": "0.28.0",
|
||||||
"electron": "3.0.5",
|
"electron": "3.0.8",
|
||||||
"electron-builder": "^20.27.1",
|
"electron-builder": "^20.27.1",
|
||||||
"electron-builder-squirrel-windows": "^20.28.3",
|
"electron-builder-squirrel-windows": "^20.28.3",
|
||||||
"electron-installer-snap": "^3.0.0",
|
"electron-installer-snap": "^3.0.0",
|
||||||
|
@@ -20,5 +20,4 @@ exports.bundledModules = [
|
|||||||
'@angular',
|
'@angular',
|
||||||
'@ng-bootstrap',
|
'@ng-bootstrap',
|
||||||
]
|
]
|
||||||
exports.nativeModules = ['node-pty-tmp', 'font-manager', 'xkeychain', 'electron-vibrancy']
|
|
||||||
exports.electronVersion = pkgInfo.devDependencies.electron
|
exports.electronVersion = pkgInfo.devDependencies.electron
|
||||||
|
@@ -122,7 +122,7 @@ export class AppRootComponent {
|
|||||||
})
|
})
|
||||||
|
|
||||||
this.hostApp.secondInstance$.subscribe(() => {
|
this.hostApp.secondInstance$.subscribe(() => {
|
||||||
this.onGlobalHotkey()
|
this.presentWindow()
|
||||||
})
|
})
|
||||||
this.hotkeys.globalHotkey.subscribe(() => {
|
this.hotkeys.globalHotkey.subscribe(() => {
|
||||||
this.onGlobalHotkey()
|
this.onGlobalHotkey()
|
||||||
@@ -141,14 +141,19 @@ export class AppRootComponent {
|
|||||||
config.changed$.subscribe(() => this.updateVibrancy())
|
config.changed$.subscribe(() => this.updateVibrancy())
|
||||||
this.updateVibrancy()
|
this.updateVibrancy()
|
||||||
|
|
||||||
|
let lastProgress = null
|
||||||
this.app.tabOpened$.subscribe(tab => {
|
this.app.tabOpened$.subscribe(tab => {
|
||||||
this.unsortedTabs.push(tab)
|
this.unsortedTabs.push(tab)
|
||||||
tab.progress$.subscribe(progress => {
|
tab.progress$.subscribe(progress => {
|
||||||
|
if (lastProgress === progress) {
|
||||||
|
return
|
||||||
|
}
|
||||||
if (progress !== null) {
|
if (progress !== null) {
|
||||||
this.hostApp.getWindow().setProgressBar(progress / 100.0, { mode: 'normal' })
|
this.hostApp.getWindow().setProgressBar(progress / 100.0, { mode: 'normal' })
|
||||||
} else {
|
} else {
|
||||||
this.hostApp.getWindow().setProgressBar(-1, { mode: 'none' })
|
this.hostApp.getWindow().setProgressBar(-1, { mode: 'none' })
|
||||||
}
|
}
|
||||||
|
lastProgress = progress
|
||||||
})
|
})
|
||||||
this.noTabs = false
|
this.noTabs = false
|
||||||
})
|
})
|
||||||
@@ -161,28 +166,35 @@ export class AppRootComponent {
|
|||||||
|
|
||||||
onGlobalHotkey () {
|
onGlobalHotkey () {
|
||||||
if (this.hostApp.getWindow().isFocused()) {
|
if (this.hostApp.getWindow().isFocused()) {
|
||||||
// focused
|
this.hideWindow()
|
||||||
this.electron.loseFocus()
|
} else {
|
||||||
this.hostApp.getWindow().blur()
|
this.presentWindow()
|
||||||
if (this.hostApp.platform !== Platform.macOS) {
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
presentWindow () {
|
||||||
|
if (!this.hostApp.getWindow().isVisible()) {
|
||||||
|
// unfocused, invisible
|
||||||
|
this.hostApp.getWindow().show()
|
||||||
|
this.hostApp.getWindow().focus()
|
||||||
|
} else {
|
||||||
|
if (this.config.store.appearance.dock === 'off') {
|
||||||
|
// not docked, visible
|
||||||
|
setTimeout(() => {
|
||||||
|
this.hostApp.getWindow().focus()
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
// docked, visible
|
||||||
this.hostApp.getWindow().hide()
|
this.hostApp.getWindow().hide()
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
if (!this.hostApp.getWindow().isVisible()) {
|
}
|
||||||
// unfocused, invisible
|
|
||||||
this.hostApp.getWindow().show()
|
hideWindow () {
|
||||||
this.hostApp.getWindow().focus()
|
this.electron.loseFocus()
|
||||||
} else {
|
this.hostApp.getWindow().blur()
|
||||||
if (this.config.store.appearance.dock === 'off') {
|
if (this.hostApp.platform !== Platform.macOS) {
|
||||||
// not docked, visible
|
this.hostApp.getWindow().hide()
|
||||||
setTimeout(() => {
|
|
||||||
this.hostApp.getWindow().focus()
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
// docked, visible
|
|
||||||
this.hostApp.getWindow().hide()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
.modal-body
|
.modal-body
|
||||||
input.form-control(type='text', [(ngModel)]='value', (keyup.enter)='save()', autofocus)
|
input.form-control(type='text', #input, [(ngModel)]='value', (keyup.enter)='save()', autofocus)
|
||||||
|
|
||||||
.modal-footer
|
.modal-footer
|
||||||
button.btn.btn-outline-primary((click)='save()') Save
|
button.btn.btn-outline-primary((click)='save()') Save
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { Component, Input } from '@angular/core'
|
import { Component, Input, ElementRef, ViewChild } from '@angular/core'
|
||||||
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
|
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@@ -7,11 +7,18 @@ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
|
|||||||
})
|
})
|
||||||
export class RenameTabModalComponent {
|
export class RenameTabModalComponent {
|
||||||
@Input() value: string
|
@Input() value: string
|
||||||
|
@ViewChild('input') input: ElementRef
|
||||||
|
|
||||||
constructor (
|
constructor (
|
||||||
private modalInstance: NgbActiveModal
|
private modalInstance: NgbActiveModal
|
||||||
) { }
|
) { }
|
||||||
|
|
||||||
|
ngOnInit () {
|
||||||
|
setTimeout(() => {
|
||||||
|
this.input.nativeElement.focus()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
save () {
|
save () {
|
||||||
this.modalInstance.close(this.value)
|
this.modalInstance.close(this.value)
|
||||||
}
|
}
|
||||||
|
@@ -85,6 +85,8 @@ export class HostAppService {
|
|||||||
text = shellEscape([text])
|
text = shellEscape([text])
|
||||||
}
|
}
|
||||||
this.cliPaste.next(text)
|
this.cliPaste.next(text)
|
||||||
|
} else {
|
||||||
|
this.secondInstance.next()
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
|
|
||||||
@@ -180,6 +182,10 @@ export class HostAppService {
|
|||||||
this.electron.ipcRenderer.send('app:ready')
|
this.electron.ipcRenderer.send('app:ready')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bringToFront () {
|
||||||
|
this.electron.ipcRenderer.send('window-bring-to-front')
|
||||||
|
}
|
||||||
|
|
||||||
quit () {
|
quit () {
|
||||||
this.logger.info('Quitting')
|
this.logger.info('Quitting')
|
||||||
this.electron.app.quit()
|
this.electron.app.quit()
|
||||||
|
@@ -128,15 +128,18 @@ export class HotkeysService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getCurrentFullyMatchedHotkey (): string {
|
getCurrentFullyMatchedHotkey (): string {
|
||||||
for (let id in this.getHotkeysConfig()) {
|
let currentStrokes = this.getCurrentKeystrokes()
|
||||||
for (let sequence of this.getHotkeysConfig()[id]) {
|
let config = this.getHotkeysConfig()
|
||||||
let currentStrokes = this.getCurrentKeystrokes()
|
for (let id in config) {
|
||||||
|
for (let sequence of config[id]) {
|
||||||
if (currentStrokes.length < sequence.length) {
|
if (currentStrokes.length < sequence.length) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if (sequence.every((x, index) => {
|
if (sequence.every(
|
||||||
return x.toLowerCase() === currentStrokes[currentStrokes.length - sequence.length + index].toLowerCase()
|
(x, index) =>
|
||||||
})) {
|
x.toLowerCase() ===
|
||||||
|
currentStrokes[currentStrokes.length - sequence.length + index].toLowerCase()
|
||||||
|
)) {
|
||||||
return id
|
return id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -145,15 +148,17 @@ export class HotkeysService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getCurrentPartiallyMatchedHotkeys (): PartialHotkeyMatch[] {
|
getCurrentPartiallyMatchedHotkeys (): PartialHotkeyMatch[] {
|
||||||
|
let currentStrokes = this.getCurrentKeystrokes()
|
||||||
|
let config = this.getHotkeysConfig()
|
||||||
let result = []
|
let result = []
|
||||||
for (let id in this.getHotkeysConfig()) {
|
for (let id in config) {
|
||||||
for (let sequence of this.getHotkeysConfig()[id]) {
|
for (let sequence of config[id]) {
|
||||||
let currentStrokes = this.getCurrentKeystrokes()
|
|
||||||
|
|
||||||
for (let matchLength = Math.min(currentStrokes.length, sequence.length); matchLength > 0; matchLength--) {
|
for (let matchLength = Math.min(currentStrokes.length, sequence.length); matchLength > 0; matchLength--) {
|
||||||
if (sequence.slice(0, matchLength).every((x, index) => {
|
if (sequence.slice(0, matchLength).every(
|
||||||
return x.toLowerCase() === currentStrokes[currentStrokes.length - matchLength + index].toLowerCase()
|
(x, index) =>
|
||||||
})) {
|
x.toLowerCase() ===
|
||||||
|
currentStrokes[currentStrokes.length - matchLength + index].toLowerCase()
|
||||||
|
)) {
|
||||||
result.push({
|
result.push({
|
||||||
matchedLength: matchLength,
|
matchedLength: matchLength,
|
||||||
id,
|
id,
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
import { Injectable } from '@angular/core'
|
import { Injectable } from '@angular/core'
|
||||||
import { DomSanitizer } from '@angular/platform-browser'
|
import { DomSanitizer } from '@angular/platform-browser'
|
||||||
import { ToolbarButtonProvider, IToolbarButton, AppService, HostAppService } from 'terminus-core'
|
import { ToolbarButtonProvider, IToolbarButton, AppService, HostAppService, HotkeysService } from 'terminus-core'
|
||||||
|
|
||||||
import { SettingsTabComponent } from './components/settingsTab.component'
|
import { SettingsTabComponent } from './components/settingsTab.component'
|
||||||
|
|
||||||
@@ -8,11 +8,18 @@ import { SettingsTabComponent } from './components/settingsTab.component'
|
|||||||
export class ButtonProvider extends ToolbarButtonProvider {
|
export class ButtonProvider extends ToolbarButtonProvider {
|
||||||
constructor (
|
constructor (
|
||||||
hostApp: HostAppService,
|
hostApp: HostAppService,
|
||||||
|
hotkeys: HotkeysService,
|
||||||
private app: AppService,
|
private app: AppService,
|
||||||
private domSanitizer: DomSanitizer,
|
private domSanitizer: DomSanitizer,
|
||||||
) {
|
) {
|
||||||
super()
|
super()
|
||||||
hostApp.preferencesMenu$.subscribe(() => this.open())
|
hostApp.preferencesMenu$.subscribe(() => this.open())
|
||||||
|
|
||||||
|
hotkeys.matchedHotkey.subscribe(async (hotkey) => {
|
||||||
|
if (hotkey === 'settings') {
|
||||||
|
this.open()
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
provide (): IToolbarButton[] {
|
provide (): IToolbarButton[] {
|
||||||
|
@@ -61,7 +61,8 @@ ngb-tabset.vertical(type='pills', [activeId]='activeTab')
|
|||||||
|
|
||||||
.form-line(*ngIf='hostApp.platform !== Platform.Linux')
|
.form-line(*ngIf='hostApp.platform !== Platform.Linux')
|
||||||
.header
|
.header
|
||||||
.title Vibrancy
|
.title(*ngIf='hostApp.platform === Platform.Windows') Acrylic background
|
||||||
|
.title(*ngIf='hostApp.platform === Platform.macOS') Vibrancy
|
||||||
.description Gives the window a blurred transparent background
|
.description Gives the window a blurred transparent background
|
||||||
|
|
||||||
toggle(
|
toggle(
|
||||||
@@ -71,7 +72,7 @@ ngb-tabset.vertical(type='pills', [activeId]='activeTab')
|
|||||||
|
|
||||||
.form-line(*ngIf='config.store.appearance.vibrancy && isFluentVibrancySupported')
|
.form-line(*ngIf='config.store.appearance.vibrancy && isFluentVibrancySupported')
|
||||||
.header
|
.header
|
||||||
.title Vibrancy type
|
.title Background type
|
||||||
.btn-group(
|
.btn-group(
|
||||||
[(ngModel)]='config.store.appearance.vibrancyType',
|
[(ngModel)]='config.store.appearance.vibrancyType',
|
||||||
(ngModelChange)='config.save()',
|
(ngModelChange)='config.save()',
|
||||||
@@ -94,12 +95,12 @@ ngb-tabset.vertical(type='pills', [activeId]='activeTab')
|
|||||||
|
|
||||||
.form-line
|
.form-line
|
||||||
.header
|
.header
|
||||||
.title Window opacity
|
.title Transparency
|
||||||
input(
|
input(
|
||||||
type='range',
|
type='range',
|
||||||
[(ngModel)]='config.store.appearance.opacity',
|
[(ngModel)]='config.store.appearance.opacity',
|
||||||
(ngModelChange)='config.save(); (hostApp.platform === Platform.Linux && config.requestRestart())',
|
(ngModelChange)='config.save(); (hostApp.platform === Platform.Linux && config.requestRestart())',
|
||||||
min='0.05',
|
min='0.4',
|
||||||
max='1',
|
max='1',
|
||||||
step='0.01'
|
step='0.01'
|
||||||
)
|
)
|
||||||
|
22
terminus-settings/src/config.ts
Normal file
22
terminus-settings/src/config.ts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import { ConfigProvider, Platform } from 'terminus-core'
|
||||||
|
|
||||||
|
export class SettingsConfigProvider extends ConfigProvider {
|
||||||
|
defaults = { }
|
||||||
|
platformDefaults = {
|
||||||
|
[Platform.macOS]: {
|
||||||
|
hotkeys: {
|
||||||
|
settings: ['⌘-,'],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[Platform.Windows]: {
|
||||||
|
hotkeys: {
|
||||||
|
settings: ['Ctrl-,']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[Platform.Linux]: {
|
||||||
|
hotkeys: {
|
||||||
|
settings: ['Ctrl-,']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
16
terminus-settings/src/hotkeys.ts
Normal file
16
terminus-settings/src/hotkeys.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import { Injectable } from '@angular/core'
|
||||||
|
import { IHotkeyDescription, HotkeyProvider } from 'terminus-core'
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class SettingsHotkeyProvider extends HotkeyProvider {
|
||||||
|
hotkeys: IHotkeyDescription[] = [
|
||||||
|
{
|
||||||
|
id: 'settings',
|
||||||
|
name: 'Open Settings',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
async provide (): Promise<IHotkeyDescription[]> {
|
||||||
|
return this.hotkeys
|
||||||
|
}
|
||||||
|
}
|
@@ -4,7 +4,7 @@ import { FormsModule } from '@angular/forms'
|
|||||||
import { NgbModule } from '@ng-bootstrap/ng-bootstrap'
|
import { NgbModule } from '@ng-bootstrap/ng-bootstrap'
|
||||||
import { NgPipesModule } from 'ngx-pipes'
|
import { NgPipesModule } from 'ngx-pipes'
|
||||||
|
|
||||||
import { ToolbarButtonProvider, TabRecoveryProvider } from 'terminus-core'
|
import { ToolbarButtonProvider, TabRecoveryProvider, HotkeyProvider, ConfigProvider } from 'terminus-core'
|
||||||
import TerminusCorePlugin from 'terminus-core'
|
import TerminusCorePlugin from 'terminus-core'
|
||||||
|
|
||||||
import { HotkeyInputModalComponent } from './components/hotkeyInputModal.component'
|
import { HotkeyInputModalComponent } from './components/hotkeyInputModal.component'
|
||||||
@@ -14,6 +14,8 @@ import { SettingsTabBodyComponent } from './components/settingsTabBody.component
|
|||||||
|
|
||||||
import { ButtonProvider } from './buttonProvider'
|
import { ButtonProvider } from './buttonProvider'
|
||||||
import { RecoveryProvider } from './recoveryProvider'
|
import { RecoveryProvider } from './recoveryProvider'
|
||||||
|
import { SettingsHotkeyProvider } from './hotkeys'
|
||||||
|
import { SettingsConfigProvider } from './config'
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [
|
imports: [
|
||||||
@@ -25,7 +27,9 @@ import { RecoveryProvider } from './recoveryProvider'
|
|||||||
],
|
],
|
||||||
providers: [
|
providers: [
|
||||||
{ provide: ToolbarButtonProvider, useClass: ButtonProvider, multi: true },
|
{ provide: ToolbarButtonProvider, useClass: ButtonProvider, multi: true },
|
||||||
{ provide: TabRecoveryProvider, useClass: RecoveryProvider, multi: true }
|
{ provide: TabRecoveryProvider, useClass: RecoveryProvider, multi: true },
|
||||||
|
{ provide: ConfigProvider, useClass: SettingsConfigProvider, multi: true },
|
||||||
|
{ provide: HotkeyProvider, useClass: SettingsHotkeyProvider, multi: true },
|
||||||
],
|
],
|
||||||
entryComponents: [
|
entryComponents: [
|
||||||
HotkeyInputModalComponent,
|
HotkeyInputModalComponent,
|
||||||
@@ -38,8 +42,7 @@ import { RecoveryProvider } from './recoveryProvider'
|
|||||||
SettingsTabBodyComponent,
|
SettingsTabBodyComponent,
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
export default class SettingsModule {
|
export default class SettingsModule { }
|
||||||
}
|
|
||||||
|
|
||||||
export * from './api'
|
export * from './api'
|
||||||
export { SettingsTabComponent }
|
export { SettingsTabComponent }
|
||||||
|
@@ -9,11 +9,13 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
.list-group.mt-3(*ngIf='lastConnection')
|
.list-group.mt-3(*ngIf='lastConnection')
|
||||||
a.list-group-item.list-group-item-action((click)='connect(lastConnection)')
|
a.list-group-item.list-group-item-action.d-flex.align-items-center((click)='connect(lastConnection)')
|
||||||
i.fa.fa-fw.fa-history
|
i.fa.fa-fw.fa-history
|
||||||
span {{lastConnection.name}}
|
.mr-auto {{lastConnection.name}}
|
||||||
|
button.btn.btn-outline-danger.btn-sm((click)='clearLastConnection(); $event.stopPropagation()')
|
||||||
|
i.fa.fa-trash-o
|
||||||
|
|
||||||
.list-group.mt-3.connections-list
|
.list-group.mt-3.connections-list(*ngIf='childGroups.length')
|
||||||
ng-container(*ngFor='let group of childGroups')
|
ng-container(*ngFor='let group of childGroups')
|
||||||
.list-group-item.list-group-item-action.d-flex.align-items-center(
|
.list-group-item.list-group-item-action.d-flex.align-items-center(
|
||||||
(click)='groupCollapsed[group.name] = !groupCollapsed[group.name]'
|
(click)='groupCollapsed[group.name] = !groupCollapsed[group.name]'
|
||||||
|
@@ -54,6 +54,11 @@ export class SSHModalComponent {
|
|||||||
this.connect(connection)
|
this.connect(connection)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clearLastConnection () {
|
||||||
|
window.localStorage.lastConnection = null
|
||||||
|
this.lastConnection = null
|
||||||
|
}
|
||||||
|
|
||||||
connect (connection: SSHConnection) {
|
connect (connection: SSHConnection) {
|
||||||
this.close()
|
this.close()
|
||||||
this.ssh.connect(connection).catch(error => {
|
this.ssh.connect(connection).catch(error => {
|
||||||
|
@@ -11,8 +11,11 @@ module.exports = function patchPTYModule (mod) {
|
|||||||
let lastFlush = 0
|
let lastFlush = 0
|
||||||
let nextTimeout = 0
|
let nextTimeout = 0
|
||||||
|
|
||||||
const maxWindow = 250
|
// Minimum prebuffering window (ms) if the input is non-stop flowing
|
||||||
const minWindow = 50
|
const minWindow = 10
|
||||||
|
|
||||||
|
// Maximum buffering time (ms) until output must be flushed unconditionally
|
||||||
|
const maxWindow = 100
|
||||||
|
|
||||||
function flush () {
|
function flush () {
|
||||||
if (buffer) {
|
if (buffer) {
|
||||||
@@ -36,9 +39,11 @@ module.exports = function patchPTYModule (mod) {
|
|||||||
terminal.on('data', data => {
|
terminal.on('data', data => {
|
||||||
buffer += data
|
buffer += data
|
||||||
if (Date.now() - lastFlush > maxWindow) {
|
if (Date.now() - lastFlush > maxWindow) {
|
||||||
|
// Taking too much time buffering, flush to keep things interactive
|
||||||
flush()
|
flush()
|
||||||
} else {
|
} else {
|
||||||
if (Date.now() > nextTimeout - (minWindow / 10)) {
|
if (Date.now() > nextTimeout - (maxWindow / 10)) {
|
||||||
|
// Extend the window if it's expiring
|
||||||
reschedule()
|
reschedule()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -163,6 +163,7 @@ export default class TerminalModule {
|
|||||||
if (await fs.exists(directory)) {
|
if (await fs.exists(directory)) {
|
||||||
if ((await fs.stat(directory)).isDirectory()) {
|
if ((await fs.stat(directory)).isDirectory()) {
|
||||||
terminal.openTab(null, directory)
|
terminal.openTab(null, directory)
|
||||||
|
hostApp.bringToFront()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -172,10 +173,12 @@ export default class TerminalModule {
|
|||||||
command: command[0],
|
command: command[0],
|
||||||
args: command.slice(1),
|
args: command.slice(1),
|
||||||
}, null, true)
|
}, null, true)
|
||||||
|
hostApp.bringToFront()
|
||||||
})
|
})
|
||||||
hostApp.cliPaste$.subscribe(text => {
|
hostApp.cliPaste$.subscribe(text => {
|
||||||
if (app.activeTab instanceof TerminalTabComponent && app.activeTab.session) {
|
if (app.activeTab instanceof TerminalTabComponent && app.activeTab.session) {
|
||||||
(app.activeTab as TerminalTabComponent).sendInput(text)
|
(app.activeTab as TerminalTabComponent).sendInput(text)
|
||||||
|
hostApp.bringToFront()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@@ -18,9 +18,7 @@ let windowsProcessTree
|
|||||||
try {
|
try {
|
||||||
windowsProcessTree = require('windows-process-tree')
|
windowsProcessTree = require('windows-process-tree')
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e)
|
|
||||||
} // tslint:disable-line
|
} // tslint:disable-line
|
||||||
console.error(windowsProcessTree)
|
|
||||||
|
|
||||||
export interface IChildProcess {
|
export interface IChildProcess {
|
||||||
pid: number
|
pid: number
|
||||||
@@ -233,7 +231,12 @@ export class Session extends BaseSession {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
if (process.platform === 'darwin') {
|
if (process.platform === 'darwin') {
|
||||||
let lines = (await exec(`lsof -p ${this.truePID} -Fn`))[0].toString().split('\n')
|
let lines: string[]
|
||||||
|
try {
|
||||||
|
lines = (await exec(`lsof -p ${this.truePID} -Fn`))[0].toString().split('\n')
|
||||||
|
} catch (e) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
if (lines[1] === 'fcwd') {
|
if (lines[1] === 'fcwd') {
|
||||||
return lines[2].substring(1)
|
return lines[2].substring(1)
|
||||||
} else {
|
} else {
|
||||||
|
@@ -5,66 +5,81 @@
|
|||||||
"@types/async-lock@0.0.19":
|
"@types/async-lock@0.0.19":
|
||||||
version "0.0.19"
|
version "0.0.19"
|
||||||
resolved "https://registry.yarnpkg.com/@types/async-lock/-/async-lock-0.0.19.tgz#4bdb7f8d9ac2826588b98068903aedbd9d95dce8"
|
resolved "https://registry.yarnpkg.com/@types/async-lock/-/async-lock-0.0.19.tgz#4bdb7f8d9ac2826588b98068903aedbd9d95dce8"
|
||||||
|
integrity sha1-S9t/jZrCgmWIuYBokDrtvZ2V3Og=
|
||||||
|
|
||||||
"@types/deep-equal@^1.0.0":
|
"@types/deep-equal@^1.0.0":
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@types/deep-equal/-/deep-equal-1.0.1.tgz#71cfabb247c22bcc16d536111f50c0ed12476b03"
|
resolved "https://registry.yarnpkg.com/@types/deep-equal/-/deep-equal-1.0.1.tgz#71cfabb247c22bcc16d536111f50c0ed12476b03"
|
||||||
|
integrity sha512-mMUu4nWHLBlHtxXY17Fg6+ucS/MnndyOWyOe7MmwkoMYxvfQU2ajtRaEvqSUv+aVkMqH/C0NCI8UoVfRNQ10yg==
|
||||||
|
|
||||||
"@types/mz@0.0.31":
|
"@types/mz@0.0.31":
|
||||||
version "0.0.31"
|
version "0.0.31"
|
||||||
resolved "https://registry.yarnpkg.com/@types/mz/-/mz-0.0.31.tgz#a4d80c082fefe71e40a7c0f07d1e6555bbbc7b52"
|
resolved "https://registry.yarnpkg.com/@types/mz/-/mz-0.0.31.tgz#a4d80c082fefe71e40a7c0f07d1e6555bbbc7b52"
|
||||||
|
integrity sha1-pNgMCC/v5x5Ap8DwfR5lVbu8e1I=
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
|
|
||||||
"@types/node@*":
|
"@types/node@*":
|
||||||
version "10.12.0"
|
version "10.12.0"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.0.tgz#ea6dcbddbc5b584c83f06c60e82736d8fbb0c235"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.0.tgz#ea6dcbddbc5b584c83f06c60e82736d8fbb0c235"
|
||||||
|
integrity sha512-3TUHC3jsBAB7qVRGxT6lWyYo2v96BMmD2PTcl47H25Lu7UXtFH/2qqmKiVrnel6Ne//0TFYf6uvNX+HW2FRkLQ==
|
||||||
|
|
||||||
"@types/node@7.0.12":
|
"@types/node@7.0.12":
|
||||||
version "7.0.12"
|
version "7.0.12"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.12.tgz#ae5f67a19c15f752148004db07cbbb372e69efc9"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.12.tgz#ae5f67a19c15f752148004db07cbbb372e69efc9"
|
||||||
|
integrity sha1-rl9noZwV91IUgATbB8u7Ny5p78k=
|
||||||
|
|
||||||
"@types/webpack-env@1.13.0":
|
"@types/webpack-env@1.13.0":
|
||||||
version "1.13.0"
|
version "1.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.13.0.tgz#3044381647e11ee973c5af2e925323930f691d80"
|
resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.13.0.tgz#3044381647e11ee973c5af2e925323930f691d80"
|
||||||
|
integrity sha1-MEQ4FkfhHulzxa8uklMjkw9pHYA=
|
||||||
|
|
||||||
any-promise@^1.0.0:
|
any-promise@^1.0.0:
|
||||||
version "1.3.0"
|
version "1.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
|
resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
|
||||||
|
integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
|
||||||
|
|
||||||
async-lock@^1.0.0:
|
async-lock@^1.0.0:
|
||||||
version "1.1.3"
|
version "1.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/async-lock/-/async-lock-1.1.3.tgz#e47f1cbb6bec765b73e27ed8961d58006457ec08"
|
resolved "https://registry.yarnpkg.com/async-lock/-/async-lock-1.1.3.tgz#e47f1cbb6bec765b73e27ed8961d58006457ec08"
|
||||||
|
integrity sha512-nxlfFLGfCJ1r7p9zhR5OuL6jYkDd9P7FqSitfLji+C1NdyhCz4+rWW3kiPiyPASHhN7VlsKEvRWWbnME9lYngw==
|
||||||
|
|
||||||
big.js@^3.1.3:
|
big.js@^3.1.3:
|
||||||
version "3.2.0"
|
version "3.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
|
resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
|
||||||
|
integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==
|
||||||
|
|
||||||
connected-domain@^1.0.0:
|
connected-domain@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/connected-domain/-/connected-domain-1.0.0.tgz#bfe77238c74be453a79f0cb6058deeb4f2358e93"
|
resolved "https://registry.yarnpkg.com/connected-domain/-/connected-domain-1.0.0.tgz#bfe77238c74be453a79f0cb6058deeb4f2358e93"
|
||||||
|
integrity sha1-v+dyOMdL5FOnnwy2BY3utPI1jpM=
|
||||||
|
|
||||||
dataurl@0.1.0:
|
dataurl@0.1.0:
|
||||||
version "0.1.0"
|
version "0.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/dataurl/-/dataurl-0.1.0.tgz#1f4734feddec05ffe445747978d86759c4b33199"
|
resolved "https://registry.yarnpkg.com/dataurl/-/dataurl-0.1.0.tgz#1f4734feddec05ffe445747978d86759c4b33199"
|
||||||
|
integrity sha1-H0c0/t3sBf/kRXR5eNhnWcSzMZk=
|
||||||
|
|
||||||
deep-equal@1.0.1:
|
deep-equal@1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
|
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
|
||||||
|
integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=
|
||||||
|
|
||||||
emojis-list@^2.0.0:
|
emojis-list@^2.0.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
|
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
|
||||||
|
integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k=
|
||||||
|
|
||||||
file-loader@^0.11.2:
|
file-loader@^0.11.2:
|
||||||
version "0.11.2"
|
version "0.11.2"
|
||||||
resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.11.2.tgz#4ff1df28af38719a6098093b88c82c71d1794a34"
|
resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.11.2.tgz#4ff1df28af38719a6098093b88c82c71d1794a34"
|
||||||
|
integrity sha512-N+uhF3mswIFeziHQjGScJ/yHXYt3DiLBeC+9vWW+WjUBiClMSOlV1YrXQi+7KM2aA3Rn4Bybgv+uXFQbfkzpvg==
|
||||||
dependencies:
|
dependencies:
|
||||||
loader-utils "^1.0.2"
|
loader-utils "^1.0.2"
|
||||||
|
|
||||||
font-finder@^1.0.2, font-finder@^1.0.3:
|
font-finder@^1.0.2, font-finder@^1.0.3:
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/font-finder/-/font-finder-1.0.4.tgz#2ca944954dd8d0e1b5bdc4c596cc08607761d89b"
|
resolved "https://registry.yarnpkg.com/font-finder/-/font-finder-1.0.4.tgz#2ca944954dd8d0e1b5bdc4c596cc08607761d89b"
|
||||||
|
integrity sha512-naF16RpjWUTFLqzhmdivYpBCrqySN6PI+a4GPtoEsCdvOpbKYTGeTjO7mxh3Wwjz4xKU+Oqx9kwOcteLDeMFQA==
|
||||||
dependencies:
|
dependencies:
|
||||||
get-system-fonts "^2.0.0"
|
get-system-fonts "^2.0.0"
|
||||||
promise-stream-reader "^1.0.1"
|
promise-stream-reader "^1.0.1"
|
||||||
@@ -72,6 +87,7 @@ font-finder@^1.0.2, font-finder@^1.0.3:
|
|||||||
font-ligatures@^1.3.1:
|
font-ligatures@^1.3.1:
|
||||||
version "1.3.2"
|
version "1.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/font-ligatures/-/font-ligatures-1.3.2.tgz#227eb5fc38fef34b5373aa19b555320b82842a71"
|
resolved "https://registry.yarnpkg.com/font-ligatures/-/font-ligatures-1.3.2.tgz#227eb5fc38fef34b5373aa19b555320b82842a71"
|
||||||
|
integrity sha512-h9t+gvKVr/c2GnQs4GhXHY39/qyLlXNaIxupU1cxj7YOXEFT8+sJfcchIrZ9UETZUUT7dNcI7RDOXN7gFtuw2g==
|
||||||
dependencies:
|
dependencies:
|
||||||
font-finder "^1.0.3"
|
font-finder "^1.0.3"
|
||||||
lru-cache "^4.1.3"
|
lru-cache "^4.1.3"
|
||||||
@@ -80,24 +96,29 @@ font-ligatures@^1.3.1:
|
|||||||
font-manager@0.3.0:
|
font-manager@0.3.0:
|
||||||
version "0.3.0"
|
version "0.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/font-manager/-/font-manager-0.3.0.tgz#9efdc13e521a3d8752e7ab56c3938818043a311f"
|
resolved "https://registry.yarnpkg.com/font-manager/-/font-manager-0.3.0.tgz#9efdc13e521a3d8752e7ab56c3938818043a311f"
|
||||||
|
integrity sha512-6N3pzO+9kxE3yD9c4VN7reg5fqgFvjcUdxZmwauRzsExaeKRu0APfEi3DOISFakokybgKlZcLFQHawwc2TMpQQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
nan ">=2.10.0"
|
nan ">=2.10.0"
|
||||||
|
|
||||||
get-system-fonts@^2.0.0:
|
get-system-fonts@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/get-system-fonts/-/get-system-fonts-2.0.0.tgz#a43b9a33f05c0715a60176d2aad5ce6e98f0a3c6"
|
resolved "https://registry.yarnpkg.com/get-system-fonts/-/get-system-fonts-2.0.0.tgz#a43b9a33f05c0715a60176d2aad5ce6e98f0a3c6"
|
||||||
|
integrity sha512-iiM/DavyF2nnLdELzPBSHojzQJVai9WiwrRzn5gp2dutJuerC8qHyBoh4lxfVdKGbnb9eZ4p8Oefbuc3yExB7Q==
|
||||||
|
|
||||||
hterm-umdjs@1.4.1:
|
hterm-umdjs@1.4.1:
|
||||||
version "1.4.1"
|
version "1.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/hterm-umdjs/-/hterm-umdjs-1.4.1.tgz#0cd5352eaf927c70b83c36146cf2c2a281dba957"
|
resolved "https://registry.yarnpkg.com/hterm-umdjs/-/hterm-umdjs-1.4.1.tgz#0cd5352eaf927c70b83c36146cf2c2a281dba957"
|
||||||
|
integrity sha512-r5JOmdDK1bZCmp3cKcuGRLVeum33H+pzD119ZxmQou+QUVe6SAVSz03HvKWVhM2Ao1Biv+fkhFDmnsaRPq0tFg==
|
||||||
|
|
||||||
json5@^0.5.0:
|
json5@^0.5.0:
|
||||||
version "0.5.1"
|
version "0.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
|
resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
|
||||||
|
integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
|
||||||
|
|
||||||
loader-utils@^1.0.2:
|
loader-utils@^1.0.2:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
|
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
|
||||||
|
integrity sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=
|
||||||
dependencies:
|
dependencies:
|
||||||
big.js "^3.1.3"
|
big.js "^3.1.3"
|
||||||
emojis-list "^2.0.0"
|
emojis-list "^2.0.0"
|
||||||
@@ -106,6 +127,7 @@ loader-utils@^1.0.2:
|
|||||||
lru-cache@^4.1.3:
|
lru-cache@^4.1.3:
|
||||||
version "4.1.3"
|
version "4.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
|
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
|
||||||
|
integrity sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==
|
||||||
dependencies:
|
dependencies:
|
||||||
pseudomap "^1.0.2"
|
pseudomap "^1.0.2"
|
||||||
yallist "^2.1.2"
|
yallist "^2.1.2"
|
||||||
@@ -113,12 +135,14 @@ lru-cache@^4.1.3:
|
|||||||
macos-native-processlist@^1.0.0:
|
macos-native-processlist@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/macos-native-processlist/-/macos-native-processlist-1.0.0.tgz#1dcf1fac554e057f90c6451c39420e065d186a68"
|
resolved "https://registry.yarnpkg.com/macos-native-processlist/-/macos-native-processlist-1.0.0.tgz#1dcf1fac554e057f90c6451c39420e065d186a68"
|
||||||
|
integrity sha512-FYA5DzCBvt+1wcCR8iFoCW2zZ8GZXtR6Ee/kpC9gVlqvEcM2ooma71KV8EIP2VaM+v2HOQAVvNoKSmFBd4z8dQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
nan "^2.10.0"
|
nan "^2.10.0"
|
||||||
|
|
||||||
mz@^2.6.0:
|
mz@^2.6.0:
|
||||||
version "2.7.0"
|
version "2.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
|
resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
|
||||||
|
integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
any-promise "^1.0.0"
|
any-promise "^1.0.0"
|
||||||
object-assign "^4.0.1"
|
object-assign "^4.0.1"
|
||||||
@@ -127,80 +151,96 @@ mz@^2.6.0:
|
|||||||
nan@>=2.10.0, nan@^2.10.0:
|
nan@>=2.10.0, nan@^2.10.0:
|
||||||
version "2.11.1"
|
version "2.11.1"
|
||||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766"
|
resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766"
|
||||||
|
integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==
|
||||||
|
|
||||||
node-pty-tmp@0.7.2:
|
node-pty-tmp@0.7.2:
|
||||||
version "0.7.2"
|
version "0.7.2"
|
||||||
resolved "https://registry.yarnpkg.com/node-pty-tmp/-/node-pty-tmp-0.7.2.tgz#d1528245a46ab193c54e34792ee0b89d0f557417"
|
resolved "https://registry.yarnpkg.com/node-pty-tmp/-/node-pty-tmp-0.7.2.tgz#d1528245a46ab193c54e34792ee0b89d0f557417"
|
||||||
|
integrity sha512-/I0BluFKSy7SOnlR5TALVx+pQEJZQStsfkwCpmsxHymSUVc3dJeOLrbaaVtNsU0VchXF3KOZJmHk7EUdBmWbfQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
nan "^2.10.0"
|
nan "^2.10.0"
|
||||||
|
|
||||||
object-assign@^4.0.1:
|
object-assign@^4.0.1:
|
||||||
version "4.1.1"
|
version "4.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
||||||
|
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
|
||||||
|
|
||||||
opentype.js@^0.8.0:
|
opentype.js@^0.8.0:
|
||||||
version "0.8.0"
|
version "0.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/opentype.js/-/opentype.js-0.8.0.tgz#acabcfa1642fbe894a3e4d759e43ba694e02bd35"
|
resolved "https://registry.yarnpkg.com/opentype.js/-/opentype.js-0.8.0.tgz#acabcfa1642fbe894a3e4d759e43ba694e02bd35"
|
||||||
|
integrity sha1-rKvPoWQvvolKPk11nkO6aU4CvTU=
|
||||||
dependencies:
|
dependencies:
|
||||||
tiny-inflate "^1.0.2"
|
tiny-inflate "^1.0.2"
|
||||||
|
|
||||||
promise-stream-reader@^1.0.1:
|
promise-stream-reader@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/promise-stream-reader/-/promise-stream-reader-1.0.1.tgz#4e793a79c9d49a73ccd947c6da9c127f12923649"
|
resolved "https://registry.yarnpkg.com/promise-stream-reader/-/promise-stream-reader-1.0.1.tgz#4e793a79c9d49a73ccd947c6da9c127f12923649"
|
||||||
|
integrity sha512-Tnxit5trUjBAqqZCGWwjyxhmgMN4hGrtpW3Oc/tRI4bpm/O2+ej72BB08l6JBnGQgVDGCLvHFGjGgQS6vzhwXg==
|
||||||
|
|
||||||
ps-node@^0.1.6:
|
ps-node@^0.1.6:
|
||||||
version "0.1.6"
|
version "0.1.6"
|
||||||
resolved "https://registry.yarnpkg.com/ps-node/-/ps-node-0.1.6.tgz#9af67a99d7b1d0132e51a503099d38a8d2ace2c3"
|
resolved "https://registry.yarnpkg.com/ps-node/-/ps-node-0.1.6.tgz#9af67a99d7b1d0132e51a503099d38a8d2ace2c3"
|
||||||
|
integrity sha1-mvZ6mdex0BMuUaUDCZ04qNKs4sM=
|
||||||
dependencies:
|
dependencies:
|
||||||
table-parser "^0.1.3"
|
table-parser "^0.1.3"
|
||||||
|
|
||||||
pseudomap@^1.0.2:
|
pseudomap@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
|
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
|
||||||
|
integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
|
||||||
|
|
||||||
rage-edit-tmp@^1.1.0:
|
rage-edit-tmp@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/rage-edit-tmp/-/rage-edit-tmp-1.1.0.tgz#fc5d76716d2fe2cf97dcafbf3e26753e3a08e3b2"
|
resolved "https://registry.yarnpkg.com/rage-edit-tmp/-/rage-edit-tmp-1.1.0.tgz#fc5d76716d2fe2cf97dcafbf3e26753e3a08e3b2"
|
||||||
|
integrity sha512-lR97QHY5WSf9orInMJhPqUbenkdiy7QbXUoRMI+wBZGyAPkxNwgo7h6ojq634QrBf/kQo3mVXYjuD3ZYraNaZQ==
|
||||||
|
|
||||||
runes@^0.4.2:
|
runes@^0.4.2:
|
||||||
version "0.4.3"
|
version "0.4.3"
|
||||||
resolved "https://registry.yarnpkg.com/runes/-/runes-0.4.3.tgz#32f7738844bc767b65cc68171528e3373c7bb355"
|
resolved "https://registry.yarnpkg.com/runes/-/runes-0.4.3.tgz#32f7738844bc767b65cc68171528e3373c7bb355"
|
||||||
|
integrity sha512-K6p9y4ZyL9wPzA+PMDloNQPfoDGTiFYDvdlXznyGKgD10BJpcAosvATKrExRKOrNLgD8E7Um7WGW0lxsnOuNLg==
|
||||||
|
|
||||||
table-parser@^0.1.3:
|
table-parser@^0.1.3:
|
||||||
version "0.1.3"
|
version "0.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/table-parser/-/table-parser-0.1.3.tgz#0441cfce16a59481684c27d1b5a67ff15a43c7b0"
|
resolved "https://registry.yarnpkg.com/table-parser/-/table-parser-0.1.3.tgz#0441cfce16a59481684c27d1b5a67ff15a43c7b0"
|
||||||
|
integrity sha1-BEHPzhallIFoTCfRtaZ/8VpDx7A=
|
||||||
dependencies:
|
dependencies:
|
||||||
connected-domain "^1.0.0"
|
connected-domain "^1.0.0"
|
||||||
|
|
||||||
thenify-all@^1.0.0:
|
thenify-all@^1.0.0:
|
||||||
version "1.6.0"
|
version "1.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
|
resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
|
||||||
|
integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=
|
||||||
dependencies:
|
dependencies:
|
||||||
thenify ">= 3.1.0 < 4"
|
thenify ">= 3.1.0 < 4"
|
||||||
|
|
||||||
"thenify@>= 3.1.0 < 4":
|
"thenify@>= 3.1.0 < 4":
|
||||||
version "3.3.0"
|
version "3.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839"
|
resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839"
|
||||||
|
integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=
|
||||||
dependencies:
|
dependencies:
|
||||||
any-promise "^1.0.0"
|
any-promise "^1.0.0"
|
||||||
|
|
||||||
tiny-inflate@^1.0.2:
|
tiny-inflate@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.2.tgz#93d9decffc8805bd57eae4310f0b745e9b6fb3a7"
|
resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.2.tgz#93d9decffc8805bd57eae4310f0b745e9b6fb3a7"
|
||||||
|
integrity sha1-k9nez/yIBb1X6uQxDwt0Xptvs6c=
|
||||||
|
|
||||||
uuid@^3.3.2:
|
uuid@^3.3.2:
|
||||||
version "3.3.2"
|
version "3.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
|
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
|
||||||
|
integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
|
||||||
|
|
||||||
windows-process-tree@^0.2.3:
|
windows-process-tree@^0.2.3:
|
||||||
version "0.2.3"
|
version "0.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/windows-process-tree/-/windows-process-tree-0.2.3.tgz#6b781f0a320e8a0d6434c9399add4389c709cf6e"
|
resolved "https://registry.yarnpkg.com/windows-process-tree/-/windows-process-tree-0.2.3.tgz#6b781f0a320e8a0d6434c9399add4389c709cf6e"
|
||||||
|
integrity sha512-SzPJSubVVsToz1g5lr2P+4mQT70gvJ9u/nlnpfkOeQcAhOuhKz5DiO1TARgR0OnVsv21LPzxbA2m/4JQkGh1wA==
|
||||||
dependencies:
|
dependencies:
|
||||||
nan "^2.10.0"
|
nan "^2.10.0"
|
||||||
|
|
||||||
xterm-addon-ligatures-tmp@^0.1.0-beta-1:
|
xterm-addon-ligatures-tmp@^0.1.0-beta-1:
|
||||||
version "0.1.0-beta-2"
|
version "0.1.0-beta-2"
|
||||||
resolved "https://registry.yarnpkg.com/xterm-addon-ligatures-tmp/-/xterm-addon-ligatures-tmp-0.1.0-beta-2.tgz#1063a282b279b7586372dee7892cea59738c613e"
|
resolved "https://registry.yarnpkg.com/xterm-addon-ligatures-tmp/-/xterm-addon-ligatures-tmp-0.1.0-beta-2.tgz#1063a282b279b7586372dee7892cea59738c613e"
|
||||||
|
integrity sha512-d+UoX5dfP7ZSEE/DnQlqubs7Bpw5UxLfTAibpo4pOU2KFw+lRlsLgHg5fcmhXoEvD9rj01enYTsIjedNwnwC5Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
font-finder "^1.0.2"
|
font-finder "^1.0.2"
|
||||||
font-ligatures "^1.3.1"
|
font-ligatures "^1.3.1"
|
||||||
@@ -208,7 +248,9 @@ xterm-addon-ligatures-tmp@^0.1.0-beta-1:
|
|||||||
xterm@^3.8.0:
|
xterm@^3.8.0:
|
||||||
version "3.8.0"
|
version "3.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.8.0.tgz#55d1de518bdc9c9793823f5e4e97d6898972938d"
|
resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.8.0.tgz#55d1de518bdc9c9793823f5e4e97d6898972938d"
|
||||||
|
integrity sha512-rS3HLryuMWbLsv98+jVVSUXCxmoyXPwqwJNC0ad0VSMdXgl65LefPztQVwfurkaF7kM7ZSgM8eJjnJ9kkdoR1w==
|
||||||
|
|
||||||
yallist@^2.1.2:
|
yallist@^2.1.2:
|
||||||
version "2.1.2"
|
version "2.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
|
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
|
||||||
|
integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
|
||||||
|
@@ -2117,10 +2117,10 @@ electron-to-chromium@^1.2.7:
|
|||||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.58.tgz#8267a4000014e93986d9d18c65a8b4022ca75188"
|
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.58.tgz#8267a4000014e93986d9d18c65a8b4022ca75188"
|
||||||
integrity sha512-AGJxlBEn2wOohxqWZkISVsOjZueKTQljfEODTDSEiMqSpH0S+xzV+/5oEM9AGaqhu7DzrpKOgU7ocQRjj0nJmg==
|
integrity sha512-AGJxlBEn2wOohxqWZkISVsOjZueKTQljfEODTDSEiMqSpH0S+xzV+/5oEM9AGaqhu7DzrpKOgU7ocQRjj0nJmg==
|
||||||
|
|
||||||
electron@3.0.5:
|
electron@3.0.8:
|
||||||
version "3.0.5"
|
version "3.0.8"
|
||||||
resolved "https://registry.yarnpkg.com/electron/-/electron-3.0.5.tgz#5a6f105af3b6314636c7c27a25312602dd36eae6"
|
resolved "https://registry.yarnpkg.com/electron/-/electron-3.0.8.tgz#7905806ebaead4c693531e11cda6568c32efa7bb"
|
||||||
integrity sha512-rcHNbhSGfj80Av5p06LgIUxN8wQbrdx8yblikJamDezqxe0B11CJSEJuidz6TJoCRDZuWHt+P5xMAEhp92ZUcA==
|
integrity sha512-UVj+K59lYU/vH/7TxrmDidPssFwGQZ6Ljuupugdr9h6ipMuhwgk3WRO+OlJ2TsyhKhJ6tp3AcJunuN4mprblhQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/node" "^8.0.24"
|
"@types/node" "^8.0.24"
|
||||||
electron-download "^4.1.0"
|
electron-download "^4.1.0"
|
||||||
|
Reference in New Issue
Block a user