index.ts 10.1 KB
Newer Older
1
import * as fs from 'mz/fs'
2
import slug from 'slug'
3

E
.  
Eugene Pankov 已提交
4
import { NgModule } from '@angular/core'
E
.  
Eugene Pankov 已提交
5
import { BrowserModule } from '@angular/platform-browser'
E
.  
Eugene Pankov 已提交
6
import { FormsModule } from '@angular/forms'
E
.  
Eugene Pankov 已提交
7
import { NgbModule } from '@ng-bootstrap/ng-bootstrap'
E
Eugene Pankov 已提交
8
import { ToastrModule } from 'ngx-toastr'
E
.  
Eugene Pankov 已提交
9

E
Eugene Pankov 已提交
10
import TerminusCorePlugin, { HostAppService, ToolbarButtonProvider, TabRecoveryProvider, ConfigProvider, HotkeysService, HotkeyProvider, AppService, ConfigService, TabContextMenuItemProvider } from 'terminus-core'
E
wip  
Eugene Pankov 已提交
11
import { SettingsTabProvider } from 'terminus-settings'
E
.  
Eugene Pankov 已提交
12

13
import { AppearanceSettingsTabComponent } from './components/appearanceSettingsTab.component'
E
.  
Eugene Pankov 已提交
14
import { TerminalTabComponent } from './components/terminalTab.component'
15
import { ShellSettingsTabComponent } from './components/shellSettingsTab.component'
E
.  
Eugene Pankov 已提交
16 17
import { TerminalSettingsTabComponent } from './components/terminalSettingsTab.component'
import { ColorPickerComponent } from './components/colorPicker.component'
E
Eugene Pankov 已提交
18
import { EditProfileModalComponent } from './components/editProfileModal.component'
19
import { EnvironmentEditorComponent } from './components/environmentEditor.component'
E
Eugene Pankov 已提交
20
import { SearchPanelComponent } from './components/searchPanel.component'
E
.  
Eugene Pankov 已提交
21

E
Eugene Pankov 已提交
22
import { BaseSession } from './services/sessions.service'
E
naming  
Eugene Pankov 已提交
23
import { TerminalFrontendService } from './services/terminalFrontend.service'
E
Eugene Pankov 已提交
24
import { TerminalService } from './services/terminal.service'
25
import { DockMenuService } from './services/dockMenu.service'
E
.  
Eugene Pankov 已提交
26

E
.  
Eugene Pankov 已提交
27
import { ButtonProvider } from './buttonProvider'
E
.  
Eugene Pankov 已提交
28
import { RecoveryProvider } from './recoveryProvider'
E
Eugene Pankov 已提交
29 30 31 32
import { TerminalDecorator } from './api/decorator'
import { TerminalContextMenuItemProvider } from './api/contextMenuProvider'
import { TerminalColorSchemeProvider } from './api/colorSchemeProvider'
import { ShellProvider } from './api/shellProvider'
33
import { TerminalSettingsTabProvider, AppearanceSettingsTabProvider, ShellSettingsTabProvider } from './settings'
34
import { PathDropDecorator } from './pathDrop'
E
.  
Eugene Pankov 已提交
35
import { TerminalConfigProvider } from './config'
36
import { TerminalHotkeyProvider } from './hotkeys'
E
.  
Eugene Pankov 已提交
37
import { HyperColorSchemes } from './colorSchemes'
E
Eugene Pankov 已提交
38
import { NewTabContextMenu, CopyPasteContextMenu } from './contextMenu'
E
Eugene Pankov 已提交
39
import { SaveAsProfileContextMenu } from './tabContextMenu'
E
Eugene Pankov 已提交
40

E
Eugene Pankov 已提交
41
import { CmderShellProvider } from './shells/cmder'
E
Eugene Pankov 已提交
42
import { CustomShellProvider } from './shells/custom'
E
Eugene Pankov 已提交
43 44 45 46 47 48
import { Cygwin32ShellProvider } from './shells/cygwin32'
import { Cygwin64ShellProvider } from './shells/cygwin64'
import { GitBashShellProvider } from './shells/gitBash'
import { LinuxDefaultShellProvider } from './shells/linuxDefault'
import { MacOSDefaultShellProvider } from './shells/macDefault'
import { POSIXShellsProvider } from './shells/posix'
49
import { PowerShellCoreShellProvider } from './shells/powershellCore'
50
import { WindowsDefaultShellProvider } from './shells/winDefault'
E
Eugene Pankov 已提交
51 52 53
import { WindowsStockShellsProvider } from './shells/windowsStock'
import { WSLShellProvider } from './shells/wsl'

E
Eugene Pankov 已提交
54
import { hterm } from './frontends/hterm'
E
Eugene Pankov 已提交
55 56
import { Frontend } from './frontends/frontend'
import { HTermFrontend } from './frontends/htermFrontend'
57
import { XTermFrontend, XTermWebGLFrontend } from './frontends/xtermFrontend'
E
.  
Eugene Pankov 已提交
58

E
Eugene Pankov 已提交
59
/** @hidden */
E
.  
Eugene Pankov 已提交
60 61 62 63
@NgModule({
    imports: [
        BrowserModule,
        FormsModule,
E
.  
Eugene Pankov 已提交
64
        NgbModule,
E
Eugene Pankov 已提交
65
        ToastrModule,
66
        TerminusCorePlugin,
E
.  
Eugene Pankov 已提交
67 68
    ],
    providers: [
69 70 71 72
        { provide: SettingsTabProvider, useClass: AppearanceSettingsTabProvider, multi: true },
        { provide: SettingsTabProvider, useClass: ShellSettingsTabProvider, multi: true },
        { provide: SettingsTabProvider, useClass: TerminalSettingsTabProvider, multi: true },

E
.  
Eugene Pankov 已提交
73 74
        { provide: ToolbarButtonProvider, useClass: ButtonProvider, multi: true },
        { provide: TabRecoveryProvider, useClass: RecoveryProvider, multi: true },
E
.  
Eugene Pankov 已提交
75
        { provide: ConfigProvider, useClass: TerminalConfigProvider, multi: true },
76
        { provide: HotkeyProvider, useClass: TerminalHotkeyProvider, multi: true },
E
.  
Eugene Pankov 已提交
77
        { provide: TerminalColorSchemeProvider, useClass: HyperColorSchemes, multi: true },
78
        { provide: TerminalDecorator, useClass: PathDropDecorator, multi: true },
E
Eugene Pankov 已提交
79

80
        { provide: ShellProvider, useClass: WindowsDefaultShellProvider, multi: true },
E
Eugene Pankov 已提交
81 82
        { provide: ShellProvider, useClass: MacOSDefaultShellProvider, multi: true },
        { provide: ShellProvider, useClass: LinuxDefaultShellProvider, multi: true },
83
        { provide: ShellProvider, useClass: WindowsStockShellsProvider, multi: true },
E
Eugene Pankov 已提交
84
        { provide: ShellProvider, useClass: PowerShellCoreShellProvider, multi: true },
85
        { provide: ShellProvider, useClass: CmderShellProvider, multi: true },
E
Eugene Pankov 已提交
86
        { provide: ShellProvider, useClass: CustomShellProvider, multi: true },
E
Eugene Pankov 已提交
87 88 89 90 91
        { provide: ShellProvider, useClass: Cygwin32ShellProvider, multi: true },
        { provide: ShellProvider, useClass: Cygwin64ShellProvider, multi: true },
        { provide: ShellProvider, useClass: GitBashShellProvider, multi: true },
        { provide: ShellProvider, useClass: POSIXShellsProvider, multi: true },
        { provide: ShellProvider, useClass: WSLShellProvider, multi: true },
92

E
Eugene Pankov 已提交
93 94 95
        { provide: TerminalContextMenuItemProvider, useClass: NewTabContextMenu, multi: true },
        { provide: TerminalContextMenuItemProvider, useClass: CopyPasteContextMenu, multi: true },

E
Eugene Pankov 已提交
96 97
        { provide: TabContextMenuItemProvider, useClass: SaveAsProfileContextMenu, multi: true },

98 99 100
        // For WindowsDefaultShellProvider
        PowerShellCoreShellProvider,
        WSLShellProvider,
E
Eugene Pankov 已提交
101
        WindowsStockShellsProvider,
E
.  
Eugene Pankov 已提交
102 103 104
    ],
    entryComponents: [
        TerminalTabComponent,
105 106
        AppearanceSettingsTabComponent,
        ShellSettingsTabComponent,
E
.  
Eugene Pankov 已提交
107
        TerminalSettingsTabComponent,
E
Eugene Pankov 已提交
108
        EditProfileModalComponent,
109
    ] as any[],
E
.  
Eugene Pankov 已提交
110
    declarations: [
E
.  
Eugene Pankov 已提交
111
        ColorPickerComponent,
E
.  
Eugene Pankov 已提交
112
        TerminalTabComponent,
113 114
        AppearanceSettingsTabComponent,
        ShellSettingsTabComponent,
E
.  
Eugene Pankov 已提交
115
        TerminalSettingsTabComponent,
E
Eugene Pankov 已提交
116
        EditProfileModalComponent,
117
        EnvironmentEditorComponent,
E
Eugene Pankov 已提交
118
        SearchPanelComponent,
119
    ] as any[],
120 121 122
    exports: [
        ColorPickerComponent,
        EnvironmentEditorComponent,
E
.  
Eugene Pankov 已提交
123 124
    ],
})
E
Eugene Pankov 已提交
125
export default class TerminalModule { // eslint-disable-line @typescript-eslint/no-extraneous-class
126 127 128 129 130
    constructor (
        app: AppService,
        config: ConfigService,
        hotkeys: HotkeysService,
        terminal: TerminalService,
131
        hostApp: HostAppService,
132
        dockMenu: DockMenuService,
133
    ) {
E
lint  
Eugene Pankov 已提交
134
        const events = [
E
.  
Eugene Pankov 已提交
135 136 137 138 139 140 141 142 143 144
            {
                name: 'keydown',
                htermHandler: 'onKeyDown_',
            },
            {
                name: 'keyup',
                htermHandler: 'onKeyUp_',
            },
        ]
        events.forEach((event) => {
E
lint  
Eugene Pankov 已提交
145
            const oldHandler = hterm.hterm.Keyboard.prototype[event.htermHandler]
E
.  
Eugene Pankov 已提交
146 147
            hterm.hterm.Keyboard.prototype[event.htermHandler] = function (nativeEvent) {
                hotkeys.pushKeystroke(event.name, nativeEvent)
E
lint  
Eugene Pankov 已提交
148
                if (hotkeys.getCurrentPartiallyMatchedHotkeys().length === 0) {
E
.  
Eugene Pankov 已提交
149 150 151 152 153 154 155 156 157
                    oldHandler.bind(this)(nativeEvent)
                } else {
                    nativeEvent.stopPropagation()
                    nativeEvent.preventDefault()
                }
                hotkeys.processKeystrokes()
                hotkeys.emitKeyEvent(nativeEvent)
            }
        })
158
        if (config.store.terminal.autoOpen) {
159

E
lint  
Eugene Pankov 已提交
160
            let argv = require('electron').remote.process.argv
161 162 163 164
            if (argv[0].includes('node')) {
                argv = argv.slice(1)
            }

E
lint  
Eugene Pankov 已提交
165
            if(require('yargs').parse(argv.slice(1))._[0] !== 'open'){
166 167 168 169
                app.ready$.subscribe(() => {
                    terminal.openTab()
                })
            }
170
        }
171 172 173 174 175 176 177 178

        hotkeys.matchedHotkey.subscribe(async (hotkey) => {
            if (hotkey === 'new-tab') {
                terminal.openTab()
            }
            if (hotkey === 'new-window') {
                hostApp.newWindow()
            }
179
            if (hotkey.startsWith('profile.')) {
E
lint  
Eugene Pankov 已提交
180 181
                const profiles = await terminal.getProfiles()
                const profile = profiles.find(x => slug(x.name).toLowerCase() === hotkey.split('.')[1])
182 183 184 185
                if (profile) {
                    terminal.openTabWithOptions(profile.sessionOptions)
                }
            }
186
        })
187

188 189 190
        hostApp.cliOpenDirectory$.subscribe(async directory => {
            if (await fs.exists(directory)) {
                if ((await fs.stat(directory)).isDirectory()) {
E
Eugene Pankov 已提交
191
                    terminal.openTab(undefined, directory)
192
                    hostApp.bringToFront()
193 194 195
                }
            }
        })
196

197 198
        hostApp.cliRunCommand$.subscribe(async command => {
            terminal.openTab({
E
Eugene Pankov 已提交
199 200 201 202 203
                name: '',
                sessionOptions: {
                    command: command[0],
                    args: command.slice(1),
                },
204
            }, null, true)
205
            hostApp.bringToFront()
206
        })
207

208 209
        hostApp.cliPaste$.subscribe(text => {
            if (app.activeTab instanceof TerminalTabComponent && app.activeTab.session) {
E
Eugene Pankov 已提交
210
                app.activeTab.sendInput(text)
211
                hostApp.bringToFront()
212 213
            }
        })
214

215
        hostApp.cliOpenProfile$.subscribe(async profileName => {
E
lint  
Eugene Pankov 已提交
216
            const profile = config.store.terminal.profiles.find(x => x.name === profileName)
217 218 219 220 221 222 223 224
            if (!profile) {
                console.error('Requested profile', profileName, 'not found')
                return
            }
            terminal.openTabWithOptions(profile.sessionOptions)
            hostApp.bringToFront()
        })

225
        dockMenu.update()
E
.  
Eugene Pankov 已提交
226
    }
E
.  
Eugene Pankov 已提交
227 228
}

E
Eugene Pankov 已提交
229
export { TerminalService, BaseSession, TerminalTabComponent, TerminalFrontendService, TerminalDecorator, TerminalContextMenuItemProvider, TerminalColorSchemeProvider, ShellProvider }
230
export { Frontend, XTermFrontend, XTermWebGLFrontend, HTermFrontend }
E
Eugene Pankov 已提交
231 232
export { BaseTerminalTabComponent } from './api/baseTerminalTab.component'
export * from './api/interfaces'
E
Eugene Pankov 已提交
233 234 235

// Deprecations
export { TerminalColorScheme as ITerminalColorScheme, Shell as IShell } from './api/interfaces'