Compare commits

..

488 Commits

Author SHA1 Message Date
Eugene
0514a7c229 Merge pull request #3178 from Eugeny/all-contributors/add-TakuroOnoda 2020-12-06 19:21:10 +01:00
allcontributors[bot]
326901b7e8 docs: update .all-contributorsrc [skip ci] 2020-12-06 18:20:37 +00:00
allcontributors[bot]
bbe6b61d63 docs: update README.md [skip ci] 2020-12-06 18:20:36 +00:00
Eugene
204c1057db Merge pull request #3084 from TakuroOnoda/feature/sidetab 2020-12-06 19:20:17 +01:00
Eugene Pankov
dff6a2470c refined vertical tabs 2020-12-06 19:12:15 +01:00
Eugene
cbebc09504 Merge branch 'master' into feature/sidetab 2020-12-06 18:21:03 +01:00
Eugene Pankov
f56dd71f43 Merge branch 'master' of github.com:Eugeny/terminus 2020-12-06 18:14:36 +01:00
Eugene Pankov
17f52a257e PS ctrl-left, ctrl-right and ctrl-del bindings (#507, #2739) 2020-12-06 18:11:15 +01:00
Eugene
8d09ddb686 Merge pull request #3177 from Eugeny/all-contributors/add-pinpins 2020-12-06 17:43:21 +01:00
Eugene Pankov
e6fd31e0b0 don't try to load the private key if not selected - fixes #2968 2020-12-06 17:43:00 +01:00
allcontributors[bot]
c6188a49f5 docs: update .all-contributorsrc [skip ci] 2020-12-06 16:28:09 +00:00
allcontributors[bot]
9a60b4d102 docs: update README.md [skip ci] 2020-12-06 16:28:08 +00:00
Eugene Pankov
7977c1d644 cleanup 2020-12-06 17:27:45 +01:00
Eugene
ac85a1d7d3 Merge pull request #3142 from pinpins/master 2020-12-06 17:25:19 +01:00
Eugene Pankov
86b503093c only send args to the most recent window 2020-12-06 17:03:07 +01:00
Eugene Pankov
dd3e7a0f89 fixed #2558 2020-12-06 15:39:49 +01:00
Eugene
8905106b48 Merge pull request #3174 from opensorceror/opensorceror-patch-1
Fix typos
2020-12-04 09:03:00 +01:00
Harsh Gadgil
225760a9a5 Update api.ts
Fix typos
2020-12-03 19:09:26 -05:00
pinpin
37cc37650e Fixes based on PR reviews 2020-11-17 09:14:05 +02:00
pinpin
17cafbfa52 add restart prompt 2020-11-16 22:19:44 +02:00
pinpin
3931e8088e revert version of node 2020-11-16 21:44:20 +02:00
pinpin
299ede2eb1 Add Hide Tab Index and Hide Tab Close Button 2020-11-16 21:41:11 +02:00
Eugene
bc5e6e9535 Merge pull request #3098 from Eugeny/all-contributors/add-matishadow 2020-10-23 09:04:39 +02:00
allcontributors[bot]
0c15fc2657 docs: update .all-contributorsrc [skip ci] 2020-10-23 07:03:53 +00:00
allcontributors[bot]
5e115c63f1 docs: update README.md [skip ci] 2020-10-23 07:03:52 +00:00
Eugene
2bcf23cff1 Merge pull request #3055 from matishadow/feature/regex-search-configuration 2020-10-23 09:03:35 +02:00
matishadow
2c59022b78 Fix lint 2020-10-23 07:53:43 +02:00
matishadow
358d9f30d2 Make search options be remembered 2020-10-22 23:35:23 +02:00
matishadow
afd6ce4346 Remove RegexAlwaysEnabled from settings component 2020-10-22 19:48:28 +02:00
TakuroOnoda
5c7256ffe5 Adding Tab Location "left" 2020-10-18 18:48:10 +09:00
Eugene Pankov
a15e79ad5a PEM related patches (potentially fixes #2053) 2020-10-16 15:53:41 +02:00
Eugene
f1ecbd1a93 handle windows usernames with spaces - fixed #2944 2020-10-16 12:47:03 +02:00
Eugene
7da941d038 Merge pull request #3073 from Eugeny/all-contributors/add-zend 2020-10-14 13:10:22 +02:00
allcontributors[bot]
3efc142630 docs: update .all-contributorsrc [skip ci] 2020-10-14 11:09:21 +00:00
allcontributors[bot]
d592469237 docs: update README.md [skip ci] 2020-10-14 11:09:20 +00:00
Eugene
b3e63620b3 Merge pull request #3072 from zend/master 2020-10-14 13:09:19 +02:00
Zenghai Liang
22b79510ea lint: add the parameter type 2020-10-14 17:31:45 +08:00
Zenghai Liang
70cf63f8fa lint: using a template literal 2020-10-14 17:17:07 +08:00
Zenghai Liang
c9067cf8b8 Fix the linting issue 2020-10-14 16:57:09 +08:00
Zenghai Liang
4ccc406768 Using Object.assign to copy connection 2020-10-14 16:40:14 +08:00
Zenghai Liang
1c25747de0 feat: Add copy button to ssh connection 2020-10-14 15:43:12 +08:00
matishadow
8e4c36ec24 Fix lint problems 2020-10-08 19:53:13 +02:00
matishadow
444d92d393 Add possibility to configure always enabled regex 2020-10-08 19:30:57 +02:00
Eugene
c9d75d81e4 Merge pull request #2965 from Eugeny/dependabot/npm_and_yarn/app/bl-3.0.1
Bump bl from 3.0.0 to 3.0.1 in /app
2020-09-02 17:57:12 +02:00
dependabot[bot]
98eb68c845 Bump bl from 3.0.0 to 3.0.1 in /app
Bumps [bl](https://github.com/rvagg/bl) from 3.0.0 to 3.0.1.
- [Release notes](https://github.com/rvagg/bl/releases)
- [Commits](https://github.com/rvagg/bl/compare/v3.0.0...v3.0.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-02 15:55:20 +00:00
Eugene
5185e1fe1d Update ssh.service.ts 2020-08-27 23:03:54 +02:00
Eugene Pankov
5bde116a4e Merge branch 'master' of github.com:Eugeny/terminus 2020-08-26 10:54:52 +02:00
Eugene Pankov
179acc1382 only use pageant as agent if it's runing - fixes #2935, fixes #2936 2020-08-26 10:54:49 +02:00
Eugene Pankov
c6d918e401 build fix 2020-08-23 16:02:56 +02:00
Eugene Pankov
62b53575ac WinSCP integration 2020-08-23 14:59:06 +02:00
Eugene Pankov
32b29a91e9 fixed random conpty freezes - fixes #2805, fixes #1583, fixes #2686, fixes #2293 2020-08-23 14:06:49 +02:00
Eugene Pankov
4346030459 lint 2020-08-16 18:52:45 +02:00
Eugene Pankov
9e8c0ccb14 restore all split tab children at once 2020-08-16 18:30:42 +02:00
Eugene Pankov
6c8d00eb16 don't mention legacy API in README 2020-08-16 18:24:55 +02:00
Eugene Pankov
b3fcfd0c8b added hotkey to focus all panes (fixes #722) 2020-08-16 18:24:47 +02:00
Eugene Pankov
4eefab5655 made warning when closing SSH tabs optional - fixes #2801 2020-08-15 21:07:35 +02:00
Eugene Pankov
2745896ec3 lint 2020-08-15 20:49:18 +02:00
Eugene Pankov
cdfaaabb70 bumped native deps 2020-08-15 20:46:50 +02:00
Eugene Pankov
60ab6ece62 fixed tab context menu for custom tab colors 2020-08-15 20:46:40 +02:00
Eugene Pankov
436318b534 Merge branch 'master' of github.com:Eugeny/terminus 2020-08-15 20:46:21 +02:00
Eugene
248f431437 Merge pull request #2648 from Eugeny/dependabot/npm_and_yarn/node-abi-2.18.0
Bump node-abi from 2.16.0 to 2.18.0
2020-08-15 20:45:56 +02:00
Eugene
7794280115 Merge pull request #2879 from Eugeny/dependabot/npm_and_yarn/typedoc-0.18.0
Bump typedoc from 0.17.7 to 0.18.0
2020-08-15 20:45:32 +02:00
Eugene Pankov
c2cc4c977f Update shellSettingsTab.component.pug 2020-08-15 19:21:12 +02:00
Eugene Pankov
f9b7f97863 handle cwd detection errors on linux 2020-08-14 12:39:14 +02:00
Eugene Pankov
59ce7eeee6 prioritize pubkey auth over password (fixes #2894) 2020-08-13 15:05:05 +02:00
Eugene Pankov
0e012a90ea Update xtermFrontend.ts 2020-08-12 21:04:42 +02:00
Eugene Pankov
6773d260cf Merge branch 'master' of github.com:Eugeny/terminus 2020-08-12 21:02:29 +02:00
Eugene
7379f6cd59 Merge pull request #2859 from 695137400/patch-1
Update xtermFrontend.ts
2020-08-12 21:02:25 +02:00
Jonathan Beverley
3aee24bdbd Re-added an option for Agent Forwarding 2020-08-12 21:00:55 +02:00
dependabot-preview[bot]
84dbfa5d6c Bump typedoc from 0.17.7 to 0.18.0
Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.17.7 to 0.18.0.
- [Release notes](https://github.com/TypeStrong/TypeDoc/releases)
- [Commits](https://github.com/TypeStrong/TypeDoc/compare/v0.17.7...v0.18.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-10 04:19:24 +00:00
Eugene Pankov
43958d88b8 Merge branch 'master' of github.com:Eugeny/terminus 2020-08-07 12:25:05 +02:00
Eugene Pankov
f4b0e4cb52 Update package.json 2020-08-07 12:25:02 +02:00
Eugene
d91c898f6d Merge pull request #2830 from Eugeny/dependabot/npm_and_yarn/app/yargs-15.4.1
Bump yargs from 15.3.1 to 15.4.1 in /app
2020-08-07 09:22:38 +02:00
Eugene
f16989a45d Merge pull request #2724 from Eugeny/dependabot/npm_and_yarn/electron-notarize-1.0.0
Bump electron-notarize from 0.1.1 to 1.0.0
2020-08-07 09:20:54 +02:00
Eugene
1ef524e832 Merge pull request #2852 from Eugeny/dependabot/npm_and_yarn/eslint-7.6.0
Bump eslint from 7.2.0 to 7.6.0
2020-08-07 09:19:33 +02:00
Eugene
65fcdd2745 Merge pull request #2856 from Eugeny/dependabot/npm_and_yarn/typescript-eslint/parser-3.8.0
Bump @typescript-eslint/parser from 3.3.0 to 3.8.0
2020-08-07 09:18:56 +02:00
695137400
7030f562e8 Update xtermFrontend.ts
console error
2020-08-04 18:21:26 +08:00
dependabot-preview[bot]
047b31dd67 Bump @typescript-eslint/parser from 3.3.0 to 3.8.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 3.3.0 to 3.8.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v3.8.0/packages/parser)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-04 04:24:06 +00:00
Eugene Pankov
ae0d33f026 use update.electronjs.org for updates (fixes #2393, fixes #2087, fixes #2835, fixes #2436, fixes #2635, fixes #1495, fixes #2158) 2020-08-03 23:14:05 +02:00
dependabot-preview[bot]
039a0b7eb5 Bump eslint from 7.2.0 to 7.6.0
Bumps [eslint](https://github.com/eslint/eslint) from 7.2.0 to 7.6.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v7.2.0...v7.6.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-03 04:25:33 +00:00
Eugene Pankov
3d3fcc41b8 lint 2020-07-29 19:27:23 +02:00
Eugene Pankov
3e3e8f3132 added fontawesome regular style 2020-07-29 19:19:05 +02:00
Eugene Pankov
da21895e40 more explicit SSH auth options and agent forwarding - fixes #2284, fixes #2511, fixes #2717, fixes #2184 2020-07-29 19:18:57 +02:00
Eugene Pankov
34752ed69e Merge branch 'master' of https://github.com/Eugeny/terminus 2020-07-29 18:50:16 +02:00
Eugene
008eb98f50 Merge pull request #2767 from Eugeny/dependabot/npm_and_yarn/terminus-ssh/types/ssh2-0.5.44 2020-07-29 18:50:10 +02:00
Eugene
e521cd4648 Merge pull request #2844 from Eugeny/all-contributors/add-JonathanBeverley 2020-07-29 18:31:10 +02:00
Eugene Pankov
cb97a784da support windows openssh agent 2020-07-29 18:11:10 +02:00
allcontributors[bot]
96d9d81be2 docs: update .all-contributorsrc [skip ci] 2020-07-29 15:45:53 +00:00
allcontributors[bot]
71797eb93f docs: update README.md [skip ci] 2020-07-29 15:45:52 +00:00
Eugene
ae3870e297 Merge pull request #2601 from JonathanBeverley/jmb/features 2020-07-29 17:45:05 +02:00
Eugene Pankov
055de5013c updated uac.exe 2020-07-29 09:50:08 +02:00
dependabot-preview[bot]
ad1ea01976 Bump yargs from 15.3.1 to 15.4.1 in /app
Bumps [yargs](https://github.com/yargs/yargs) from 15.3.1 to 15.4.1.
- [Release notes](https://github.com/yargs/yargs/releases)
- [Changelog](https://github.com/yargs/yargs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/yargs/yargs/compare/v15.3.1...v15.4.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-28 04:20:35 +00:00
Eugene
064fbfac67 Merge pull request #2736 from Eugeny/dependabot/npm_and_yarn/terminus-core/winston-3.3.3 2020-07-27 22:33:53 +02:00
Eugene
a31c83476d Merge pull request #2759 from Eugeny/dependabot/npm_and_yarn/app/rxjs-compat-6.6.0 2020-07-27 22:33:21 +02:00
Eugene
bc9f4c267e Merge pull request #2723 from Eugeny/dependabot/npm_and_yarn/webpack-cli-3.3.12
Bump webpack-cli from 3.3.10 to 3.3.12
2020-07-27 22:33:03 +02:00
Eugene
3e92ae278e Merge pull request #2823 from Eugeny/dependabot/npm_and_yarn/sentry/electron-1.5.1
Bump @sentry/electron from 1.2.1 to 1.5.1
2020-07-27 22:22:31 +02:00
Eugene
6adc3543a8 Merge pull request #2826 from Eugeny/all-contributors/add-dimitory 2020-07-27 22:21:01 +02:00
allcontributors[bot]
af5293948c docs: update .all-contributorsrc [skip ci] 2020-07-27 20:15:14 +00:00
allcontributors[bot]
34620db925 docs: update README.md [skip ci] 2020-07-27 20:15:13 +00:00
Eugene
4a5a96ea16 Merge pull request #2824 from Dimitory/patch-1 2020-07-27 22:15:09 +02:00
Dmitry Pronin
fcc9d7cf7d Update ssh.service.ts 2020-07-27 19:26:02 +03:00
Dmitry Pronin
9cae50bfc5 Fixed SSH Keys Permission Denied 2020-07-27 19:19:21 +03:00
Eugene Pankov
3cff5909bd rebuild uac.exe in release mode (fixes #2800) 2020-07-27 17:38:26 +02:00
Eugene Pankov
0130cd9d54 handle global hotkeys with win key - fixes #2524 2020-07-27 16:36:11 +02:00
Eugene Pankov
926d4f51b3 use more performant sourcemap mode - fixes #2617 2020-07-27 16:12:16 +02:00
Eugene Pankov
efe390f68d allow searching for hotkey values - #1509 2020-07-27 16:04:31 +02:00
Eugene Pankov
6d0b2608a2 added an option to disable the global hotkey to the welcome tab (fixes #1509, fixes #2809) 2020-07-27 15:56:09 +02:00
Eugene Pankov
ddd306dbf6 bumped xterm 2020-07-27 15:55:24 +02:00
Eugene Pankov
30c632a5cc Merge branch 'master' of github.com:Eugeny/terminus 2020-07-27 15:39:27 +02:00
Eugene
65b3254b77 Merge pull request #2699 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-webgl-0.8.0
Bump xterm-addon-webgl from 0.7.0 to 0.8.0 in /terminus-terminal
2020-07-27 15:38:31 +02:00
Eugene
f776a30c9f Merge pull request #2787 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-ligatures-0.4.0-beta.5
Bump xterm-addon-ligatures from 0.3.0 to 0.4.0-beta.5 in /terminus-terminal
2020-07-27 15:38:20 +02:00
dependabot-preview[bot]
c02525440c Bump @sentry/electron from 1.2.1 to 1.5.1
Bumps [@sentry/electron](https://github.com/getsentry/sentry-electron) from 1.2.1 to 1.5.1.
- [Release notes](https://github.com/getsentry/sentry-electron/releases)
- [Changelog](https://github.com/getsentry/sentry-electron/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-electron/compare/v1.2.1...v1.5.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-27 04:22:58 +00:00
Eugene Pankov
dbda8dad34 lint 2020-07-17 20:45:18 +02:00
dependabot-preview[bot]
bc44f55989 Bump xterm-addon-ligatures in /terminus-terminal
Bumps [xterm-addon-ligatures](https://github.com/xtermjs/xterm.js) from 0.3.0 to 0.4.0-beta.5.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-14 04:20:15 +00:00
dependabot-preview[bot]
a3c998adab Bump @types/ssh2 from 0.5.43 to 0.5.44 in /terminus-ssh
Bumps [@types/ssh2](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/ssh2) from 0.5.43 to 0.5.44.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/ssh2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-07 04:20:14 +00:00
dependabot-preview[bot]
b62b59f9b8 Bump winston from 3.2.1 to 3.3.3 in /terminus-core
Bumps [winston](https://github.com/winstonjs/winston) from 3.2.1 to 3.3.3.
- [Release notes](https://github.com/winstonjs/winston/releases)
- [Changelog](https://github.com/winstonjs/winston/blob/master/CHANGELOG.md)
- [Commits](https://github.com/winstonjs/winston/compare/3.2.1...v3.3.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-05 10:54:28 +00:00
Eugene Pankov
bb1557b0a4 avoid ResizeObserver feedback loop 2020-07-05 12:47:40 +02:00
Eugene Pankov
d0fe64355b ssh reconnection logic improvements - fixes #2705, fixes #761, fixes #2662 2020-07-05 12:47:32 +02:00
Eugene Pankov
7b4e6e8f3a build fix 2020-07-05 12:19:08 +02:00
dependabot-preview[bot]
bd11c90846 Bump rxjs-compat from 6.5.5 to 6.6.0 in /app
Bumps rxjs-compat from 6.5.5 to 6.6.0.

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-02 04:22:04 +00:00
Eugene Pankov
21f33618d4 stop ssh session after connection errors 2020-06-30 15:35:07 +02:00
Eugene Pankov
11c8ca6582 don't crash on missing wsl distro flags - fixes #2744 2020-06-30 15:34:55 +02:00
Eugene Pankov
6e9ac1b59a added entitlements and usage descriptions - fixed #2746 2020-06-28 15:11:52 +02:00
dependabot-preview[bot]
91591a81ff Bump electron-notarize from 0.1.1 to 1.0.0
Bumps [electron-notarize](https://github.com/electron/electron-notarize) from 0.1.1 to 1.0.0.
- [Release notes](https://github.com/electron/electron-notarize/releases)
- [Changelog](https://github.com/electron/electron-notarize/blob/master/.releaserc.json)
- [Commits](https://github.com/electron/electron-notarize/compare/v0.1.1...v1.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-22 04:19:42 +00:00
dependabot-preview[bot]
1ce0ff2e00 Bump webpack-cli from 3.3.10 to 3.3.12
Bumps [webpack-cli](https://github.com/webpack/webpack-cli) from 3.3.10 to 3.3.12.
- [Release notes](https://github.com/webpack/webpack-cli/releases)
- [Changelog](https://github.com/webpack/webpack-cli/blob/v3.3.12/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-cli/compare/v3.3.10...v3.3.12)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-22 04:19:12 +00:00
Eugene
92cef766f6 Merge pull request #2682 from Eugeny/dependabot/npm_and_yarn/eslint-7.2.0
Bump eslint from 7.1.0 to 7.2.0
2020-06-19 20:00:36 +02:00
Eugene
d1d55d39b1 Merge pull request #2716 from Eugeny/dependabot/npm_and_yarn/app/angular/forms-9.1.11
Bump @angular/forms from 9.1.9 to 9.1.11 in /app
2020-06-19 20:00:24 +02:00
Eugene
4ad55bff6e Merge pull request #2714 from Eugeny/dependabot/npm_and_yarn/webpack-5.0.0-beta.18
Bump webpack from 5.0.0-beta.16 to 5.0.0-beta.18
2020-06-19 20:00:13 +02:00
Eugene
f73c41a709 Merge pull request #2710 from Eugeny/dependabot/npm_and_yarn/app/angular/common-9.1.11
Bump @angular/common from 9.1.9 to 9.1.11 in /app
2020-06-19 19:59:45 +02:00
Eugene
3ca55d972a Merge pull request #2707 from Eugeny/dependabot/npm_and_yarn/typescript-eslint/parser-3.3.0
Bump @typescript-eslint/parser from 3.1.0 to 3.3.0
2020-06-19 19:59:05 +02:00
dependabot-preview[bot]
2b25c25337 Bump @angular/forms from 9.1.9 to 9.1.11 in /app
Bumps [@angular/forms](https://github.com/angular/angular/tree/HEAD/packages/forms) from 9.1.9 to 9.1.11.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/9.1.11/packages/forms)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-19 04:17:10 +00:00
dependabot-preview[bot]
3621877f32 Bump webpack from 5.0.0-beta.16 to 5.0.0-beta.18
Bumps [webpack](https://github.com/webpack/webpack) from 5.0.0-beta.16 to 5.0.0-beta.18.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.0.0-beta.16...v5.0.0-beta.18)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-18 04:20:19 +00:00
dependabot-preview[bot]
cf2a8ddc96 Bump @angular/common from 9.1.9 to 9.1.11 in /app
Bumps [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) from 9.1.9 to 9.1.11.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/9.1.11/packages/common)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-17 04:19:49 +00:00
dependabot-preview[bot]
d461515881 Bump @typescript-eslint/parser from 3.1.0 to 3.3.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 3.1.0 to 3.3.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v3.3.0/packages/parser)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-16 04:21:28 +00:00
Eugene Pankov
5828571a95 fixed uac.exe encoding (fixes #654) 2020-06-14 18:46:22 +02:00
Eugene Pankov
3aba7c9b93 lint 2020-06-14 17:26:57 +02:00
Eugene Pankov
d371bf2f41 fixed arrow keys in admin shells (fixes #691) 2020-06-14 17:25:32 +02:00
Eugene Pankov
51934dccbd use glasstron on win32 2020-06-14 16:16:00 +02:00
Eugene Pankov
b6caf47ce6 Update theme.scss 2020-06-14 16:13:01 +02:00
dependabot-preview[bot]
e8362268bb Bump xterm-addon-webgl from 0.7.0 to 0.8.0 in /terminus-terminal
Bumps [xterm-addon-webgl](https://github.com/xtermjs/xterm.js) from 0.7.0 to 0.8.0.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/compare/0.7...0.8)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-12 04:17:36 +00:00
dependabot-preview[bot]
88c57a6794 Bump eslint from 7.1.0 to 7.2.0
Bumps [eslint](https://github.com/eslint/eslint) from 7.1.0 to 7.2.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v7.1.0...v7.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-09 04:18:03 +00:00
Eugene Pankov
69a0b46a20 auto-trim single-line clipboard contents (fixes #2677) 2020-06-08 10:04:29 +02:00
dependabot-preview[bot]
a5a662c05d Bump node-abi from 2.16.0 to 2.18.0
Bumps [node-abi](https://github.com/lgeiger/node-abi) from 2.16.0 to 2.18.0.
- [Release notes](https://github.com/lgeiger/node-abi/releases)
- [Commits](https://github.com/lgeiger/node-abi/compare/v2.16.0...v2.18.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-08 07:15:31 +00:00
Eugene
4ab0b51d87 Merge pull request #2647 from Eugeny/dependabot/npm_and_yarn/app/node-abi-2.18.0
Bump node-abi from 2.16.0 to 2.18.0 in /app
2020-06-08 09:13:38 +02:00
dependabot-preview[bot]
c3285b24d9 Bump node-abi from 2.16.0 to 2.18.0 in /app
Bumps [node-abi](https://github.com/lgeiger/node-abi) from 2.16.0 to 2.18.0.
- [Release notes](https://github.com/lgeiger/node-abi/releases)
- [Commits](https://github.com/lgeiger/node-abi/compare/v2.16.0...v2.18.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-08 07:13:06 +00:00
Eugene
313345da3d Merge pull request #2666 from Eugeny/dependabot/npm_and_yarn/node-gyp-7.0.0
Bump node-gyp from 6.1.0 to 7.0.0
2020-06-08 09:12:12 +02:00
Eugene
7173be8c22 Merge pull request #2628 from Eugeny/dependabot/npm_and_yarn/app/keytar-6.0.1
Bump keytar from 5.6.0 to 6.0.1 in /app
2020-06-08 09:11:27 +02:00
Eugene
b97ef8c643 Merge pull request #2678 from Eugeny/dependabot/npm_and_yarn/eslint-plugin-import-2.21.1
Bump eslint-plugin-import from 2.20.2 to 2.21.1
2020-06-08 09:11:12 +02:00
Eugene Pankov
d221f8e561 properly clear jump host from settings (fixes #2675) 2020-06-08 09:11:00 +02:00
dependabot-preview[bot]
95ed0a58b9 Bump eslint-plugin-import from 2.20.2 to 2.21.1
Bumps [eslint-plugin-import](https://github.com/benmosher/eslint-plugin-import) from 2.20.2 to 2.21.1.
- [Release notes](https://github.com/benmosher/eslint-plugin-import/releases)
- [Changelog](https://github.com/benmosher/eslint-plugin-import/blob/master/CHANGELOG.md)
- [Commits](https://github.com/benmosher/eslint-plugin-import/compare/v2.20.2...v2.21.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-08 04:18:27 +00:00
dependabot-preview[bot]
77d4176b55 Bump keytar from 5.6.0 to 6.0.1 in /app
Bumps [keytar](https://github.com/atom/node-keytar) from 5.6.0 to 6.0.1.
- [Release notes](https://github.com/atom/node-keytar/releases)
- [Commits](https://github.com/atom/node-keytar/compare/v5.6.0...v6.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-05 08:32:24 +00:00
Eugene Pankov
48013e2102 moved glasstron outside of webpack realm 2020-06-05 10:08:20 +02:00
dependabot-preview[bot]
31dcb2b514 Bump node-gyp from 6.1.0 to 7.0.0
Bumps [node-gyp](https://github.com/nodejs/node-gyp) from 6.1.0 to 7.0.0.
- [Release notes](https://github.com/nodejs/node-gyp/releases)
- [Changelog](https://github.com/nodejs/node-gyp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodejs/node-gyp/compare/v6.1.0...v7.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-05 04:21:13 +00:00
Eugene
43a9a7cb19 Merge pull request #2629 from Eugeny/dependabot/npm_and_yarn/app/serialport-9.0.0
Bump serialport from 8.0.7 to 9.0.0 in /app
2020-06-04 13:52:00 +02:00
Eugene
88cecba2b6 Merge pull request #2619 from Eugeny/dependabot/npm_and_yarn/eslint-7.1.0
Bump eslint from 6.8.0 to 7.1.0
2020-06-04 13:51:37 +02:00
Eugene
91e1870f91 Merge pull request #2631 from Eugeny/dependabot/npm_and_yarn/typedoc-0.17.7
Bump typedoc from 0.17.6 to 0.17.7
2020-06-04 13:51:11 +02:00
Eugene
705050a96a Merge pull request #2655 from Eugeny/dependabot/npm_and_yarn/typescript-eslint/parser-3.1.0
Bump @typescript-eslint/parser from 2.34.0 to 3.1.0
2020-06-04 13:49:53 +02:00
Eugene
8d2550fb99 Merge pull request #2660 from Eugeny/all-contributors/add-3l0w 2020-06-04 13:49:14 +02:00
dependabot-preview[bot]
c4a89d4ee3 Bump eslint from 6.8.0 to 7.1.0
Bumps [eslint](https://github.com/eslint/eslint) from 6.8.0 to 7.1.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v6.8.0...v7.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-04 11:43:04 +00:00
allcontributors[bot]
6140cdfabc docs: update .all-contributorsrc [skip ci] 2020-06-04 11:41:01 +00:00
allcontributors[bot]
5786d61620 docs: update README.md [skip ci] 2020-06-04 11:41:00 +00:00
Eugene
32f6e16275 Merge pull request #2657 from 3l0w/master 2020-06-04 13:40:58 +02:00
Gwilherm Folliot
668986fc08 fixed lint 2020-06-04 13:34:33 +02:00
Gwilherm Folliot
9190893ccf Added acrylic background for linux 2020-06-03 18:41:23 +02:00
dependabot-preview[bot]
546837ab55 Bump @typescript-eslint/parser from 2.34.0 to 3.1.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 2.34.0 to 3.1.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v3.1.0/packages/parser)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-03 04:20:59 +00:00
dependabot-preview[bot]
3825feae08 Bump typedoc from 0.17.6 to 0.17.7
Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.17.6 to 0.17.7.
- [Release notes](https://github.com/TypeStrong/TypeDoc/releases)
- [Commits](https://github.com/TypeStrong/TypeDoc/compare/0.17.6...v0.17.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-27 04:21:13 +00:00
dependabot-preview[bot]
fdeabae061 Bump serialport from 8.0.7 to 9.0.0 in /app
Bumps [serialport](https://github.com/serialport/node-serialport) from 8.0.7 to 9.0.0.
- [Release notes](https://github.com/serialport/node-serialport/releases)
- [Changelog](https://github.com/serialport/node-serialport/blob/master/CHANGELOG.md)
- [Commits](https://github.com/serialport/node-serialport/compare/@serialport/bindings@8.0.7...@serialport/bindings@9.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-27 04:19:14 +00:00
Eugene Pankov
8b307be92d Merge branch 'master' of github.com:Eugeny/terminus 2020-05-26 18:52:26 +02:00
Eugene
45516c4013 Merge pull request #2622 from Eugeny/dependabot/npm_and_yarn/app/js-yaml-3.14.0 2020-05-26 17:32:06 +02:00
Eugene
5d8f7a4e34 Merge pull request #2623 from Eugeny/dependabot/npm_and_yarn/terminus-core/js-yaml-3.14.0 2020-05-26 17:31:47 +02:00
Eugene
792c9279e2 Merge pull request #2592 from Eugeny/dependabot/npm_and_yarn/terminus-core/types/js-yaml-3.12.4 2020-05-26 17:31:34 +02:00
Eugene
8825a8163e Merge pull request #2591 from Eugeny/dependabot/npm_and_yarn/types/js-yaml-3.12.4 2020-05-26 17:31:28 +02:00
Eugene Pankov
7e42328c6f bumped node-pty 2020-05-26 17:31:09 +02:00
Eugene
2dd99d43ed Merge pull request #2597 from Eugeny/dependabot/npm_and_yarn/typescript-eslint/parser-2.34.0 2020-05-26 17:31:04 +02:00
Eugene Pankov
991b4fc965 Merge branch 'master' of github.com:Eugeny/terminus 2020-05-26 17:30:42 +02:00
Eugene
e9d7af5320 Merge pull request #2552 from Eugeny/dependabot/npm_and_yarn/app/serialport-9.0.0 2020-05-26 17:29:30 +02:00
Eugene
bff23fe825 Merge pull request #2573 from Eugeny/dependabot/npm_and_yarn/tslib-2.0.0 2020-05-26 17:29:10 +02:00
Eugene
79bd94ee6f Merge pull request #2604 from Eugeny/dependabot/npm_and_yarn/typescript-3.9.3 2020-05-26 17:28:57 +02:00
Eugene
fdd833ef7c Merge pull request #2603 from Eugeny/dependabot/npm_and_yarn/app/node-abi-2.17.0 2020-05-26 17:28:47 +02:00
Eugene Pankov
c386504296 fixed #2624 - fixed analytics initialization 2020-05-26 17:28:02 +02:00
Eugene
9cc8649422 Merge pull request #2610 from Eugeny/dependabot/npm_and_yarn/terminus-core/uuid-8.1.0 2020-05-26 17:27:00 +02:00
Eugene Pankov
625a9179c5 dropped uuid dependency 2020-05-26 17:26:39 +02:00
Eugene Pankov
66ed73f7c9 bumped angular 2020-05-26 17:19:45 +02:00
Eugene Pankov
95bd48d6c6 warn when closing ssh tabs - fixes #2512 2020-05-26 17:12:48 +02:00
Eugene Pankov
328490a85e move "close" menu items to the bottom - fixes #2599 2020-05-26 17:10:02 +02:00
Eugene Pankov
d08413aeab fixed focus loss on new windows 2020-05-26 17:04:39 +02:00
Eugene Pankov
922f1fbade fixed #1870 - new window hotkey on mac 2020-05-26 17:04:10 +02:00
Eugene
cb96c8d470 Merge pull request #2578 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-unicode11-0.2.0
Bump xterm-addon-unicode11 from 0.2.0-beta.5 to 0.2.0 in /terminus-terminal
2020-05-26 16:53:19 +02:00
Eugene
f3ebc43667 Merge pull request #2572 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-webgl-0.7.0 2020-05-26 16:53:06 +02:00
dependabot-preview[bot]
e7696dcdf3 Bump js-yaml from 3.13.1 to 3.14.0 in /app
Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.13.1 to 3.14.0.
- [Release notes](https://github.com/nodeca/js-yaml/releases)
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/3.13.1...3.14.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-26 14:52:51 +00:00
Eugene
4abf7d7738 Merge pull request #2574 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-4.6.0 2020-05-26 16:52:46 +02:00
dependabot-preview[bot]
be206161d6 Bump uuid from 8.0.0 to 8.1.0 in /terminus-core
Bumps [uuid](https://github.com/uuidjs/uuid) from 8.0.0 to 8.1.0.
- [Release notes](https://github.com/uuidjs/uuid/releases)
- [Changelog](https://github.com/uuidjs/uuid/blob/master/CHANGELOG.md)
- [Commits](https://github.com/uuidjs/uuid/compare/v8.0.0...v8.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-26 14:52:11 +00:00
dependabot-preview[bot]
dcd17f886e Bump xterm-addon-unicode11 in /terminus-terminal
Bumps [xterm-addon-unicode11](https://github.com/xtermjs/xterm.js) from 0.2.0-beta.5 to 0.2.0.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-26 14:52:08 +00:00
dependabot-preview[bot]
2c94dea941 Bump xterm from 4.6.0-beta.41 to 4.6.0 in /terminus-terminal
Bumps [xterm](https://github.com/xtermjs/xterm.js) from 4.6.0-beta.41 to 4.6.0.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/commits/4.6.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-26 14:51:57 +00:00
dependabot-preview[bot]
7a2291f7db Bump js-yaml from 3.13.1 to 3.14.0 in /terminus-core
Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.13.1 to 3.14.0.
- [Release notes](https://github.com/nodeca/js-yaml/releases)
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/3.13.1...3.14.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-26 14:51:15 +00:00
Eugene
af0d9142ed Merge pull request #2579 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-serialize-0.3.0 2020-05-26 16:50:59 +02:00
Eugene
6ba7d5b78f Merge pull request #2577 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-search-0.7.0 2020-05-26 16:50:45 +02:00
Eugene
bbf035d5fd Merge pull request #2576 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-ligatures-0.3.0
Bump xterm-addon-ligatures from 0.3.0-beta.1 to 0.3.0 in /terminus-terminal
2020-05-26 16:50:25 +02:00
Eugene
84bc4369cb Merge pull request #2575 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-fit-0.4.0 2020-05-26 16:50:15 +02:00
Eugene
e01f77998c Merge pull request #2595 from Eugeny/dependabot/npm_and_yarn/electron-builder-22.6.1 2020-05-26 16:49:30 +02:00
Eugene Pankov
08acd4df46 depend on gnome-keyring (fixes #2203, fixes #2568) 2020-05-22 11:30:05 +02:00
dependabot-preview[bot]
2c9d968aa8 Bump typescript from 3.8.3 to 3.9.3
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 3.8.3 to 3.9.3.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v3.8.3...v3.9.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-20 04:24:04 +00:00
dependabot-preview[bot]
19a3996861 Bump node-abi from 2.16.0 to 2.17.0 in /app
Bumps [node-abi](https://github.com/lgeiger/node-abi) from 2.16.0 to 2.17.0.
- [Release notes](https://github.com/lgeiger/node-abi/releases)
- [Commits](https://github.com/lgeiger/node-abi/compare/v2.16.0...v2.17.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-20 04:22:02 +00:00
Jonathan Beverley
6d187e8117 Add an option for Agent Forwarding
I don't understand why this is on by default, let alone not
configurable. Agent forwarding is a significant security concern, and
buggy agent forwarding is the cause of a couple existing bugs.
2020-05-19 12:09:07 -04:00
Jonathan Beverley
a7687a6fc2 Include pagent.exe in installer, Remove check for pageant (fixed Eugeny#350) 2020-05-19 12:08:55 -04:00
dependabot-preview[bot]
7cbec63039 Bump @typescript-eslint/parser from 2.31.0 to 2.34.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 2.31.0 to 2.34.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v2.34.0/packages/parser)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-19 04:23:17 +00:00
dependabot-preview[bot]
91320f1cd7 Bump electron-builder from 22.5.1 to 22.6.1
Bumps [electron-builder](https://github.com/electron-userland/electron-builder) from 22.5.1 to 22.6.1.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/compare/v22.5.1...v22.6.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-19 04:22:40 +00:00
dependabot-preview[bot]
5518ce5e0c Bump @types/js-yaml from 3.12.3 to 3.12.4 in /terminus-core
Bumps [@types/js-yaml](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/js-yaml) from 3.12.3 to 3.12.4.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/js-yaml)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-18 04:30:04 +00:00
dependabot-preview[bot]
d59c52d7a5 Bump @types/js-yaml from 3.12.3 to 3.12.4
Bumps [@types/js-yaml](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/js-yaml) from 3.12.3 to 3.12.4.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/js-yaml)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-18 04:22:03 +00:00
dependabot-preview[bot]
dd3a4cb289 Bump xterm-addon-serialize in /terminus-terminal
Bumps xterm-addon-serialize from 0.3.0-beta.4 to 0.3.0.

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-14 04:25:51 +00:00
dependabot-preview[bot]
fc6ded4b1a Bump xterm-addon-search from 0.7.0-beta.2 to 0.7.0 in /terminus-terminal
Bumps [xterm-addon-search](https://github.com/xtermjs/xterm.js) from 0.7.0-beta.2 to 0.7.0.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/commits/0.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-14 04:25:00 +00:00
dependabot-preview[bot]
d4f61b3846 Bump xterm-addon-ligatures in /terminus-terminal
Bumps [xterm-addon-ligatures](https://github.com/xtermjs/xterm.js) from 0.3.0-beta.1 to 0.3.0.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/commits/0.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-14 04:24:35 +00:00
dependabot-preview[bot]
ffad7b6ba7 Bump xterm-addon-fit from 0.4.0-beta.8 to 0.4.0 in /terminus-terminal
Bumps [xterm-addon-fit](https://github.com/xtermjs/xterm.js) from 0.4.0-beta.8 to 0.4.0.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/commits/0.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-14 04:24:10 +00:00
dependabot-preview[bot]
499f541328 Bump tslib from 1.11.1 to 2.0.0
Bumps [tslib](https://github.com/Microsoft/tslib) from 1.11.1 to 2.0.0.
- [Release notes](https://github.com/Microsoft/tslib/releases)
- [Commits](https://github.com/Microsoft/tslib/compare/1.11.1...2.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-14 04:23:36 +00:00
dependabot-preview[bot]
7c893a3c4b Bump xterm-addon-webgl from 0.7.0-beta.10 to 0.7.0 in /terminus-terminal
Bumps [xterm-addon-webgl](https://github.com/xtermjs/xterm.js) from 0.7.0-beta.10 to 0.7.0.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/commits/0.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-14 04:23:24 +00:00
dependabot-preview[bot]
1f5c55826b Bump serialport from 8.0.7 to 9.0.0 in /app
Bumps [serialport](https://github.com/serialport/node-serialport) from 8.0.7 to 9.0.0.
- [Release notes](https://github.com/serialport/node-serialport/releases)
- [Changelog](https://github.com/serialport/node-serialport/blob/master/CHANGELOG.md)
- [Commits](https://github.com/serialport/node-serialport/compare/@serialport/bindings@8.0.7...@serialport/bindings@9.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-11 04:22:52 +00:00
Eugene Pankov
197824004e notarize pkg 2020-05-07 17:37:39 +02:00
Eugene Pankov
ee1d465bf6 Revert "separate mac builds"
This reverts commit 90cc06c3fd.
2020-05-07 13:00:42 +02:00
Eugene Pankov
12bb070def Revert "separate pkg/zip builds for macos"
This reverts commit 8cf0445b6d.
2020-05-07 12:59:26 +02:00
Eugene Pankov
13ab29bcab Update build-macos-zip.js 2020-05-07 09:51:21 +02:00
Eugene Pankov
8cf0445b6d separate pkg/zip builds for macos 2020-05-07 09:11:56 +02:00
Eugene Pankov
90cc06c3fd separate mac builds 2020-05-07 09:08:24 +02:00
Eugene Pankov
7d7b2cbcfd fixed macos zip build - fixes #2513 2020-05-06 16:41:51 +02:00
Eugene Pankov
3a76e0bb2e fixed tab focus loss - fixes #2525 2020-05-06 16:21:48 +02:00
Eugene Pankov
9e2d070ed4 bumped ligatures plugin 2020-05-06 16:03:22 +02:00
Eugene
f796718cae Merge pull request #2516 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-search-0.7.0-beta.2 2020-05-06 15:51:55 +02:00
Eugene
a4c2ccdb93 Merge pull request #2529 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-4.6.0-beta.41 2020-05-06 15:51:24 +02:00
Eugene
ccbaf1c2c2 Merge pull request #2521 from Eugeny/dependabot/npm_and_yarn/graceful-fs-4.2.4 2020-05-06 15:26:14 +02:00
Eugene
7ccd97eb49 Merge pull request #2528 from Eugeny/dependabot/npm_and_yarn/node-sass-4.14.1 2020-05-06 15:26:03 +02:00
Eugene
6b320e9cf3 Merge pull request #2520 from Eugeny/dependabot/npm_and_yarn/electron-8.2.5 2020-05-06 15:23:07 +02:00
Eugene
a6a5f2b132 Merge pull request #2527 from Eugeny/dependabot/npm_and_yarn/typescript-eslint/parser-2.31.0 2020-05-06 15:21:58 +02:00
Eugene
6fd7e97ef2 Merge pull request #2530 from Eugeny/dependabot/npm_and_yarn/webpack-5.0.0-beta.16 2020-05-06 15:21:05 +02:00
dependabot-preview[bot]
fc821b5abd Bump webpack from 5.0.0-beta.15 to 5.0.0-beta.16
Bumps [webpack](https://github.com/webpack/webpack) from 5.0.0-beta.15 to 5.0.0-beta.16.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.0.0-beta.15...v5.0.0-beta.16)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-06 04:24:13 +00:00
dependabot-preview[bot]
f69a9b38fe Bump xterm from 4.6.0-beta.33 to 4.6.0-beta.41 in /terminus-terminal
Bumps [xterm](https://github.com/xtermjs/xterm.js) from 4.6.0-beta.33 to 4.6.0-beta.41.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-06 04:21:22 +00:00
dependabot-preview[bot]
710b9d79ab Bump node-sass from 4.14.0 to 4.14.1
Bumps [node-sass](https://github.com/sass/node-sass) from 4.14.0 to 4.14.1.
- [Release notes](https://github.com/sass/node-sass/releases)
- [Changelog](https://github.com/sass/node-sass/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sass/node-sass/compare/v4.14.0...v4.14.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-05 04:23:11 +00:00
dependabot-preview[bot]
fddae662c8 Bump @typescript-eslint/parser from 2.29.0 to 2.31.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 2.29.0 to 2.31.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v2.31.0/packages/parser)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-05 04:22:32 +00:00
Eugene Pankov
c3b3a3cea6 notarizer fix 2020-05-04 14:48:46 +02:00
Eugene Pankov
2201cfe142 notarizer fix 2020-05-04 14:19:40 +02:00
dependabot-preview[bot]
a9ae3b2475 Bump graceful-fs from 4.2.2 to 4.2.4
Bumps [graceful-fs](https://github.com/isaacs/node-graceful-fs) from 4.2.2 to 4.2.4.
- [Release notes](https://github.com/isaacs/node-graceful-fs/releases)
- [Commits](https://github.com/isaacs/node-graceful-fs/compare/v4.2.2...v4.2.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-04 04:24:42 +00:00
dependabot-preview[bot]
3238706b25 Bump electron from 8.2.3 to 8.2.5
Bumps [electron](https://github.com/electron/electron) from 8.2.3 to 8.2.5.
- [Release notes](https://github.com/electron/electron/releases)
- [Changelog](https://github.com/electron/electron/blob/master/docs/breaking-changes.md)
- [Commits](https://github.com/electron/electron/compare/v8.2.3...v8.2.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-04 04:24:26 +00:00
dependabot-preview[bot]
a5aec13b7f Bump xterm-addon-search in /terminus-terminal
Bumps [xterm-addon-search](https://github.com/xtermjs/xterm.js) from 0.7.0-beta.1 to 0.7.0-beta.2.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-04 04:19:32 +00:00
Eugene Pankov
454887ad21 fixed DPI change detection - fixes #1746 2020-05-03 01:19:29 +02:00
Eugene Pankov
0ad585d647 don't open second window on app restart when in dock mode (fixes #2449) 2020-05-02 17:23:35 +02:00
Eugene Pankov
5aa3b889f5 fixed SSH tab colors - fixes #2448 2020-05-02 17:09:55 +02:00
Eugene Pankov
d371857fa8 use xterm's own line break fix - fixed #524 2020-05-02 15:45:34 +02:00
Eugene Pankov
e116a42f8b Revert "smart copying for Windows line breaks (fixes #1558)"
This reverts commit fb502bc926.
2020-05-02 15:44:20 +02:00
Eugene Pankov
76acbc6c9f re-added webpack-env 2020-05-02 14:18:50 +02:00
Eugene
572a6e24c4 Merge pull request #2477 from Eugeny/dependabot/npm_and_yarn/shelljs-0.8.4 2020-05-02 14:16:22 +02:00
Eugene
b3731a21ba Merge pull request #2458 from Eugeny/dependabot/npm_and_yarn/sentry/cli-1.52.3 2020-05-02 14:16:12 +02:00
dependabot-preview[bot]
f58ba65d97 Bump shelljs from 0.8.3 to 0.8.4
Bumps [shelljs](https://github.com/shelljs/shelljs) from 0.8.3 to 0.8.4.
- [Release notes](https://github.com/shelljs/shelljs/releases)
- [Changelog](https://github.com/shelljs/shelljs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/shelljs/shelljs/compare/v0.8.3...v0.8.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-02 12:16:02 +00:00
Eugene
45a99bb0cb Merge pull request #2462 from Eugeny/dependabot/npm_and_yarn/app/node-abi-2.16.0 2020-05-02 14:15:15 +02:00
Eugene
ab70be983a Merge pull request #2480 from Eugeny/dependabot/npm_and_yarn/app/keytar-5.6.0 2020-05-02 14:15:03 +02:00
dependabot-preview[bot]
cad1f96df7 Bump node-abi from 2.15.0 to 2.16.0 in /app
Bumps [node-abi](https://github.com/lgeiger/node-abi) from 2.15.0 to 2.16.0.
- [Release notes](https://github.com/lgeiger/node-abi/releases)
- [Commits](https://github.com/lgeiger/node-abi/compare/v2.15.0...v2.16.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-02 12:14:13 +00:00
Eugene
71866521f4 Merge pull request #2479 from Eugeny/dependabot/npm_and_yarn/typedoc-0.17.6 2020-05-02 14:14:01 +02:00
Eugene
56206d4fb8 Merge pull request #2467 from Eugeny/dependabot/npm_and_yarn/node-sass-4.14.0 2020-05-02 14:12:27 +02:00
Eugene
347681d199 Merge pull request #2459 from Eugeny/dependabot/npm_and_yarn/node-abi-2.16.0 2020-05-02 14:12:14 +02:00
Eugene Pankov
e6abdcf3e9 uuid bump 2020-05-02 14:12:01 +02:00
Eugene Pankov
dbae3b66cd removed webpack typings 2020-05-02 14:11:54 +02:00
Eugene Pankov
40ec457d20 Merge branch 'master' of github.com:Eugeny/terminus 2020-05-02 14:10:12 +02:00
Eugene
063caf3bcd Merge pull request #2453 from Eugeny/dependabot/npm_and_yarn/webpack-5.0.0-beta.15 2020-05-02 14:09:36 +02:00
Eugene
9325fd0977 Merge pull request #2464 from Eugeny/dependabot/npm_and_yarn/app/ng-bootstrap/ng-bootstrap-6.1.0 2020-05-02 14:08:35 +02:00
Eugene
6231583590 Merge pull request #2496 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/uuid-8.0.0 2020-05-02 14:08:13 +02:00
Eugene Pankov
fce3a2c822 bumped angular 2020-05-02 14:07:54 +02:00
Eugene
73f45c9a24 Merge pull request #2500 from Eugeny/dependabot/npm_and_yarn/terminus-core/uuid-8.0.0 2020-05-02 14:07:47 +02:00
dependabot-preview[bot]
ca65f23c70 Bump keytar from 5.5.0 to 5.6.0 in /app
Bumps [keytar](https://github.com/atom/node-keytar) from 5.5.0 to 5.6.0.
- [Release notes](https://github.com/atom/node-keytar/releases)
- [Commits](https://github.com/atom/node-keytar/compare/v5.5.0...v5.6.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-02 12:06:13 +00:00
dependabot-preview[bot]
f525398827 Bump @ng-bootstrap/ng-bootstrap from 6.0.2 to 6.1.0 in /app
Bumps [@ng-bootstrap/ng-bootstrap](https://github.com/ng-bootstrap/ng-bootstrap) from 6.0.2 to 6.1.0.
- [Release notes](https://github.com/ng-bootstrap/ng-bootstrap/releases)
- [Changelog](https://github.com/ng-bootstrap/ng-bootstrap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ng-bootstrap/ng-bootstrap/compare/6.0.2...6.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-02 12:06:06 +00:00
Eugene
cf2baa74a8 Merge pull request #2489 from Eugeny/dependabot/npm_and_yarn/terminus-core/electron-updater-4.3.1 2020-05-02 14:05:18 +02:00
Eugene
fbd896d593 Merge pull request #2487 from Eugeny/dependabot/npm_and_yarn/app/electron-updater-4.3.1 2020-05-02 14:04:29 +02:00
Eugene
f747107042 Merge pull request #2474 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-webgl-0.7.0-beta.10
Bump xterm-addon-webgl from 0.7.0-beta.5 to 0.7.0-beta.10 in /terminus-terminal
2020-05-02 14:03:36 +02:00
Eugene
760ad140cd Merge pull request #2476 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-serialize-0.3.0-beta.4 2020-05-02 14:03:25 +02:00
Eugene
a0df434ed2 Merge pull request #2503 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-4.6.0-beta.32 2020-05-02 14:02:56 +02:00
dependabot-preview[bot]
0bcd5cfd8f Bump xterm from 4.6.0-beta.17 to 4.6.0-beta.32 in /terminus-terminal
Bumps [xterm](https://github.com/xtermjs/xterm.js) from 4.6.0-beta.17 to 4.6.0-beta.32.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-05-01 04:16:49 +00:00
dependabot-preview[bot]
e0b71783c0 Bump uuid from 7.0.1 to 8.0.0 in /terminus-core
Bumps [uuid](https://github.com/uuidjs/uuid) from 7.0.1 to 8.0.0.
- [Release notes](https://github.com/uuidjs/uuid/releases)
- [Changelog](https://github.com/uuidjs/uuid/blob/master/CHANGELOG.md)
- [Commits](https://github.com/uuidjs/uuid/compare/v7.0.1...v8.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-30 04:28:12 +00:00
dependabot-preview[bot]
45b76b2d3e Bump uuid from 7.0.1 to 8.0.0 in /terminus-terminal
Bumps [uuid](https://github.com/uuidjs/uuid) from 7.0.1 to 8.0.0.
- [Release notes](https://github.com/uuidjs/uuid/releases)
- [Changelog](https://github.com/uuidjs/uuid/blob/master/CHANGELOG.md)
- [Commits](https://github.com/uuidjs/uuid/compare/v7.0.1...v8.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-30 04:21:00 +00:00
dependabot-preview[bot]
8228c99350 Bump electron-updater from 4.3.0 to 4.3.1 in /terminus-core
Bumps [electron-updater](https://github.com/electron-userland/electron-builder) from 4.3.0 to 4.3.1.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-28 04:28:40 +00:00
dependabot-preview[bot]
c4dbd8180d Bump electron-updater from 4.3.0 to 4.3.1 in /app
Bumps [electron-updater](https://github.com/electron-userland/electron-builder) from 4.3.0 to 4.3.1.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-28 04:21:25 +00:00
dependabot-preview[bot]
d3b1545a1e Bump typedoc from 0.17.4 to 0.17.6
Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.17.4 to 0.17.6.
- [Release notes](https://github.com/TypeStrong/TypeDoc/releases)
- [Commits](https://github.com/TypeStrong/TypeDoc/compare/0.17.4...0.17.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-27 04:21:11 +00:00
dependabot-preview[bot]
57d7936239 Bump xterm-addon-serialize in /terminus-terminal
Bumps xterm-addon-serialize from 0.3.0-beta.3 to 0.3.0-beta.4.

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-27 04:20:02 +00:00
dependabot-preview[bot]
9e5315043d Bump xterm-addon-webgl in /terminus-terminal
Bumps [xterm-addon-webgl](https://github.com/xtermjs/xterm.js) from 0.7.0-beta.5 to 0.7.0-beta.10.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-27 04:19:18 +00:00
dependabot-preview[bot]
89ba81f2e1 Bump node-sass from 4.13.0 to 4.14.0
Bumps [node-sass](https://github.com/sass/node-sass) from 4.13.0 to 4.14.0.
- [Release notes](https://github.com/sass/node-sass/releases)
- [Changelog](https://github.com/sass/node-sass/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sass/node-sass/compare/v4.13.0...v4.14.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-24 04:24:42 +00:00
dependabot-preview[bot]
1ee734cd18 Bump node-abi from 2.15.0 to 2.16.0
Bumps [node-abi](https://github.com/lgeiger/node-abi) from 2.15.0 to 2.16.0.
- [Release notes](https://github.com/lgeiger/node-abi/releases)
- [Commits](https://github.com/lgeiger/node-abi/compare/v2.15.0...v2.16.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-23 04:22:42 +00:00
dependabot-preview[bot]
0bcfb6babf Bump @sentry/cli from 1.52.1 to 1.52.3
Bumps [@sentry/cli](https://github.com/getsentry/sentry-cli) from 1.52.1 to 1.52.3.
- [Release notes](https://github.com/getsentry/sentry-cli/releases)
- [Changelog](https://github.com/getsentry/sentry-cli/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-cli/compare/1.52.1...1.52.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-23 04:21:58 +00:00
dependabot-preview[bot]
fddd9e9db2 Bump webpack from 5.0.0-beta.14 to 5.0.0-beta.15
Bumps [webpack](https://github.com/webpack/webpack) from 5.0.0-beta.14 to 5.0.0-beta.15.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.0.0-beta.14...v5.0.0-beta.15)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-22 04:25:14 +00:00
Eugene
2433fd1442 Merge pull request #2445 from Eugeny/all-contributors/add-Goobles
docs: add Goobles as a contributor
2020-04-21 09:41:34 +02:00
Eugene Pankov
437d832ac1 Merge branch 'master' of github.com:Eugeny/terminus 2020-04-21 09:38:50 +02:00
Eugene
c90aef1dfa Merge pull request #2438 from Goobles/Add-dock-hide-on-blur-option
Add dock hide on blur option
2020-04-21 09:38:35 +02:00
Eugene
2d25f15041 Merge branch 'master' into Add-dock-hide-on-blur-option 2020-04-21 09:38:28 +02:00
allcontributors[bot]
993d5bfd25 docs: update .all-contributorsrc [skip ci] 2020-04-21 07:37:55 +00:00
allcontributors[bot]
4d8681b5ee docs: update README.md [skip ci] 2020-04-21 07:37:54 +00:00
Eugene
1384e26dd8 Merge pull request #2437 from Goobles/dock-always-on-top-toggle
Add dock always on top setting
2020-04-21 09:37:50 +02:00
Eugene Pankov
809bf3360d Merge branch 'master' of github.com:Eugeny/terminus 2020-04-21 09:20:38 +02:00
Eugene
444875b82a Merge pull request #2444 from Eugeny/dependabot/npm_and_yarn/typescript-eslint/parser-2.29.0
Bump @typescript-eslint/parser from 2.27.0 to 2.29.0
2020-04-21 09:20:28 +02:00
Eugene Pankov
c261b64c8e bumped angular 2020-04-21 09:20:25 +02:00
Eugene Pankov
ab1b8a4500 added tab split commands to context menu - fixes #1321 2020-04-21 09:17:26 +02:00
Eugene Pankov
e65d5ba93b fixed webgl renderer (fixes #2439) 2020-04-21 09:09:23 +02:00
dependabot-preview[bot]
6f8ba6b44b Bump @typescript-eslint/parser from 2.27.0 to 2.29.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 2.27.0 to 2.29.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v2.29.0/packages/parser)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-21 04:22:41 +00:00
Gobius Dolhain
aede1c47a2 fix eslint comma-spacing 2020-04-20 19:21:48 +02:00
Gobius Dolhain
7b9ff043ad eslint: fix whitespace 2020-04-20 19:19:41 +02:00
Gobius Dolhain
d759104c76 add dock hide on blur option 2020-04-20 19:01:10 +02:00
Gobius Dolhain
676bbba7a4 Add dock always on top setting 2020-04-20 18:38:02 +02:00
Eugene Pankov
b8d9f6442a re-fixed #517 2020-04-20 15:35:15 +02:00
Eugene Pankov
fc501b5e51 Revert "Bump @typescript-eslint/eslint-plugin from 2.26.0 to 2.28.0"
This reverts commit 9f36258c60.
2020-04-20 11:41:26 +02:00
Eugene
3ddec27b69 Merge pull request #2399 from Eugeny/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-2.28.0
Bump @typescript-eslint/eslint-plugin from 2.26.0 to 2.28.0
2020-04-20 11:26:02 +02:00
Eugene
6574cf6b50 Merge pull request #2426 from Eugeny/dependabot/npm_and_yarn/electron-builder-22.5.1
Bump electron-builder from 22.4.1 to 22.5.1
2020-04-20 11:25:53 +02:00
Eugene Pankov
d36ef2e48e lint 2020-04-20 11:25:20 +02:00
Eugene Pankov
f8645df60c fixed zmodem encoding (fixes #2352) 2020-04-20 10:55:38 +02:00
Eugene
f69942a3a3 Merge pull request #2434 from Eugeny/dependabot/npm_and_yarn/app/angular/core-9.1.2
Bump @angular/core from 9.1.0 to 9.1.2 in /app
2020-04-20 08:52:50 +02:00
dependabot-preview[bot]
a36431a08c Bump @angular/core from 9.1.0 to 9.1.2 in /app
Bumps [@angular/core](https://github.com/angular/angular/tree/HEAD/packages/core) from 9.1.0 to 9.1.2.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/9.1.2/packages/core)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-20 04:18:26 +00:00
Eugene Pankov
f570d7e428 Merge branch 'master' of github.com:Eugeny/terminus 2020-04-19 16:49:19 +02:00
Eugene Pankov
fb502bc926 smart copying for Windows line breaks (fixes #1558) 2020-04-19 16:46:16 +02:00
Eugene Pankov
2e12041688 limit max html copy length 2020-04-19 16:22:54 +02:00
Eugene Pankov
ca444bcf65 fixed #2411 2020-04-19 16:22:48 +02:00
Eugene
da1b7b9a80 Merge pull request #2432 from Eugeny/dependabot/npm_and_yarn/app/angular/compiler-9.1.2
Bump @angular/compiler from 9.1.0 to 9.1.2 in /app
2020-04-19 16:17:03 +02:00
Eugene
e02d458109 Merge pull request #2431 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-fit-0.4.0-beta.8
Bump xterm-addon-fit from 0.4.0-beta2 to 0.4.0-beta.8 in /terminus-terminal
2020-04-19 16:14:10 +02:00
dependabot-preview[bot]
51e1a19e3e Bump @angular/compiler from 9.1.0 to 9.1.2 in /app
Bumps [@angular/compiler](https://github.com/angular/angular/tree/HEAD/packages/compiler) from 9.1.0 to 9.1.2.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/9.1.2/packages/compiler)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-19 14:14:03 +00:00
dependabot-preview[bot]
68869a52e2 Bump xterm-addon-fit in /terminus-terminal
Bumps [xterm-addon-fit](https://github.com/xtermjs/xterm.js) from 0.4.0-beta2 to 0.4.0-beta.8.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-19 14:13:38 +00:00
Eugene
8527c3f531 Merge pull request #2417 from Eugeny/dependabot/npm_and_yarn/style-loader-1.1.4
Bump style-loader from 1.1.3 to 1.1.4
2020-04-19 16:11:14 +02:00
Eugene
4317094f1f Merge pull request #2418 from Eugeny/dependabot/npm_and_yarn/raw-loader-4.0.1
Bump raw-loader from 4.0.0 to 4.0.1
2020-04-19 16:11:07 +02:00
Eugene
00cf7ef67d Merge pull request #2383 from Eugeny/dependabot/npm_and_yarn/terminus-ssh/types/ssh2-0.5.43
Bump @types/ssh2 from 0.5.42 to 0.5.43 in /terminus-ssh
2020-04-19 16:10:43 +02:00
Eugene Pankov
21e7e762cd bumped xterm 2020-04-19 16:06:59 +02:00
Eugene
ebb35cf9be Merge pull request #2385 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-webgl-0.7.0-beta.4
Bump xterm-addon-webgl from 0.6.0-beta.3 to 0.7.0-beta.4 in /terminus-terminal
2020-04-19 15:51:05 +02:00
Eugene
bd7f9a8030 Merge pull request #2384 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-serialize-0.2.0
Bump xterm-addon-serialize from 0.1.2 to 0.2.0 in /terminus-terminal
2020-04-19 15:50:52 +02:00
Eugene
b1e0ed457e Merge pull request #2387 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-4.5.0
Bump xterm from 4.5.0-beta.13 to 4.5.0 in /terminus-terminal
2020-04-19 15:50:34 +02:00
Eugene
59e40d53a1 Merge pull request #2416 from Eugeny/dependabot/npm_and_yarn/app/node-pty-0.10.0-beta8
Bump node-pty from 0.10.0-beta3 to 0.10.0-beta8 in /app
2020-04-19 15:46:12 +02:00
Eugene
666a180f3f Merge pull request #2414 from Eugeny/dependabot/npm_and_yarn/app/angular/platform-browser-dynamic-9.1.2
Bump @angular/platform-browser-dynamic from 9.1.0 to 9.1.2 in /app
2020-04-19 15:45:26 +02:00
Eugene
ffc767c738 Merge pull request #2415 from Eugeny/dependabot/npm_and_yarn/app/keytar-5.5.0
Bump keytar from 5.4.0 to 5.5.0 in /app
2020-04-19 15:45:18 +02:00
dependabot-preview[bot]
49b252f7cf Bump electron-builder from 22.4.1 to 22.5.1
Bumps [electron-builder](https://github.com/electron-userland/electron-builder) from 22.4.1 to 22.5.1.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/commits/v22.5.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-19 13:44:52 +00:00
Eugene
81e9a0c796 Merge pull request #2425 from Eugeny/dependabot/npm_and_yarn/app/angular/common-9.1.2
Bump @angular/common from 9.1.1 to 9.1.2 in /app
2020-04-19 15:44:17 +02:00
Eugene
f3f5b21910 Merge pull request #2427 from Eugeny/dependabot/npm_and_yarn/electron-8.2.3
Bump electron from 8.2.1 to 8.2.3
2020-04-19 15:42:51 +02:00
Eugene Pankov
b29ab2690f WSL2 support - fixes #271 2020-04-19 14:56:31 +02:00
Eugene Pankov
f58cab0820 fixed window toggling with multiple windows (fixes #619) 2020-04-19 11:47:31 +02:00
dependabot-preview[bot]
b21631acd8 Bump electron from 8.2.1 to 8.2.3
Bumps [electron](https://github.com/electron/electron) from 8.2.1 to 8.2.3.
- [Release notes](https://github.com/electron/electron/releases)
- [Changelog](https://github.com/electron/electron/blob/master/docs/breaking-changes.md)
- [Commits](https://github.com/electron/electron/compare/v8.2.1...v8.2.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-17 04:20:41 +00:00
dependabot-preview[bot]
52258f9949 Bump @angular/common from 9.1.1 to 9.1.2 in /app
Bumps [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) from 9.1.1 to 9.1.2.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/9.1.2/packages/common)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-17 04:19:35 +00:00
dependabot-preview[bot]
1308e842ce Bump raw-loader from 4.0.0 to 4.0.1
Bumps [raw-loader](https://github.com/webpack-contrib/raw-loader) from 4.0.0 to 4.0.1.
- [Release notes](https://github.com/webpack-contrib/raw-loader/releases)
- [Changelog](https://github.com/webpack-contrib/raw-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/raw-loader/compare/v4.0.0...v4.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-16 04:23:49 +00:00
dependabot-preview[bot]
c4ba51f4ee Bump style-loader from 1.1.3 to 1.1.4
Bumps [style-loader](https://github.com/webpack-contrib/style-loader) from 1.1.3 to 1.1.4.
- [Release notes](https://github.com/webpack-contrib/style-loader/releases)
- [Changelog](https://github.com/webpack-contrib/style-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/style-loader/compare/v1.1.3...v1.1.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-16 04:23:10 +00:00
dependabot-preview[bot]
65d411b00d Bump node-pty from 0.10.0-beta3 to 0.10.0-beta8 in /app
Bumps [node-pty](https://github.com/Tyriar/node-pty) from 0.10.0-beta3 to 0.10.0-beta8.
- [Release notes](https://github.com/Tyriar/node-pty/releases)
- [Commits](https://github.com/Tyriar/node-pty/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-16 04:23:09 +00:00
dependabot-preview[bot]
52d596b01b Bump keytar from 5.4.0 to 5.5.0 in /app
Bumps [keytar](https://github.com/atom/node-keytar) from 5.4.0 to 5.5.0.
- [Release notes](https://github.com/atom/node-keytar/releases)
- [Commits](https://github.com/atom/node-keytar/compare/v5.4.0...v5.5.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-16 04:22:32 +00:00
dependabot-preview[bot]
1607dd90ba Bump @angular/platform-browser-dynamic from 9.1.0 to 9.1.2 in /app
Bumps [@angular/platform-browser-dynamic](https://github.com/angular/angular/tree/HEAD/packages/platform-browser-dynamic) from 9.1.0 to 9.1.2.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/9.1.2/packages/platform-browser-dynamic)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-16 04:22:00 +00:00
Eugene
11767f7d27 Merge pull request #2407 from Eugeny/dependabot/npm_and_yarn/app/angular/platform-browser-9.1.1
Bump @angular/platform-browser from 9.1.0 to 9.1.1 in /app
2020-04-15 08:55:31 +02:00
dependabot-preview[bot]
7cbcf6844d Bump @angular/platform-browser from 9.1.0 to 9.1.1 in /app
Bumps [@angular/platform-browser](https://github.com/angular/angular/tree/HEAD/packages/platform-browser) from 9.1.0 to 9.1.1.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/9.1.1/packages/platform-browser)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-15 04:21:00 +00:00
dependabot-preview[bot]
9f36258c60 Bump @typescript-eslint/eslint-plugin from 2.26.0 to 2.28.0
Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 2.26.0 to 2.28.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v2.28.0/packages/eslint-plugin)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-14 04:21:13 +00:00
dependabot-preview[bot]
8f964ffc37 Bump xterm from 4.5.0-beta.13 to 4.5.0 in /terminus-terminal
Bumps [xterm](https://github.com/xtermjs/xterm.js) from 4.5.0-beta.13 to 4.5.0.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/commits/4.5.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-13 04:19:30 +00:00
dependabot-preview[bot]
4c137996ff Bump xterm-addon-webgl in /terminus-terminal
Bumps [xterm-addon-webgl](https://github.com/xtermjs/xterm.js) from 0.6.0-beta.3 to 0.7.0-beta.4.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-13 04:18:42 +00:00
dependabot-preview[bot]
966bd5f917 Bump xterm-addon-serialize from 0.1.2 to 0.2.0 in /terminus-terminal
Bumps xterm-addon-serialize from 0.1.2 to 0.2.0.

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-13 04:18:15 +00:00
dependabot-preview[bot]
b55011d595 Bump @types/ssh2 from 0.5.42 to 0.5.43 in /terminus-ssh
Bumps [@types/ssh2](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/ssh2) from 0.5.42 to 0.5.43.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/ssh2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-13 04:16:58 +00:00
Eugene
38bd59641e Merge pull request #2366 from Eugeny/dependabot/npm_and_yarn/app/angular/forms-9.1.1
Bump @angular/forms from 9.1.0 to 9.1.1 in /app
2020-04-11 15:06:11 +02:00
Eugene
c449b60940 Merge pull request #2361 from Eugeny/dependabot/npm_and_yarn/app/angular/common-9.1.1
Bump @angular/common from 9.1.0 to 9.1.1 in /app
2020-04-11 15:06:02 +02:00
Eugene
ee618cdd1f Merge pull request #2378 from Eugeny/dependabot/npm_and_yarn/terminus-plugin-manager/semver-7.2.2
Bump semver from 7.1.1 to 7.2.2 in /terminus-plugin-manager
2020-04-11 15:05:56 +02:00
Eugene
a5bddc21bb Merge pull request #2342 from Eugeny/dependabot/npm_and_yarn/app/rxjs-compat-6.5.5
Bump rxjs-compat from 6.5.4 to 6.5.5 in /app
2020-04-11 15:05:49 +02:00
dependabot-preview[bot]
35bf195f42 Bump rxjs-compat from 6.5.4 to 6.5.5 in /app
Bumps rxjs-compat from 6.5.4 to 6.5.5.

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-11 13:05:22 +00:00
Eugene
044c2dda0e Merge pull request #2329 from Eugeny/dependabot/npm_and_yarn/terminus-ssh/types/ssh2-0.5.42
Bump @types/ssh2 from 0.5.41 to 0.5.42 in /terminus-ssh
2020-04-11 15:05:04 +02:00
Eugene
9f2a70fc88 Merge pull request #2336 from Eugeny/dependabot/npm_and_yarn/app/ngx-toastr-12.0.1
Bump ngx-toastr from 12.0.0 to 12.0.1 in /app
2020-04-11 15:04:32 +02:00
dependabot-preview[bot]
409476c729 Bump semver from 7.1.1 to 7.2.2 in /terminus-plugin-manager
Bumps [semver](https://github.com/npm/node-semver) from 7.1.1 to 7.2.2.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/master/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v7.1.1...v7.2.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-11 13:04:30 +00:00
Eugene
91f8f25d26 Merge pull request #2338 from Eugeny/dependabot/npm_and_yarn/terminus-core/electron-updater-4.3.0
Bump electron-updater from 4.2.5 to 4.3.0 in /terminus-core
2020-04-11 15:04:12 +02:00
Eugene
f853839939 Merge pull request #2337 from Eugeny/dependabot/npm_and_yarn/app/electron-updater-4.3.0
Bump electron-updater from 4.2.5 to 4.3.0 in /app
2020-04-11 15:04:06 +02:00
Eugene
6099b44723 Merge pull request #2341 from Eugeny/dependabot/npm_and_yarn/app/rxjs-6.5.5
Bump rxjs from 6.5.4 to 6.5.5 in /app
2020-04-11 15:03:47 +02:00
Eugene
e4e8140145 Merge pull request #2351 from Eugeny/dependabot/npm_and_yarn/typedoc-0.17.4
Bump typedoc from 0.17.3 to 0.17.4
2020-04-11 15:03:01 +02:00
Eugene
8b34ab5102 Merge pull request #2356 from Eugeny/dependabot/npm_and_yarn/typescript-eslint/parser-2.27.0
Bump @typescript-eslint/parser from 2.25.0 to 2.27.0
2020-04-11 15:02:48 +02:00
Eugene
6dc987163d Merge pull request #2372 from Eugeny/dependabot/npm_and_yarn/core-js-3.6.5
Bump core-js from 3.6.4 to 3.6.5
2020-04-11 15:01:31 +02:00
Eugene
a082c71a52 Merge pull request #2373 from Eugeny/dependabot/npm_and_yarn/val-loader-2.1.1
Bump val-loader from 2.1.0 to 2.1.1
2020-04-11 15:01:24 +02:00
Eugene
cc37725014 Merge pull request #2374 from Eugeny/dependabot/npm_and_yarn/terminus-core/core-js-3.6.5
Bump core-js from 3.6.4 to 3.6.5 in /terminus-core
2020-04-11 15:01:16 +02:00
Eugene Pankov
c6fd86dca6 lint 2020-04-11 14:34:32 +02:00
Eugene Pankov
7f55d6f1e2 ssh jump hosts - fixes #737 2020-04-11 14:26:20 +02:00
Eugene Pankov
129a7c1a09 use the new selector for profiles 2020-04-11 12:37:46 +02:00
Eugene Pankov
4969c4e2fc option to hide default profiles - fixes #2078 2020-04-11 11:43:55 +02:00
dependabot-preview[bot]
d290fbe933 Bump core-js from 3.6.4 to 3.6.5 in /terminus-core
Bumps [core-js](https://github.com/zloirock/core-js) from 3.6.4 to 3.6.5.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/v3.6.5/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/v3.6.4...v3.6.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-10 04:32:01 +00:00
dependabot-preview[bot]
358d3d82d6 Bump val-loader from 2.1.0 to 2.1.1
Bumps [val-loader](https://github.com/webpack-contrib/val-loader) from 2.1.0 to 2.1.1.
- [Release notes](https://github.com/webpack-contrib/val-loader/releases)
- [Changelog](https://github.com/webpack-contrib/val-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/val-loader/compare/v2.1.0...v2.1.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-10 04:20:18 +00:00
dependabot-preview[bot]
9b560c79ab Bump core-js from 3.6.4 to 3.6.5
Bumps [core-js](https://github.com/zloirock/core-js) from 3.6.4 to 3.6.5.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/v3.6.5/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/v3.6.4...v3.6.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-10 04:19:45 +00:00
dependabot-preview[bot]
8b58bc420d Bump @angular/forms from 9.1.0 to 9.1.1 in /app
Bumps [@angular/forms](https://github.com/angular/angular/tree/HEAD/packages/forms) from 9.1.0 to 9.1.1.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/9.1.1/packages/forms)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-09 04:19:28 +00:00
Eugene
78a74ffe1b Merge pull request #2357 from Eugeny/dependabot/npm_and_yarn/electron-8.2.1
Bump electron from 8.2.0 to 8.2.1
2020-04-08 11:39:17 +02:00
Eugene
565c675ce1 Merge pull request #2365 from Eugeny/all-contributors/add-orin220444
docs: add orin220444 as a contributor
2020-04-08 11:36:48 +02:00
Eugene
a25a13188d Merge pull request #2364 from orin220444/master
Add an author and license fields
2020-04-08 11:34:46 +02:00
allcontributors[bot]
2daf85f753 docs: update .all-contributorsrc [skip ci] 2020-04-08 09:34:46 +00:00
allcontributors[bot]
3189258fbb docs: update README.md [skip ci] 2020-04-08 09:34:45 +00:00
Orin Serimon
d678bf68c5 add an author field 2020-04-08 16:23:29 +07:00
dependabot-preview[bot]
9498b17b98 Bump @angular/common from 9.1.0 to 9.1.1 in /app
Bumps [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) from 9.1.0 to 9.1.1.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/9.1.1/packages/common)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-08 04:22:00 +00:00
orin220444
b48a335aed Add a repository field 2020-04-08 00:17:21 +07:00
dependabot-preview[bot]
71488e749a Bump electron from 8.2.0 to 8.2.1
Bumps [electron](https://github.com/electron/electron) from 8.2.0 to 8.2.1.
- [Release notes](https://github.com/electron/electron/releases)
- [Changelog](https://github.com/electron/electron/blob/master/docs/breaking-changes.md)
- [Commits](https://github.com/electron/electron/compare/v8.2.0...v8.2.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-07 04:26:08 +00:00
dependabot-preview[bot]
0f1cbfa3ee Bump @typescript-eslint/parser from 2.25.0 to 2.27.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 2.25.0 to 2.27.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v2.27.0/packages/parser)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-07 04:25:32 +00:00
dependabot-preview[bot]
32d33bf85e Bump typedoc from 0.17.3 to 0.17.4
Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.17.3 to 0.17.4.
- [Release notes](https://github.com/TypeStrong/TypeDoc/releases)
- [Commits](https://github.com/TypeStrong/TypeDoc/compare/0.17.3...0.17.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-06 04:19:57 +00:00
dependabot-preview[bot]
c7f1aa895d Bump rxjs from 6.5.4 to 6.5.5 in /app
Bumps [rxjs](https://github.com/reactivex/rxjs) from 6.5.4 to 6.5.5.
- [Release notes](https://github.com/reactivex/rxjs/releases)
- [Changelog](https://github.com/ReactiveX/rxjs/blob/6.5.5/CHANGELOG.md)
- [Commits](https://github.com/reactivex/rxjs/compare/6.5.4...6.5.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-03 04:18:12 +00:00
dependabot-preview[bot]
675bc3d281 Bump electron-updater from 4.2.5 to 4.3.0 in /terminus-core
Bumps [electron-updater](https://github.com/electron-userland/electron-builder) from 4.2.5 to 4.3.0.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-02 04:26:29 +00:00
dependabot-preview[bot]
c63ba8c22b Bump electron-updater from 4.2.5 to 4.3.0 in /app
Bumps [electron-updater](https://github.com/electron-userland/electron-builder) from 4.2.5 to 4.3.0.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-02 04:22:51 +00:00
dependabot-preview[bot]
e9be73226e Bump ngx-toastr from 12.0.0 to 12.0.1 in /app
Bumps [ngx-toastr](https://github.com/scttcper/ngx-toastr) from 12.0.0 to 12.0.1.
- [Release notes](https://github.com/scttcper/ngx-toastr/releases)
- [Commits](https://github.com/scttcper/ngx-toastr/compare/v12.0.0...v12.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-02 04:22:18 +00:00
dependabot-preview[bot]
4a72e554b6 Bump @types/ssh2 from 0.5.41 to 0.5.42 in /terminus-ssh
Bumps [@types/ssh2](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/ssh2) from 0.5.41 to 0.5.42.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/ssh2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-01 04:16:03 +00:00
Eugene
33bb3b0722 Merge pull request #2324 from Eugeny/dependabot/npm_and_yarn/eslint-plugin-import-2.20.2
Bump eslint-plugin-import from 2.20.1 to 2.20.2
2020-03-30 20:19:52 +02:00
dependabot-preview[bot]
46b4288c98 Bump eslint-plugin-import from 2.20.1 to 2.20.2
Bumps [eslint-plugin-import](https://github.com/benmosher/eslint-plugin-import) from 2.20.1 to 2.20.2.
- [Release notes](https://github.com/benmosher/eslint-plugin-import/releases)
- [Changelog](https://github.com/benmosher/eslint-plugin-import/blob/master/CHANGELOG.md)
- [Commits](https://github.com/benmosher/eslint-plugin-import/compare/v2.20.1...v2.20.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-30 18:05:18 +00:00
Eugene
9477117236 Merge pull request #2323 from Eugeny/dependabot/npm_and_yarn/sentry/cli-1.52.1
Bump @sentry/cli from 1.51.1 to 1.52.1
2020-03-30 20:04:31 +02:00
Eugene
33e048238e Merge pull request #2302 from Eugeny/dependabot/npm_and_yarn/terminus-core/types/js-yaml-3.12.3
Bump @types/js-yaml from 3.12.2 to 3.12.3 in /terminus-core
2020-03-30 20:04:07 +02:00
Eugene
5895d42444 Merge pull request #2300 from Eugeny/dependabot/npm_and_yarn/types/js-yaml-3.12.3
Bump @types/js-yaml from 3.12.1 to 3.12.3
2020-03-30 20:04:02 +02:00
dependabot-preview[bot]
5d6abca503 Bump @sentry/cli from 1.51.1 to 1.52.1
Bumps [@sentry/cli](https://github.com/getsentry/sentry-cli) from 1.51.1 to 1.52.1.
- [Release notes](https://github.com/getsentry/sentry-cli/releases)
- [Changelog](https://github.com/getsentry/sentry-cli/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-cli/compare/1.51.1...1.52.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-30 18:03:56 +00:00
Eugene
8ca91af927 Merge pull request #2322 from Eugeny/dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-2.26.0
Bump @typescript-eslint/eslint-plugin from 2.24.0 to 2.26.0
2020-03-30 20:03:53 +02:00
Eugene
c886fd6915 Merge pull request #2304 from Eugeny/dependabot/npm_and_yarn/app/angular/compiler-9.1.0
Bump @angular/compiler from 9.0.7 to 9.1.0 in /app
2020-03-30 20:03:29 +02:00
dependabot-preview[bot]
e403ca6eff Bump @typescript-eslint/eslint-plugin from 2.24.0 to 2.26.0
Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 2.24.0 to 2.26.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v2.26.0/packages/eslint-plugin)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-30 18:03:14 +00:00
dependabot-preview[bot]
8f1b401137 Bump @angular/compiler from 9.0.7 to 9.1.0 in /app
Bumps [@angular/compiler](https://github.com/angular/angular/tree/HEAD/packages/compiler) from 9.0.7 to 9.1.0.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/9.1.0/packages/compiler)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-30 18:02:54 +00:00
Eugene
0952899204 Merge pull request #2295 from Eugeny/dependabot/npm_and_yarn/app/ng-bootstrap/ng-bootstrap-6.0.2
Bump @ng-bootstrap/ng-bootstrap from 6.0.0 to 6.0.2 in /app
2020-03-30 20:02:38 +02:00
Eugene
a11c643e41 Merge pull request #2292 from Eugeny/dependabot/npm_and_yarn/yaml-loader-0.6.0
Bump yaml-loader from 0.5.0 to 0.6.0
2020-03-30 20:02:29 +02:00
dependabot-preview[bot]
17fbdeafac Bump @ng-bootstrap/ng-bootstrap from 6.0.0 to 6.0.2 in /app
Bumps [@ng-bootstrap/ng-bootstrap](https://github.com/ng-bootstrap/ng-bootstrap) from 6.0.0 to 6.0.2.
- [Release notes](https://github.com/ng-bootstrap/ng-bootstrap/releases)
- [Changelog](https://github.com/ng-bootstrap/ng-bootstrap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ng-bootstrap/ng-bootstrap/compare/6.0.0...6.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-30 18:02:07 +00:00
Eugene
06e09f3a45 Merge pull request #2291 from Eugeny/dependabot/npm_and_yarn/typedoc-0.17.3
Bump typedoc from 0.17.0 to 0.17.3
2020-03-30 20:02:02 +02:00
Eugene
4fa63aa939 Merge pull request #2296 from Eugeny/dependabot/npm_and_yarn/fortawesome/fontawesome-free-5.13.0
Bump @fortawesome/fontawesome-free from 5.12.1 to 5.13.0
2020-03-30 20:01:39 +02:00
Eugene
46622cd5d9 Merge pull request #2297 from Eugeny/dependabot/npm_and_yarn/typescript-eslint/parser-2.25.0
Bump @typescript-eslint/parser from 2.24.0 to 2.25.0
2020-03-30 20:01:13 +02:00
Eugene
6d3aace1c9 Merge pull request #2299 from Eugeny/dependabot/npm_and_yarn/electron-8.2.0
Bump electron from 8.1.1 to 8.2.0
2020-03-30 20:01:06 +02:00
Eugene Pankov
e3a569be18 Update package.json 2020-03-30 20:00:27 +02:00
Eugene
2a256ef2bd Merge pull request #2316 from Eugeny/dependabot/npm_and_yarn/app/angular/common-9.1.0
Bump @angular/common from 9.0.7 to 9.1.0 in /app
2020-03-30 19:59:47 +02:00
Eugene
4f3fcc8b22 Merge pull request #2318 from CyrilTaylor/dev/serial.narrow_down_the_margin
narrow down the margin of serial tab
2020-03-30 11:03:05 +02:00
Eugene Pankov
045cc0d243 fixed serial modal crash (#2278) 2020-03-30 11:00:48 +02:00
Cyril Taylor
51e33abbe6 narrow down the margin of serial tab 2020-03-30 16:48:35 +08:00
dependabot-preview[bot]
4900c043ca Bump @angular/common from 9.0.7 to 9.1.0 in /app
Bumps [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) from 9.0.7 to 9.1.0.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/9.1.0/packages/common)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-30 04:18:50 +00:00
Eugene Pankov
09d55979ce made warnOnMultilinePaste optional (fixes #2309) 2020-03-29 01:07:08 +01:00
Eugene Pankov
5d431fa9cf disable progress detection when alt buffer is active 2020-03-25 22:59:44 +01:00
Eugene Pankov
113573b2d2 warn on multi-line paste (fixed #2131) 2020-03-25 22:42:15 +01:00
Eugene Pankov
2c3d93608b hotkey to reopen last tab (fixes #2239) 2020-03-25 22:18:24 +01:00
Eugene Pankov
d38af18582 added selection color customization (fixes #2249) 2020-03-25 22:05:25 +01:00
Eugene Pankov
140f7c51f4 fixed #1930 2020-03-25 21:55:20 +01:00
Eugene Pankov
ffa4350420 search direction buttons (fixes #2251) 2020-03-25 21:51:00 +01:00
dependabot-preview[bot]
99737323de Bump @types/js-yaml from 3.12.2 to 3.12.3 in /terminus-core
Bumps [@types/js-yaml](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/js-yaml) from 3.12.2 to 3.12.3.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/js-yaml)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-25 04:30:48 +00:00
dependabot-preview[bot]
e9e2429632 Bump @types/js-yaml from 3.12.1 to 3.12.3
Bumps [@types/js-yaml](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/js-yaml) from 3.12.1 to 3.12.3.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/js-yaml)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-25 04:23:50 +00:00
dependabot-preview[bot]
07597ac79a Bump electron from 8.1.1 to 8.2.0
Bumps [electron](https://github.com/electron/electron) from 8.1.1 to 8.2.0.
- [Release notes](https://github.com/electron/electron/releases)
- [Changelog](https://github.com/electron/electron/blob/master/docs/breaking-changes.md)
- [Commits](https://github.com/electron/electron/compare/v8.1.1...v8.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-25 04:23:32 +00:00
dependabot-preview[bot]
248ec60612 Bump @typescript-eslint/parser from 2.24.0 to 2.25.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 2.24.0 to 2.25.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v2.25.0/packages/parser)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-24 04:24:24 +00:00
dependabot-preview[bot]
726847d5df Bump @fortawesome/fontawesome-free from 5.12.1 to 5.13.0
Bumps [@fortawesome/fontawesome-free](https://github.com/FortAwesome/Font-Awesome) from 5.12.1 to 5.13.0.
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/master/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/5.12.1...5.13.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-24 04:23:13 +00:00
Eugene Pankov
6065a95132 fixed #2294 2020-03-23 21:15:36 +01:00
dependabot-preview[bot]
e1259475d2 Bump yaml-loader from 0.5.0 to 0.6.0
Bumps [yaml-loader](https://github.com/eemeli/yaml-loader) from 0.5.0 to 0.6.0.
- [Release notes](https://github.com/eemeli/yaml-loader/releases)
- [Commits](https://github.com/eemeli/yaml-loader/compare/v0.5.0...v0.6.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-23 04:22:22 +00:00
dependabot-preview[bot]
ee018e7c02 Bump typedoc from 0.17.0 to 0.17.3
Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.17.0 to 0.17.3.
- [Release notes](https://github.com/TypeStrong/TypeDoc/releases)
- [Commits](https://github.com/TypeStrong/TypeDoc/compare/0.17.0...0.17.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-23 04:21:49 +00:00
Eugene Pankov
db43381f0d use new selector in serial plugin 2020-03-23 01:12:46 +01:00
Eugene Pankov
28c58d4ec0 new ssh connection selector - fixes #1557 2020-03-23 00:39:31 +01:00
Eugene Pankov
68efe2b3c4 fixed #2285 2020-03-22 23:19:48 +01:00
Eugene Pankov
795979be07 color scheme previews (fixes #2286) 2020-03-22 23:17:25 +01:00
Eugene Pankov
c87a1b92d3 Merge branch 'master' of github.com:Eugeny/terminus 2020-03-22 21:36:33 +01:00
Eugene Pankov
2548ad6605 bumped angular 2020-03-22 21:36:24 +01:00
Eugene
b6519c6626 Merge pull request #2273 from Eugeny/dependabot/npm_and_yarn/app/zone.js-0.10.3
Bump zone.js from 0.10.2 to 0.10.3 in /app
2020-03-22 21:33:07 +01:00
Eugene Pankov
2b8bb47aed lint 2020-03-19 12:47:38 +01:00
dependabot-preview[bot]
bbf332171e Bump zone.js from 0.10.2 to 0.10.3 in /app
Bumps [zone.js](https://github.com/angular/angular/tree/HEAD/packages/zone.js) from 0.10.2 to 0.10.3.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/master/packages/zone.js/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/HEAD/packages/zone.js)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-18 04:19:26 +00:00
Eugene
ef5c9b52a5 Merge pull request #2259 from Eugeny/dependabot/npm_and_yarn/terminus-ssh/types/ssh2-0.5.41
Bump @types/ssh2 from 0.5.40 to 0.5.41 in /terminus-ssh
2020-03-17 09:44:27 +01:00
Eugene
4632523d70 Merge pull request #2266 from Eugeny/dependabot/npm_and_yarn/app/yargs-15.3.1
Bump yargs from 15.1.0 to 15.3.1 in /app
2020-03-17 09:43:13 +01:00
Eugene Pankov
56b996e6e4 word separator setting (fixes #508) 2020-03-16 22:52:50 +01:00
Eugene Pankov
0ca0996493 close forwarded ports when session dies (fixes #2143) 2020-03-16 22:47:26 +01:00
dependabot-preview[bot]
e1a8e72742 Bump yargs from 15.1.0 to 15.3.1 in /app
Bumps [yargs](https://github.com/yargs/yargs) from 15.1.0 to 15.3.1.
- [Release notes](https://github.com/yargs/yargs/releases)
- [Changelog](https://github.com/yargs/yargs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/yargs/yargs/compare/v15.1.0...v15.3.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-16 21:43:43 +00:00
Eugene Pankov
50959f4490 lint 2020-03-16 22:41:59 +01:00
Eugene Pankov
baaebb402e private service constructors 2020-03-16 22:30:11 +01:00
Eugene Pankov
9e862772eb made welcome page scrollable (fixes #2253) 2020-03-16 21:54:55 +01:00
Eugene Pankov
6cb5505ded better tab recovery (fixes #501, fixes #2214, fixes #2185) 2020-03-16 21:40:22 +01:00
Eugene Pankov
eb0d8615e1 Merge branch 'master' of github.com:Eugeny/terminus 2020-03-16 21:36:37 +01:00
Eugene
f2885c2fce Merge pull request #2269 from Eugeny/dependabot/npm_and_yarn/terminus-ssh/ssh2-0.8.9
Bump ssh2 from 0.8.8 to 0.8.9 in /terminus-ssh
2020-03-16 21:36:16 +01:00
dependabot-preview[bot]
c04018bc70 Bump ssh2 from 0.8.8 to 0.8.9 in /terminus-ssh
Bumps [ssh2](https://github.com/mscdex/ssh2) from 0.8.8 to 0.8.9.
- [Release notes](https://github.com/mscdex/ssh2/releases)
- [Commits](https://github.com/mscdex/ssh2/compare/v0.8.8...v0.8.9)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-16 20:29:34 +00:00
Eugene Pankov
3e5032ca8b Update yarn.lock 2020-03-16 21:28:33 +01:00
Eugene
a5014243d9 Merge pull request #2268 from Eugeny/dependabot/npm_and_yarn/terminus-ssh/ssh2-streams-0.4.10
Bump ssh2-streams from 0.4.9 to 0.4.10 in /terminus-ssh
2020-03-16 21:28:20 +01:00
dependabot-preview[bot]
2692eb141c Bump ssh2-streams from 0.4.9 to 0.4.10 in /terminus-ssh
Bumps [ssh2-streams](https://github.com/mscdex/ssh2-streams) from 0.4.9 to 0.4.10.
- [Release notes](https://github.com/mscdex/ssh2-streams/releases)
- [Commits](https://github.com/mscdex/ssh2-streams/compare/v0.4.9...v0.4.10)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-16 20:25:46 +00:00
Eugene Pankov
b447f1d52e bumped angular 2020-03-16 21:24:07 +01:00
Eugene
606b9af3f1 Merge pull request #2229 from Eugeny/dependabot/npm_and_yarn/electron-8.1.1
Bump electron from 8.0.2 to 8.1.1
2020-03-16 21:21:24 +01:00
dependabot-preview[bot]
3deab9af24 Bump electron from 8.0.2 to 8.1.1
Bumps [electron](https://github.com/electron/electron) from 8.0.2 to 8.1.1.
- [Release notes](https://github.com/electron/electron/releases)
- [Changelog](https://github.com/electron/electron/blob/master/docs/breaking-changes.md)
- [Commits](https://github.com/electron/electron/compare/v8.0.2...v8.1.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-16 20:20:56 +00:00
Eugene
afab0c5cde Merge pull request #2265 from Eugeny/dependabot/npm_and_yarn/app/angular/core-9.0.6
Bump @angular/core from 9.0.4 to 9.0.6 in /app
2020-03-16 21:20:34 +01:00
dependabot-preview[bot]
e1a03f0dfb Bump @angular/core from 9.0.4 to 9.0.6 in /app
Bumps [@angular/core](https://github.com/angular/angular/tree/HEAD/packages/core) from 9.0.4 to 9.0.6.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/9.0.6/packages/core)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-16 20:20:28 +00:00
Eugene
bfe8dfab02 Merge pull request #2145 from Eugeny/dependabot/npm_and_yarn/app/ngx-toastr-12.0.0
Bump ngx-toastr from 10.2.0 to 12.0.0 in /app
2020-03-16 21:20:27 +01:00
Eugene
a4335edc07 Merge pull request #2221 from Eugeny/dependabot/npm_and_yarn/cross-env-7.0.2
Bump cross-env from 7.0.0 to 7.0.2
2020-03-16 21:20:18 +01:00
Eugene
8613698be9 Merge pull request #2231 from Eugeny/dependabot/npm_and_yarn/typescript-eslint/parser-2.23.0
Bump @typescript-eslint/parser from 2.21.0 to 2.23.0
2020-03-16 21:20:06 +01:00
Eugene
731ddc3e28 Merge pull request #2235 from Eugeny/dependabot/npm_and_yarn/electron-rebuild-1.10.1
Bump electron-rebuild from 1.9.0 to 1.10.1
2020-03-16 21:19:55 +01:00
Eugene
2303e32256 Merge pull request #2244 from Eugeny/dependabot/npm_and_yarn/electron-builder-22.4.1
Bump electron-builder from 22.3.6 to 22.4.1
2020-03-16 21:18:57 +01:00
Eugene
9064f123b3 Merge pull request #2242 from Eugeny/dependabot/npm_and_yarn/app/angular/common-9.0.6
Bump @angular/common from 9.0.4 to 9.0.6 in /app
2020-03-16 21:18:19 +01:00
Eugene
9d3ee4a612 Merge pull request #2243 from Eugeny/dependabot/npm_and_yarn/terminus-core/electron-updater-4.2.5
Bump electron-updater from 4.2.2 to 4.2.5 in /terminus-core
2020-03-16 21:18:10 +01:00
Eugene
20602eed6d Merge pull request #2245 from Eugeny/dependabot/npm_and_yarn/app/electron-updater-4.2.5
Bump electron-updater from 4.2.2 to 4.2.5 in /app
2020-03-16 21:18:02 +01:00
Eugene
f2cd86738c Merge pull request #2260 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-4.5.0-beta.13
Bump xterm from 4.5.0-beta.9 to 4.5.0-beta.13 in /terminus-terminal
2020-03-16 21:17:38 +01:00
Eugene
fc55446342 Merge pull request #2248 from Eugeny/dependabot/npm_and_yarn/app/angular/forms-9.0.6
Bump @angular/forms from 9.0.4 to 9.0.6 in /app
2020-03-16 21:17:13 +01:00
Eugene
dbc12c06cb Merge pull request #2261 from Eugeny/dependabot/npm_and_yarn/app/angular/platform-browser-dynamic-9.0.6
Bump @angular/platform-browser-dynamic from 9.0.4 to 9.0.6 in /app
2020-03-16 21:16:44 +01:00
Eugene
efb551cd94 Merge pull request #2262 from Eugeny/dependabot/npm_and_yarn/typedoc-0.17.0
Bump typedoc from 0.16.10 to 0.17.0
2020-03-16 21:16:16 +01:00
dependabot-preview[bot]
a87c1aa864 Bump typedoc from 0.16.10 to 0.17.0
Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.16.10 to 0.17.0.
- [Release notes](https://github.com/TypeStrong/TypeDoc/releases)
- [Commits](https://github.com/TypeStrong/TypeDoc/compare/v0.16.10...0.17)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-16 04:19:54 +00:00
dependabot-preview[bot]
555f55592a Bump @angular/platform-browser-dynamic from 9.0.4 to 9.0.6 in /app
Bumps [@angular/platform-browser-dynamic](https://github.com/angular/angular/tree/HEAD/packages/platform-browser-dynamic) from 9.0.4 to 9.0.6.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/9.0.6/packages/platform-browser-dynamic)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-16 04:19:37 +00:00
dependabot-preview[bot]
ab46739986 Bump xterm from 4.5.0-beta.9 to 4.5.0-beta.13 in /terminus-terminal
Bumps [xterm](https://github.com/xtermjs/xterm.js) from 4.5.0-beta.9 to 4.5.0-beta.13.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-16 04:18:49 +00:00
dependabot-preview[bot]
7ac7958462 Bump @types/ssh2 from 0.5.40 to 0.5.41 in /terminus-ssh
Bumps [@types/ssh2](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/ssh2) from 0.5.40 to 0.5.41.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/ssh2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-16 04:18:29 +00:00
dependabot-preview[bot]
46d5dace8f Bump @angular/forms from 9.0.4 to 9.0.6 in /app
Bumps [@angular/forms](https://github.com/angular/angular/tree/HEAD/packages/forms) from 9.0.4 to 9.0.6.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/9.0.6/packages/forms)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-13 04:18:09 +00:00
Eugene Pankov
aace3f42d0 allow disabling ssh dynamic tab title (fixes #2240, fixes #2027) 2020-03-12 18:17:36 +01:00
Eugene
c4297f2b2b Merge pull request #2241 from nstefanou/master
Have multiple recent connections in history instead of just one
2020-03-12 15:00:51 +01:00
Nikolaos Stefanou
3c90e904fc fixed logic bug when deleting from history 2020-03-12 09:12:57 +00:00
dependabot-preview[bot]
f8c8065e4a Bump electron-builder from 22.3.6 to 22.4.1
Bumps [electron-builder](https://github.com/electron-userland/electron-builder) from 22.3.6 to 22.4.1.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-12 04:21:01 +00:00
dependabot-preview[bot]
d45a5a35d8 Bump electron-updater from 4.2.2 to 4.2.5 in /app
Bumps [electron-updater](https://github.com/electron-userland/electron-builder) from 4.2.2 to 4.2.5.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/compare/v4.2.2...v4.2.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-12 04:21:01 +00:00
dependabot-preview[bot]
a9c6b868fb Bump electron-updater from 4.2.2 to 4.2.5 in /terminus-core
Bumps [electron-updater](https://github.com/electron-userland/electron-builder) from 4.2.2 to 4.2.5.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/compare/v4.2.2...v4.2.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-12 04:20:51 +00:00
dependabot-preview[bot]
ffe8168f0f Bump @angular/common from 9.0.4 to 9.0.6 in /app
Bumps [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) from 9.0.4 to 9.0.6.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/master/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/9.0.6/packages/common)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-12 04:20:09 +00:00
Nikolaos Stefanou
d1f5ebd546 Have multiple recent connections in history instead of just one 2020-03-11 20:37:17 +00:00
Eugene Pankov
2e8b465b3f apply custom css as the last style tag (fixes #2237) 2020-03-11 14:30:01 +01:00
dependabot-preview[bot]
4a535c94a6 Bump electron-rebuild from 1.9.0 to 1.10.1
Bumps [electron-rebuild](https://github.com/electron/electron-rebuild) from 1.9.0 to 1.10.1.
- [Release notes](https://github.com/electron/electron-rebuild/releases)
- [Changelog](https://github.com/electron/electron-rebuild/blob/master/.releaserc.json)
- [Commits](https://github.com/electron/electron-rebuild/compare/v1.9.0...v1.10.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-11 04:21:59 +00:00
dependabot-preview[bot]
531d47cbd1 Bump @typescript-eslint/parser from 2.21.0 to 2.23.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 2.21.0 to 2.23.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v2.23.0/packages/parser)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-10 04:22:59 +00:00
dependabot-preview[bot]
7a2491fe49 Bump cross-env from 7.0.0 to 7.0.2
Bumps [cross-env](https://github.com/kentcdodds/cross-env) from 7.0.0 to 7.0.2.
- [Release notes](https://github.com/kentcdodds/cross-env/releases)
- [Changelog](https://github.com/kentcdodds/cross-env/blob/master/CHANGELOG.md)
- [Commits](https://github.com/kentcdodds/cross-env/compare/v7.0.0...v7.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-06 04:21:23 +00:00
Eugene
2773c61677 Merge pull request #2211 from Eugeny/dependabot/npm_and_yarn/electron-builder-22.3.6
Bump electron-builder from 22.3.2 to 22.3.6
2020-03-05 12:22:01 +01:00
Eugene
788b063384 Merge pull request #2208 from Eugeny/dependabot/npm_and_yarn/webpack-5.0.0-beta.14
Bump webpack from 5.0.0-beta.13 to 5.0.0-beta.14
2020-03-05 12:14:25 +01:00
dependabot-preview[bot]
0e112899df Bump electron-builder from 22.3.2 to 22.3.6
Bumps [electron-builder](https://github.com/electron-userland/electron-builder) from 22.3.2 to 22.3.6.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/compare/v22.3.2...v22.3.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-04 04:22:12 +00:00
dependabot-preview[bot]
d8c635bc1d Bump webpack from 5.0.0-beta.13 to 5.0.0-beta.14
Bumps [webpack](https://github.com/webpack/webpack) from 5.0.0-beta.13 to 5.0.0-beta.14.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.0.0-beta.13...v5.0.0-beta.14)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-03 04:23:37 +00:00
Eugene Pankov
dfe55b94ff definitely fixed key permissions 2020-03-02 16:45:47 +01:00
Eugene Pankov
6b4b6b522f reset permissions on key file (fixes #2201) 2020-03-02 16:21:37 +01:00
dependabot-preview[bot]
e0eedca7c9 Bump ngx-toastr from 10.2.0 to 12.0.0 in /app
Bumps [ngx-toastr](https://github.com/scttcper/ngx-toastr) from 10.2.0 to 12.0.0.
- [Release notes](https://github.com/scttcper/ngx-toastr/releases)
- [Commits](https://github.com/scttcper/ngx-toastr/compare/v10.2.0...v12.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-01 12:46:57 +00:00
134 changed files with 3720 additions and 2740 deletions

View File

@@ -253,6 +253,87 @@
"code", "code",
"plugin" "plugin"
] ]
},
{
"login": "orin220444",
"name": "orin220444",
"avatar_url": "https://avatars3.githubusercontent.com/u/30747229?v=4",
"profile": "https://github.com/orin220444",
"contributions": [
"code"
]
},
{
"login": "Goobles",
"name": "Gobius Dolhain",
"avatar_url": "https://avatars3.githubusercontent.com/u/8776771?v=4",
"profile": "https://github.com/Goobles",
"contributions": [
"code"
]
},
{
"login": "3l0w",
"name": "Gwilherm Folliot",
"avatar_url": "https://avatars2.githubusercontent.com/u/37798980?v=4",
"profile": "https://github.com/3l0w",
"contributions": [
"code"
]
},
{
"login": "dimitory",
"name": "Dmitry Pronin",
"avatar_url": "https://avatars0.githubusercontent.com/u/475955?v=4",
"profile": "https://github.com/Dimitory",
"contributions": [
"code"
]
},
{
"login": "JonathanBeverley",
"name": "Jonathan Beverley",
"avatar_url": "https://avatars1.githubusercontent.com/u/20328966?v=4",
"profile": "https://github.com/JonathanBeverley",
"contributions": [
"code"
]
},
{
"login": "zend",
"name": "Zenghai Liang",
"avatar_url": "https://avatars1.githubusercontent.com/u/25160?v=4",
"profile": "https://github.com/zend",
"contributions": [
"code"
]
},
{
"login": "matishadow",
"name": "Mateusz Tracz",
"avatar_url": "https://avatars0.githubusercontent.com/u/9083085?v=4",
"profile": "https://about.me/matishadow",
"contributions": [
"code"
]
},
{
"login": "pinpins",
"name": "pinpin",
"avatar_url": "https://avatars3.githubusercontent.com/u/36234677?v=4",
"profile": "https://zergpool.com",
"contributions": [
"code"
]
},
{
"login": "TakuroOnoda",
"name": "Takuro Onoda",
"avatar_url": "https://avatars0.githubusercontent.com/u/1407926?v=4",
"profile": "https://github.com/TakuroOnoda",
"contributions": [
"code"
]
} }
], ],
"contributorsPerLine": 7, "contributorsPerLine": 7,

View File

@@ -99,3 +99,8 @@ rules:
'@typescript-eslint/restrict-template-expressions': off '@typescript-eslint/restrict-template-expressions': off
'@typescript-eslint/no-dynamic-delete': off '@typescript-eslint/no-dynamic-delete': off
'@typescript-eslint/prefer-nullish-coalescing': off '@typescript-eslint/prefer-nullish-coalescing': off
'@typescript-eslint/prefer-readonly-parameter-types': off
'@typescript-eslint/no-unsafe-member-access': off
'@typescript-eslint/no-unsafe-call': off
'@typescript-eslint/no-unsafe-return': off
'@typescript-eslint/no-base-to-string': off # broken in typescript-eslint

View File

@@ -31,6 +31,8 @@ jobs:
- name: Prepackage plugins - name: Prepackage plugins
run: scripts/prepackage-plugins.js run: scripts/prepackage-plugins.js
- run: sed -i '' 's/updateInfo = await/\/\/updateInfo = await/g' node_modules/app-builder-lib/out/targets/ArchiveTarget.js
- name: Build and sign packages - name: Build and sign packages
run: scripts/build-macos.js run: scripts/build-macos.js
if: github.repository == 'Eugeny/terminus' && github.event_name == 'push' if: github.repository == 'Eugeny/terminus' && github.event_name == 'push'
@@ -39,6 +41,8 @@ jobs:
GH_TOKEN: ${{ secrets.GH_TOKEN }} GH_TOKEN: ${{ secrets.GH_TOKEN }}
CSC_LINK: ${{ secrets.CSC_LINK }} CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
APPSTORE_USERNAME: ${{ secrets.APPSTORE_USERNAME }}
APPSTORE_PASSWORD: ${{ secrets.APPSTORE_PASSWORD }}
- name: Build packages without signing - name: Build packages without signing
run: scripts/build-macos.js run: scripts/build-macos.js

2
.gitignore vendored
View File

@@ -28,3 +28,5 @@ docs/api
.electron-symbols .electron-symbols
sentry.properties sentry.properties
sentry-symbols.js sentry-symbols.js
terminus-ssh/util/pagent.exe

View File

@@ -1,5 +1,5 @@
language: node_js language: node_js
node_js: 11 node_js: 10
stages: stages:
- Build - Build

View File

@@ -107,6 +107,19 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<td align="center"><a href="https://github.com/LeSeulArtichaut"><img src="https://avatars1.githubusercontent.com/u/38361244?v=4" width="100px;" alt=""/><br /><sub><b>LeSeulArtichaut</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=LeSeulArtichaut" title="Code">💻</a></td> <td align="center"><a href="https://github.com/LeSeulArtichaut"><img src="https://avatars1.githubusercontent.com/u/38361244?v=4" width="100px;" alt=""/><br /><sub><b>LeSeulArtichaut</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=LeSeulArtichaut" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/CyrilTaylor"><img src="https://avatars0.githubusercontent.com/u/12631466?v=4" width="100px;" alt=""/><br /><sub><b>Cyril Taylor</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=CyrilTaylor" title="Code">💻</a></td> <td align="center"><a href="https://github.com/CyrilTaylor"><img src="https://avatars0.githubusercontent.com/u/12631466?v=4" width="100px;" alt=""/><br /><sub><b>Cyril Taylor</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=CyrilTaylor" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/nstefanou"><img src="https://avatars3.githubusercontent.com/u/51129173?v=4" width="100px;" alt=""/><br /><sub><b>nstefanou</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=nstefanou" title="Code">💻</a> <a href="#plugin-nstefanou" title="Plugin/utility libraries">🔌</a></td> <td align="center"><a href="https://github.com/nstefanou"><img src="https://avatars3.githubusercontent.com/u/51129173?v=4" width="100px;" alt=""/><br /><sub><b>nstefanou</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=nstefanou" title="Code">💻</a> <a href="#plugin-nstefanou" title="Plugin/utility libraries">🔌</a></td>
<td align="center"><a href="https://github.com/orin220444"><img src="https://avatars3.githubusercontent.com/u/30747229?v=4" width="100px;" alt=""/><br /><sub><b>orin220444</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=orin220444" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/Goobles"><img src="https://avatars3.githubusercontent.com/u/8776771?v=4" width="100px;" alt=""/><br /><sub><b>Gobius Dolhain</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=Goobles" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/3l0w"><img src="https://avatars2.githubusercontent.com/u/37798980?v=4" width="100px;" alt=""/><br /><sub><b>Gwilherm Folliot</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=3l0w" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/Dimitory"><img src="https://avatars0.githubusercontent.com/u/475955?v=4" width="100px;" alt=""/><br /><sub><b>Dmitry Pronin</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=dimitory" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/JonathanBeverley"><img src="https://avatars1.githubusercontent.com/u/20328966?v=4" width="100px;" alt=""/><br /><sub><b>Jonathan Beverley</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=JonathanBeverley" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/zend"><img src="https://avatars1.githubusercontent.com/u/25160?v=4" width="100px;" alt=""/><br /><sub><b>Zenghai Liang</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=zend" title="Code">💻</a></td>
<td align="center"><a href="https://about.me/matishadow"><img src="https://avatars0.githubusercontent.com/u/9083085?v=4" width="100px;" alt=""/><br /><sub><b>Mateusz Tracz</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=matishadow" title="Code">💻</a></td>
<td align="center"><a href="https://zergpool.com"><img src="https://avatars3.githubusercontent.com/u/36234677?v=4" width="100px;" alt=""/><br /><sub><b>pinpin</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=pinpins" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/TakuroOnoda"><img src="https://avatars0.githubusercontent.com/u/1407926?v=4" width="100px;" alt=""/><br /><sub><b>Takuro Onoda</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=TakuroOnoda" title="Code">💻</a></td>
</tr> </tr>
</table> </table>

View File

@@ -8,10 +8,10 @@ html
window.nodeRequire = require window.nodeRequire = require
script(src='./preload.js') script(src='./preload.js')
script(src='./bundle.js', defer) script(src='./bundle.js', defer)
style#custom-css
style. style.
body { transition: 0.5s background; } body { transition: 0.5s background; }
body body
style#custom-css
app-root app-root
.preload-logo .preload-logo
div div
@@ -20,5 +20,3 @@ html
sup α sup α
.progress .progress
.bar(style='width: 0%') .bar(style='width: 0%')

View File

@@ -1,4 +1,4 @@
import { app, ipcMain, Menu, Tray, shell } from 'electron' import { app, ipcMain, Menu, Tray, shell, globalShortcut } from 'electron'
// eslint-disable-next-line no-duplicate-imports // eslint-disable-next-line no-duplicate-imports
import * as electron from 'electron' import * as electron from 'electron'
import { loadConfig } from './config' import { loadConfig } from './config'
@@ -9,8 +9,17 @@ export class Application {
private windows: Window[] = [] private windows: Window[] = []
constructor () { constructor () {
ipcMain.on('app:config-change', () => { ipcMain.on('app:config-change', (_event, config) => {
this.broadcast('host:config-change') this.broadcast('host:config-change', config)
})
ipcMain.on('app:register-global-hotkey', (_event, specs) => {
globalShortcut.unregisterAll()
for (let spec of specs) {
globalShortcut.register(spec, () => {
this.onGlobalHotkey()
})
}
}) })
const configData = loadConfig() const configData = loadConfig()
@@ -45,6 +54,9 @@ export class Application {
this.enableTray() this.enableTray()
} }
}) })
window.closed$.subscribe(() => {
this.windows = this.windows.filter(x => x !== window)
})
if (process.platform === 'darwin') { if (process.platform === 'darwin') {
this.setupMenu() this.setupMenu()
} }
@@ -52,6 +64,24 @@ export class Application {
return window return window
} }
onGlobalHotkey (): void {
if (this.windows.some(x => x.isFocused())) {
for (let window of this.windows) {
window.hide()
}
} else {
for (let window of this.windows) {
window.present()
}
}
}
presentAllWindows (): void {
for (let window of this.windows) {
window.present()
}
}
broadcast (event: string, ...args): void { broadcast (event: string, ...args): void {
for (const window of this.windows) { for (const window of this.windows) {
window.send(event, ...args) window.send(event, ...args)
@@ -107,6 +137,11 @@ export class Application {
} }
} }
handleSecondInstance (argv: string[], cwd: string): void {
this.presentAllWindows()
this.windows[this.windows.length - 1].handleSecondInstance(argv, cwd)
}
private setupMenu () { private setupMenu () {
let template: Electron.MenuItemConstructorOptions[] = [ let template: Electron.MenuItemConstructorOptions[] = [
{ {

View File

@@ -34,7 +34,7 @@ process.on('uncaughtException' as any, err => {
}) })
app.on('second-instance', (_event, argv, cwd) => { app.on('second-instance', (_event, argv, cwd) => {
application.send('host:second-instance', parseArgs(argv, cwd), cwd) application.handleSecondInstance(argv, cwd)
}) })
const argv = parseArgs(process.argv, process.cwd()) const argv = parseArgs(process.argv, process.cwd())

View File

@@ -1,18 +1,20 @@
import * as glasstron from 'glasstron'
if (process.platform === 'win32' || process.platform === 'linux') {
glasstron.init()
}
import { Subject, Observable } from 'rxjs' import { Subject, Observable } from 'rxjs'
import { debounceTime } from 'rxjs/operators' import { debounceTime } from 'rxjs/operators'
import { BrowserWindow, app, ipcMain, Rectangle, screen } from 'electron' import { BrowserWindow, app, ipcMain, Rectangle, Menu, screen } from 'electron'
import ElectronConfig = require('electron-config') import ElectronConfig = require('electron-config')
import * as os from 'os' import * as os from 'os'
import * as path from 'path' import * as path from 'path'
import { parseArgs } from './cli'
import { loadConfig } from './config' import { loadConfig } from './config'
let SetWindowCompositionAttribute: any
let AccentState: any
let DwmEnableBlurBehindWindow: any let DwmEnableBlurBehindWindow: any
if (process.platform === 'win32') { if (process.platform === 'win32') {
SetWindowCompositionAttribute = require('windows-swca').SetWindowCompositionAttribute
AccentState = require('windows-swca').ACCENT_STATE
DwmEnableBlurBehindWindow = require('windows-blurbehind').DwmEnableBlurBehindWindow DwmEnableBlurBehindWindow = require('windows-blurbehind').DwmEnableBlurBehindWindow
} }
@@ -23,17 +25,20 @@ export interface WindowOptions {
export class Window { export class Window {
ready: Promise<void> ready: Promise<void>
private visible = new Subject<boolean>() private visible = new Subject<boolean>()
private closed = new Subject<void>()
private window: BrowserWindow private window: BrowserWindow
private windowConfig: ElectronConfig private windowConfig: ElectronConfig
private windowBounds: Rectangle private windowBounds: Rectangle
private closing = false private closing = false
private lastVibrancy: {enabled: boolean, type?: string} | null = null private lastVibrancy: {enabled: boolean, type?: string} | null = null
private disableVibrancyWhileDragging = false private disableVibrancyWhileDragging = false
private configStore: any
get visible$ (): Observable<boolean> { return this.visible } get visible$ (): Observable<boolean> { return this.visible }
get closed$ (): Observable<void> { return this.closed }
constructor (options?: WindowOptions) { constructor (options?: WindowOptions) {
let configData = loadConfig() this.configStore = loadConfig()
options = options || {} options = options || {}
@@ -70,7 +75,7 @@ export class Window {
} }
} }
if ((configData.appearance || {}).frame === 'native') { if ((this.configStore.appearance || {}).frame === 'native') {
bwOptions.frame = true bwOptions.frame = true
} else { } else {
if (process.platform === 'darwin') { if (process.platform === 'darwin') {
@@ -78,15 +83,12 @@ export class Window {
} }
} }
if (process.platform === 'linux') {
bwOptions.backgroundColor = '#131d27'
}
this.window = new BrowserWindow(bwOptions) 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('window') this.window.setVibrancy('window')
} else if (process.platform === 'win32' && (configData.appearance || {}).vibrancy) { } else if (process.platform === 'win32' && (this.configStore.appearance || {}).vibrancy) {
this.setVibrancy(true) this.setVibrancy(true)
} }
@@ -97,6 +99,13 @@ export class Window {
this.window.show() this.window.show()
} }
this.window.focus() this.window.focus()
this.window.moveTop()
}
})
this.window.on('blur', () => {
if (this.configStore.appearance?.dockHideOnBlur) {
this.hide()
} }
}) })
@@ -123,18 +132,17 @@ export class Window {
this.lastVibrancy = { enabled, type } this.lastVibrancy = { enabled, type }
if (process.platform === 'win32') { if (process.platform === 'win32') {
if (parseFloat(os.release()) >= 10) { if (parseFloat(os.release()) >= 10) {
let attribValue = AccentState.ACCENT_DISABLED glasstron.update(this.window, {
if (enabled) { windows: { blurType: enabled ? type === 'fluent' ? 'acrylic' : 'blurbehind' : null },
if (type === 'fluent') { })
attribValue = AccentState.ACCENT_ENABLE_ACRYLICBLURBEHIND
} else {
attribValue = AccentState.ACCENT_ENABLE_BLURBEHIND
}
}
SetWindowCompositionAttribute(this.window.getNativeWindowHandle(), attribValue, 0x00000000)
} else { } else {
DwmEnableBlurBehindWindow(this.window, enabled) DwmEnableBlurBehindWindow(this.window, enabled)
} }
} else if (process.platform ==='linux') {
glasstron.update(this.window, {
linux: { requestBlur: enabled },
})
this.window.setBackgroundColor(enabled ? '#00000000' : '#131d27')
} else { } else {
this.window.setVibrancy(enabled ? 'dark' : null as any) // electron issue 20269 this.window.setVibrancy(enabled ? 'dark' : null as any) // electron issue 20269
} }
@@ -142,6 +150,7 @@ export class Window {
show (): void { show (): void {
this.window.show() this.window.show()
this.window.moveTop()
} }
focus (): void { focus (): void {
@@ -153,12 +162,58 @@ export class Window {
return return
} }
this.window.webContents.send(event, ...args) this.window.webContents.send(event, ...args)
if (event === 'host:config-change') {
this.configStore = args[0]
}
} }
isDestroyed (): boolean { isDestroyed (): boolean {
return !this.window || this.window.isDestroyed() return !this.window || this.window.isDestroyed()
} }
isFocused (): boolean {
return this.window.isFocused()
}
hide (): void {
if (process.platform === 'darwin') {
// Lose focus
Menu.sendActionToFirstResponder('hide:')
}
this.window.blur()
if (process.platform !== 'darwin') {
this.window.hide()
}
}
present (): void {
if (!this.window.isVisible()) {
// unfocused, invisible
this.window.show()
this.window.focus()
} else {
if (!this.configStore.appearance?.dock || this.configStore.appearance?.dock === 'off') {
// not docked, visible
setTimeout(() => {
this.window.show()
this.window.focus()
})
} else {
if (this.configStore.appearance?.dockAlwaysOnTop) {
// docked, visible, on top
this.window.hide()
} else {
// docked, visible, not on top
this.window.focus()
}
}
}
}
handleSecondInstance (argv: string[], cwd: string): void {
this.send('host:second-instance', parseArgs(argv, cwd), cwd)
}
private setupWindowManagement () { private setupWindowManagement () {
this.window.on('show', () => { this.window.on('show', () => {
this.visible.next(true) this.visible.next(true)
@@ -326,6 +381,8 @@ export class Window {
private destroy () { private destroy () {
this.window = null this.window = null
this.closed.next()
this.visible.complete() this.visible.complete()
this.closed.complete()
} }
} }

View File

@@ -13,43 +13,42 @@
"watch": "webpack --progress --color --watch" "watch": "webpack --progress --color --watch"
}, },
"dependencies": { "dependencies": {
"@angular/animations": "9.0.4", "@angular/animations": "9.1.9",
"@angular/common": "9.0.4", "@angular/common": "9.1.11",
"@angular/compiler": "9.0.4", "@angular/compiler": "9.1.9",
"@angular/core": "9.0.4", "@angular/core": "9.1.9",
"@angular/forms": "9.0.4", "@angular/forms": "9.1.11",
"@angular/platform-browser": "9.0.4", "@angular/platform-browser": "9.1.9",
"@angular/platform-browser-dynamic": "9.0.4", "@angular/platform-browser-dynamic": "9.1.9",
"@ng-bootstrap/ng-bootstrap": "^6.0.0", "@ng-bootstrap/ng-bootstrap": "^6.1.0",
"devtron": "1.4.0", "devtron": "1.4.0",
"electron-config": "2.0.0", "electron-config": "2.0.0",
"electron-debug": "^3.0.1", "electron-debug": "^3.0.1",
"electron-is-dev": "1.1.0", "electron-is-dev": "1.1.0",
"electron-updater": "^4.2.2",
"fontmanager-redux": "0.4.0", "fontmanager-redux": "0.4.0",
"js-yaml": "3.13.1", "glasstron": "sentialx/Glasstron#n-api",
"keytar": "^5.4.0", "js-yaml": "3.14.0",
"keytar": "^6.0.1",
"mz": "^2.7.0", "mz": "^2.7.0",
"ngx-toastr": "^10.2.0", "ngx-toastr": "^12.0.1",
"node-pty": "^0.10.0-beta2", "@terminus-term/node-pty": "0.10.0-beta9",
"npm": "6.9.0", "npm": "6.9.0",
"path": "0.12.7", "path": "0.12.7",
"rxjs": "^6.5.4", "rxjs": "^6.5.5",
"rxjs-compat": "^6.5.4", "rxjs-compat": "^6.6.0",
"yargs": "^15.1.0", "yargs": "^15.4.1",
"zone.js": "^0.10.2" "zone.js": "^0.10.3"
}, },
"optionalDependencies": { "optionalDependencies": {
"macos-native-processlist": "^1.0.2", "macos-native-processlist": "^2.0.0",
"serialport": "^8.0.7", "serialport": "^9.0.0",
"windows-blurbehind": "^1.0.1", "windows-blurbehind": "^1.0.1",
"windows-native-registry": "^1.0.17", "windows-native-registry": "^3.0.0",
"windows-process-tree": "^0.2.4", "windows-process-tree": "^0.2.4"
"windows-swca": "^2.0.2"
}, },
"devDependencies": { "devDependencies": {
"@types/mz": "0.0.32", "@types/mz": "0.0.32",
"@types/node": "12.7.12", "@types/node": "12.7.12",
"node-abi": "^2.15.0" "node-abi": "^2.18.0"
} }
} }

View File

@@ -3,6 +3,7 @@ import 'source-sans-pro/source-sans-pro.css'
import 'source-code-pro/source-code-pro.css' import 'source-code-pro/source-code-pro.css'
import '@fortawesome/fontawesome-free/css/solid.css' import '@fortawesome/fontawesome-free/css/solid.css'
import '@fortawesome/fontawesome-free/css/brands.css' import '@fortawesome/fontawesome-free/css/brands.css'
import '@fortawesome/fontawesome-free/css/regular.css'
import '@fortawesome/fontawesome-free/css/fontawesome.css' import '@fortawesome/fontawesome-free/css/fontawesome.css'
import 'ngx-toastr/toastr.css' import 'ngx-toastr/toastr.css'
import './preload.scss' import './preload.scss'

View File

@@ -37,6 +37,7 @@ module.exports = {
'electron-config': 'commonjs electron-config', 'electron-config': 'commonjs electron-config',
'electron-vibrancy': 'commonjs electron-vibrancy', 'electron-vibrancy': 'commonjs electron-vibrancy',
fs: 'commonjs fs', fs: 'commonjs fs',
glasstron: 'commonjs glasstron',
mz: 'commonjs mz', mz: 'commonjs mz',
path: 'commonjs path', path: 'commonjs path',
yargs: 'commonjs yargs', yargs: 'commonjs yargs',

View File

@@ -2,112 +2,119 @@
# yarn lockfile v1 # yarn lockfile v1
"@angular/animations@9.0.4": "@angular/animations@9.1.9":
version "9.0.4" version "9.1.9"
resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-9.0.4.tgz#c95c601dfb8fc4e96aee577c9c0f6cf18b64e5d7" resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-9.1.9.tgz#de54334ea195189402487855c9a98f5618605da4"
integrity sha512-zTCgrIAA9FYPMbqqpQnoNltiLR58q0FMfzP2t96q/1tjyVy/Y/IaNgVQ7eL0HeQ0nG6IAzQ1HVx8Xeneg4Yj5Q== integrity sha512-qWVi0TxmU6HeXAgEsfpQvFFygh+a0kH2kGe6bWij4XvG6dWfV3xZjlaFwSIYGk+yK4yL0+9+PAXH+ENfxNw+Cw==
"@angular/common@9.0.4": "@angular/common@9.1.11":
version "9.0.4" version "9.1.11"
resolved "https://registry.yarnpkg.com/@angular/common/-/common-9.0.4.tgz#7d168b22c5c43e72112d0a19242eca22b62bb4f3" resolved "https://registry.yarnpkg.com/@angular/common/-/common-9.1.11.tgz#1323f7b043410791bd2d0d71b0bbb1f862319c04"
integrity sha512-F3qoYrceEdCd5SlgObcbSIIdKfRXgyTBO2gbbArQHFe4GvewkH3isTn5uqAF6sfJlb7rXWZGrD6C3d9brw/fEw== integrity sha512-Vh5lF7zWwDK9RedmYXUc8vUXyrecR3j1mAWlTlnmcHYxxFThPzN/dr0slQcPi6nyJn0EmyRKUGvAoZx4rIb7wg==
"@angular/compiler@9.0.4": "@angular/compiler@9.1.9":
version "9.0.4" version "9.1.9"
resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-9.0.4.tgz#038c9cdbf76f1cce47bd1b355c7d212cc89b18f9" resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-9.1.9.tgz#cbf678ee28a0811a8ef3ee7be565d4911ff28ec7"
integrity sha512-+Ku8RUU00yHaKVkVw6YIfM3c5Gmvas5gJcEleiagkLbc1f/jKk1cY4gaUP6xn4TLypFM7NQglneWd+E+8wh0hQ== integrity sha512-kjFgaTB2ckr9lgmkS1dOGRT7kmzpQueydxsxXSHWgICNVE6F/u1PHyeSOyJRpxW0GnrkLq3QM2EUFnQGGga5bg==
"@angular/core@9.0.4": "@angular/core@9.1.9":
version "9.0.4" version "9.1.9"
resolved "https://registry.yarnpkg.com/@angular/core/-/core-9.0.4.tgz#6baa5ec6c594b47de541e47f4aa37241adec393a" resolved "https://registry.yarnpkg.com/@angular/core/-/core-9.1.9.tgz#db4241f867d6e14b81ed6e7c50334813c6ebfc10"
integrity sha512-6RqQb1GO2uglSlgiGbxhvy8plztZtABCWLRn0X+T1PnrxoqgxqA5WkKJjGxao+1M/ECW1V0fw4Xy7DE6KvAJwQ== integrity sha512-q/DERgVU6vK2LtTcdVCGGBcoO424WsEfImh3Vcuy+P/ZVmthlDUC/+q+tSKt8MMf4hLpxFDQJE8vUSkktj7QEw==
"@angular/forms@9.0.4": "@angular/forms@9.1.11":
version "9.0.4" version "9.1.11"
resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-9.0.4.tgz#31edac9917e592695a5c12b846e93dbda6afc510" resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-9.1.11.tgz#fa246144649236613598a0471aa7f39b60f986b5"
integrity sha512-WyfZ2u2JzGrwkxQmfxHvZMoYHEGfoUL+JlSXa2Sy3T/FPGNckHzIzggqweJij/qGjabWLabZDla4vak42f+4PA== integrity sha512-t4WHrh6ot1r8zdV+3fJz7g9rCok77c9CiIevhH2dR/idxD+HtFR0wqmcBQzsn+rNVB0f0TiSHDrj+TeELIFyWw==
"@angular/platform-browser-dynamic@9.0.4": "@angular/platform-browser-dynamic@9.1.9":
version "9.0.4" version "9.1.9"
resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.0.4.tgz#343bd43fe00a279a737e02c16dd8790dc0da93a8" resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.9.tgz#12f8b05d3c9ef0844df88f3833e29ea1e49ec5e0"
integrity sha512-9vAn2QH07khuF4n7kyMJzgE6l30Yxg1AGd8GtOfa/4nbna+EZxFVYOkto9bpv4uEwDr9o7QrFLplko9a8xs7kg== integrity sha512-b9MG5MWne+IuL3uLm8jwPhlJzqYaGBGk/qibOqb17T24j1iyrlO7T5bZ8zO6pUy5iT/TahVfHPnPJC1qTK5OmA==
"@angular/platform-browser@9.0.4": "@angular/platform-browser@9.1.9":
version "9.0.4" version "9.1.9"
resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-9.0.4.tgz#03853b435c3b964660727ac9d7e15912c920cdb8" resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-9.1.9.tgz#c2fcc50aebfdc268521b407e32dc0d967cb40411"
integrity sha512-mbiqmw0rDGPxEgKVgDuK7yZvtgjJmzpMGBYAMwkQ9YIE0SoA5XP0NvZiFkHZqDXwLgCv2IJ/kvkhfCBwnBKCXQ== integrity sha512-V861X3MxJp1AlMTnkUPldpBLIJbApXF3ka0A5Dq2nVJCyOFeteGkaRWSBgqe2jxmq+LVpJbzcNvtDFXw6mQ0jA==
"@ng-bootstrap/ng-bootstrap@^6.0.0": "@ng-bootstrap/ng-bootstrap@^6.1.0":
version "6.0.0" version "6.1.0"
resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-6.0.0.tgz#03b80acd711dd38a653b34339224d5063c50bd62" resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-6.1.0.tgz#fce7550a095aeac42108f76ac1ebd63caf8304e9"
integrity sha512-ho0Ssw+kwpGzc+Rvtu2pRSrcbduECMf9+uekhOMB1nzhUfF2vJQnTDpPfHZQgU/ukTMEJWvby5vcXJoPtHgE+w== integrity sha512-2GzkNJBKdeHkaUqaCAqSILPft0IzzHjMfAlAuGY6/ZLlVQ0glt5MTbIXtIhSbjR+OvlrljoXFLrvzs1LGdmE+A==
"@serialport/binding-abstract@^8.0.6": "@serialport/binding-abstract@^9.0.0":
version "8.0.6" version "9.0.0"
resolved "https://registry.yarnpkg.com/@serialport/binding-abstract/-/binding-abstract-8.0.6.tgz#78e6d7995a95c46d480445303e6f32ca4d53edcd" resolved "https://registry.yarnpkg.com/@serialport/binding-abstract/-/binding-abstract-9.0.0.tgz#7a01f89c9f098f1357c0b20ac4648ecba8fe7aae"
integrity sha512-1swwUVoRyQ9ubxrkJ8JPppykohUpTAP4jkGr36e9NjbVocSPfqeX6tFZFwl/IdUlwJwxGdbKDqq7FvXniCQUMw== integrity sha512-ZU+6ZypP33Rzda1cDnpN0+CNfnODwbRU66GBawNtj2+xE+OMI7a0hbuZAYvQ+BThyDfdX/vn55P1YYeVWI8qpQ==
dependencies: dependencies:
debug "^4.1.1" debug "^4.1.1"
"@serialport/binding-mock@^8.0.6": "@serialport/binding-mock@^9.0.0":
version "8.0.6" version "9.0.0"
resolved "https://registry.yarnpkg.com/@serialport/binding-mock/-/binding-mock-8.0.6.tgz#41a8f827269c6a0e58546513a274e12023134155" resolved "https://registry.yarnpkg.com/@serialport/binding-mock/-/binding-mock-9.0.0.tgz#37d17523b81e06f4d144ce7660d8e6497f848364"
integrity sha512-BIbY5/PsDDo0QWDNCCxDgpowAdks+aZR8BOsEtK2GoASTTcJCy1fBwPIfH870o7rnbH901wY3C+yuTfdOvSO9A== integrity sha512-E65ZbykGwZSoHpQvjuJkTbwEM0uZku+SROtO+VMs/mShMalBnOSoRDU2IedkFKvz6IqowZZOVyaBUbnKYoAUuQ==
dependencies: dependencies:
"@serialport/binding-abstract" "^8.0.6" "@serialport/binding-abstract" "^9.0.0"
debug "^4.1.1" debug "^4.1.1"
"@serialport/bindings@^8.0.7": "@serialport/bindings@^9.0.0":
version "8.0.7" version "9.0.0"
resolved "https://registry.yarnpkg.com/@serialport/bindings/-/bindings-8.0.7.tgz#2a58f60f1e24ee4549be6f9e0e37b3359d038a1c" resolved "https://registry.yarnpkg.com/@serialport/bindings/-/bindings-9.0.0.tgz#a3289bbf80c03f7d90d95d05422c983f38c07812"
integrity sha512-IqudDL8ne2Y2S0W5fKA6wdgHCIA2e2OIaPVYhGy6duE6legNHFY+05CLicHAyAeTocXmHU7rVNxzVQrOG5tM4g== integrity sha512-2LoYX80h5U8uIgpPaBXpIhs9uXIPhn6k+9u0FH3mFPHHeJ/tyVliwbj7uxdQ6xAUe5Zf3T2cH9JC/LnxewWyuw==
dependencies: dependencies:
"@serialport/binding-abstract" "^8.0.6" "@serialport/binding-abstract" "^9.0.0"
"@serialport/parser-readline" "^8.0.6" "@serialport/parser-readline" "^9.0.0"
bindings "^1.5.0" bindings "^1.5.0"
debug "^4.1.1" debug "^4.1.1"
nan "^2.14.0" nan "^2.14.1"
prebuild-install "^5.3.0" prebuild-install "^5.3.3"
"@serialport/parser-byte-length@^8.0.6": "@serialport/parser-byte-length@^9.0.0":
version "8.0.6" version "9.0.0"
resolved "https://registry.yarnpkg.com/@serialport/parser-byte-length/-/parser-byte-length-8.0.6.tgz#efb6195692b1088e6c095fd43bae196fc30674d0" resolved "https://registry.yarnpkg.com/@serialport/parser-byte-length/-/parser-byte-length-9.0.0.tgz#ff98e2d884695e5a2df3d67b344e9fb9171905ef"
integrity sha512-92mrFxFEvq3gRvSM7ANK/jfbmHslz91a5oYJy/nbSn4H/MCRXjxR2YOkQgVXuN+zLt+iyDoW3pcOP4Sc1nWdqQ== integrity sha512-MaXWTqxz9SeWaN488uFhDMA3cy2sQFoGHDQqDpy6q9wBGlPBe+UpRAznzOoNPkAehqyPo1Vc7gxYsBfgjZtWaw==
"@serialport/parser-cctalk@^8.0.6": "@serialport/parser-cctalk@^9.0.0":
version "8.0.6" version "9.0.0"
resolved "https://registry.yarnpkg.com/@serialport/parser-cctalk/-/parser-cctalk-8.0.6.tgz#4134a3c479d465df3b152a21e16b8ecf1bc818c3" resolved "https://registry.yarnpkg.com/@serialport/parser-cctalk/-/parser-cctalk-9.0.0.tgz#5c4b01c40cc093fe68449173bbb923f84a5dc89f"
integrity sha512-pqtCYQPgxnxHygiXUPCfgX7sEx+fdR/ObjpscidynEULUq2fFrC5kBkrxRbTfHRtTaU2ii9DyjFq0JVRCbhI0Q== integrity sha512-tFJRF+uceEMYQeOLi92CYr1SScnI+2QLkawNHaVwwcmLV0ezwmsm1hvwBCWHkWDsY6U1SiElNJ5HpF89kS28zQ==
"@serialport/parser-delimiter@^8.0.6": "@serialport/parser-delimiter@^9.0.0":
version "8.0.6" version "9.0.0"
resolved "https://registry.yarnpkg.com/@serialport/parser-delimiter/-/parser-delimiter-8.0.6.tgz#0e467cb07a40bd3006835c48e488666bd7de22cc" resolved "https://registry.yarnpkg.com/@serialport/parser-delimiter/-/parser-delimiter-9.0.0.tgz#1a241deaba80cf0aa6a88d37f60c64647604ec2d"
integrity sha512-ogKOcPisPMlVtirkuDu3SFTF0+xT0ijxoH7XjpZiYL41EVi367MwuCnEmXG+dEKKnF0j9EPqOyD2LGSJxaFmhQ== integrity sha512-OesbvlJf1BjFC1zde6cnW1RttxZ8BoXGCOiNvM9mLKdvJ06l9o/4HyVCg2bymj6ziy/gz4407pwyPfvVYApE3A==
"@serialport/parser-readline@^8.0.6": "@serialport/parser-readline@^9.0.0":
version "8.0.6" version "9.0.0"
resolved "https://registry.yarnpkg.com/@serialport/parser-readline/-/parser-readline-8.0.6.tgz#8a6a296a1bec08a4855bf7a62bc6335d52972e4a" resolved "https://registry.yarnpkg.com/@serialport/parser-readline/-/parser-readline-9.0.0.tgz#916391300e2e53a9f7b5aa847c989f7723986059"
integrity sha512-OYBT2mpczh9QUI3MTw8j0A0tIlPVjpVipvuVnjRkYwxrxPeq04RaLFhaDpuRzua5rTKMt89c1y3btYeoDXMjAA== integrity sha512-JMCqfn6A+BzcCc/4upYeLB48zijBJmOO/YGcyilXgCW0Mfedqsewgtatmk2tqFhQoJfjyOu3dRE3Lz9xHlRGZQ==
dependencies: dependencies:
"@serialport/parser-delimiter" "^8.0.6" "@serialport/parser-delimiter" "^9.0.0"
"@serialport/parser-ready@^8.0.6": "@serialport/parser-ready@^9.0.0":
version "8.0.6" version "9.0.0"
resolved "https://registry.yarnpkg.com/@serialport/parser-ready/-/parser-ready-8.0.6.tgz#d6e95e53ee70d298ae0b4147995007f4ba62651c" resolved "https://registry.yarnpkg.com/@serialport/parser-ready/-/parser-ready-9.0.0.tgz#be787d8d5495a2546483c818061cf41838bae124"
integrity sha512-xcEqv4rc119WR5JzAuu8UeJOlAwET2PTdNb6aIrrLlmTxhvuBbuRFcsnF3BpH9jUL30Kh7a6QiNXIwVG+WR/1Q== integrity sha512-oSQR7773Jdc6SjXMA1mWgfFlyBLcIRlZtt1BJMfO07k3ynBmanJ4VysVDTDvxtsREHLgcjoLRKQC/6wl2wvXOQ==
"@serialport/parser-regex@^8.0.6": "@serialport/parser-regex@^9.0.0":
version "8.0.6" version "9.0.0"
resolved "https://registry.yarnpkg.com/@serialport/parser-regex/-/parser-regex-8.0.6.tgz#70aa1abe31899d1b986f44cfb6777a76e26755bf" resolved "https://registry.yarnpkg.com/@serialport/parser-regex/-/parser-regex-9.0.0.tgz#4cb7039fa4bc487cb4ea1ade027c8fdd33f66e6c"
integrity sha512-J8KY75Azz5ZyExmyM5YfUxbXOWBkZCytKgCCmZ966ttwZS0bUZOuoCaZj2Zp4VILJAiLuxHoqc0foi67Fri5+g== integrity sha512-Q4LDXbWnun5r1ML6ZLS5Wb2BurnkJjtP1geHtZbshLUmpfms++Q28li8OPzv/KQ6praC1HDRG37D0AY6xoObSw==
"@serialport/stream@^8.0.6": "@serialport/stream@^9.0.0":
version "8.0.6" version "9.0.0"
resolved "https://registry.yarnpkg.com/@serialport/stream/-/stream-8.0.6.tgz#3395dbac788c00797c2435c61c2ecb4e99fbf41d" resolved "https://registry.yarnpkg.com/@serialport/stream/-/stream-9.0.0.tgz#0df7bd7c01c09696817052781a09e8352c4e7ffd"
integrity sha512-ym1PwM0rwLrj90vRBB66I1hwMXbuMw9wGTxqns75U3N/tuNFOH85mxXaYVF2TpI66aM849NoI1jMm50fl9equg== integrity sha512-JK952xKP+7PX3tXj9DgKafQaAru0sdbkTIY1OpjUNGp0xYWTVUbZRnLK//MLkH6FpoDTJc9ghN2ILK0YRtpLLA==
dependencies: dependencies:
debug "^4.1.1" debug "^4.1.1"
"@terminus-term/node-pty@0.10.0-beta9":
version "0.10.0-beta9"
resolved "https://registry.yarnpkg.com/@terminus-term/node-pty/-/node-pty-0.10.0-beta9.tgz#b4caff6b069139add9be959e00b364f8fe3c620d"
integrity sha512-wnttx12b9gxP9CPB9uqBMQx/Vp4EboUDGOY3xRP0Nvhec6pSF2qFZD6bwMbNzFIopbaohluEYcbEul0jTQcdeQ==
dependencies:
nan "^2.13.2"
"@types/color-name@^1.1.1": "@types/color-name@^1.1.1":
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
@@ -125,18 +132,6 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.12.tgz#7c6c571cc2f3f3ac4a59a5f2bd48f5bdbc8653cc" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.12.tgz#7c6c571cc2f3f3ac4a59a5f2bd48f5bdbc8653cc"
integrity sha512-KPYGmfD0/b1eXurQ59fXD1GBzhSQfz6/lKBxkaHX9dKTzjXbK68Zt7yGUxUsCS1jeTy/8aL+d9JEr+S54mpkWQ== integrity sha512-KPYGmfD0/b1eXurQ59fXD1GBzhSQfz6/lKBxkaHX9dKTzjXbK68Zt7yGUxUsCS1jeTy/8aL+d9JEr+S54mpkWQ==
"@types/node@^10.12.18":
version "10.12.18"
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67"
integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==
"@types/semver@^7.1.0":
version "7.1.0"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.1.0.tgz#c8c630d4c18cd326beff77404887596f96408408"
integrity sha512-pOKLaubrAEMUItGNpgwl0HMFPrSAFic8oSVIvfu1UwcgGNmNyK9gyhBHKmBnUTwwVvpZfkzUC0GaMgnL6P86uA==
dependencies:
"@types/node" "*"
JSONStream@^1.3.4, JSONStream@^1.3.5: JSONStream@^1.3.4, JSONStream@^1.3.5:
version "1.3.5" version "1.3.5"
resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
@@ -331,9 +326,9 @@ bindings@^1.5.0:
file-uri-to-path "1.0.0" file-uri-to-path "1.0.0"
bl@^3.0.0: bl@^3.0.0:
version "3.0.0" version "3.0.1"
resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.0.tgz#3611ec00579fd18561754360b21e9f784500ff88" resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.1.tgz#1cbb439299609e419b5a74d7fce2f8b37d8e5c6f"
integrity sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A== integrity sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ==
dependencies: dependencies:
readable-stream "^3.0.1" readable-stream "^3.0.1"
@@ -375,14 +370,6 @@ buffer-from@^1.0.0:
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
builder-util-runtime@8.6.0:
version "8.6.0"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.6.0.tgz#b7007c30126da9a90e99932128d2922c8c178649"
integrity sha512-WTDhTUVrm7zkFyd6Qn7AXgmWifjpZ/fYnEdV3XCOIDMNNb/KPddBTbQ8bUlxxVeuOYlhGpcLUypG+4USdGL1ww==
dependencies:
debug "^4.1.1"
sax "^1.2.4"
builtins@^1.0.3: builtins@^1.0.3:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
@@ -857,20 +844,6 @@ electron-localshortcut@^3.1.0:
keyboardevent-from-electron-accelerator "^1.1.0" keyboardevent-from-electron-accelerator "^1.1.0"
keyboardevents-areequal "^0.2.1" keyboardevents-areequal "^0.2.1"
electron-updater@^4.2.2:
version "4.2.2"
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.2.2.tgz#57e106bffad16f71b1ffa3968a52a1b71c8147e6"
integrity sha512-e/OZhr5tLW0GcgmpR5wD0ImxgKMa8pPoNWRcwRyMzTL9pGej7+ORp0t9DtI5ZBHUbObIoEbrk+6EDGUGtJf+aA==
dependencies:
"@types/semver" "^7.1.0"
builder-util-runtime "8.6.0"
fs-extra "^8.1.0"
js-yaml "^3.13.1"
lazy-val "^1.0.4"
lodash.isequal "^4.5.0"
pako "^1.0.11"
semver "^7.1.3"
emoji-regex@^8.0.0: emoji-regex@^8.0.0:
version "8.0.0" version "8.0.0"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
@@ -1064,15 +1037,6 @@ fs-constants@^1.0.0:
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== 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: fs-minipass@^1.2.5:
version "1.2.6" version "1.2.6"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07"
@@ -1181,6 +1145,13 @@ github-from-package@0.0.0:
resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=
glasstron@sentialx/Glasstron#n-api:
version "0.0.4"
resolved "https://codeload.github.com/sentialx/Glasstron/tar.gz/1159908e1d85b8cceabf6b5d9353c446caea1f0b"
dependencies:
node-addon-api "^3.0.0"
x11 "^2.3.0"
glob@^7.0.3, glob@^7.1.1, glob@^7.1.3: glob@^7.0.3, glob@^7.1.1, glob@^7.1.3:
version "7.1.4" version "7.1.4"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
@@ -1222,7 +1193,7 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15:
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: graceful-fs@^4.1.2:
version "4.2.2" version "4.2.2"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02"
integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==
@@ -1344,7 +1315,7 @@ inflight@^1.0.4, inflight@~1.0.6:
once "^1.3.0" once "^1.3.0"
wrappy "1" wrappy "1"
inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.3" version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
@@ -1354,6 +1325,11 @@ inherits@2.0.1:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
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.4, ini@^1.3.5, ini@~1.3.0: ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
version "1.3.5" version "1.3.5"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
@@ -1484,10 +1460,10 @@ isstream@~0.1.2:
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
js-yaml@3.13.1, js-yaml@^3.13.1: js-yaml@3.14.0:
version "3.13.1" version "3.14.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==
dependencies: dependencies:
argparse "^1.0.7" argparse "^1.0.7"
esprima "^4.0.0" esprima "^4.0.0"
@@ -1517,13 +1493,6 @@ json-stringify-safe@~5.0.1:
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 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"
jsonparse@^1.2.0: jsonparse@^1.2.0:
version "1.3.1" version "1.3.1"
resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
@@ -1549,13 +1518,13 @@ keyboardevents-areequal@^0.2.1:
resolved "https://registry.yarnpkg.com/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz#88191ec738ce9f7591c25e9056de928b40277194" resolved "https://registry.yarnpkg.com/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz#88191ec738ce9f7591c25e9056de928b40277194"
integrity sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw== integrity sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==
keytar@^5.4.0: keytar@^6.0.1:
version "5.4.0" version "6.0.1"
resolved "https://registry.yarnpkg.com/keytar/-/keytar-5.4.0.tgz#71d8209e7dd2fe99008c243791350a6bd6ceab67" resolved "https://registry.yarnpkg.com/keytar/-/keytar-6.0.1.tgz#996961abdebf300b2d34bb2eab6e42a8096b1ed8"
integrity sha512-Ta0RtUmkq7un177SPgXKQ7FGfGDV4xvsV0cGNiWVEzash5U0wyOsXpwfrK2+Oq+hHvsvsbzIZUUuJPimm3avFw== integrity sha512-1Ihpf2tdM3sLwGMkYHXYhVC/hx5BDR7CWFL4IrBA3IDZo0xHhS2nM+tU9Y+u/U7okNfbVkwmKsieLkcWRMh93g==
dependencies: dependencies:
nan "2.14.0" node-addon-api "^3.0.0"
prebuild-install "5.3.3" prebuild-install "5.3.4"
latest-version@^3.0.0: latest-version@^3.0.0:
version "3.1.0" version "3.1.0"
@@ -1569,11 +1538,6 @@ lazy-property@~1.0.0:
resolved "https://registry.yarnpkg.com/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147" resolved "https://registry.yarnpkg.com/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147"
integrity sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc= integrity sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc=
lazy-val@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.4.tgz#882636a7245c2cfe6e0a4e3ba6c5d68a137e5c65"
integrity sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==
lcid@^1.0.0: lcid@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
@@ -1776,11 +1740,6 @@ lodash.clonedeep@^4.5.0, lodash.clonedeep@~4.5.0:
resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
lodash.isequal@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=
lodash.union@~4.6.0: lodash.union@~4.6.0:
version "4.6.0" version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
@@ -1816,12 +1775,12 @@ lru-cache@^5.1.1:
dependencies: dependencies:
yallist "^3.0.2" yallist "^3.0.2"
macos-native-processlist@^1.0.2: macos-native-processlist@^2.0.0:
version "1.0.2" version "2.0.0"
resolved "https://registry.yarnpkg.com/macos-native-processlist/-/macos-native-processlist-1.0.2.tgz#78767e4fdea3eea782bbf063dac8c1e2420786dc" resolved "https://registry.yarnpkg.com/macos-native-processlist/-/macos-native-processlist-2.0.0.tgz#135e24612c4b0f1f16a51526bd040d5026143d38"
integrity sha512-ShX+vFA44eaJ9/JCPTrhL0j4KLVKrYjeTQCFuR0kx7qWxETBDbFX8I3WKKXeALMtWSD+F4TDpza2mwCcE2tWAw== integrity sha512-ciW1n2jL+9f7+9xijMMVmVzRbpVlKjzMFmgpNricm5QKfkUTMEa1suR0pc9pQRrLea4sJtbLo0u+izzHDvkpIA==
dependencies: dependencies:
nan "^2.13.2" node-addon-api "3.0.0"
make-dir@^1.0.0: make-dir@^1.0.0:
version "1.3.0" version "1.3.0"
@@ -1898,6 +1857,11 @@ minimist@^1.2.0:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
minimist@^1.2.3:
version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
minipass@^2.2.1, minipass@^2.3.5: minipass@^2.2.1, minipass@^2.3.5:
version "2.3.5" version "2.3.5"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848"
@@ -1972,30 +1936,33 @@ mz@^2.7.0:
object-assign "^4.0.1" object-assign "^4.0.1"
thenify-all "^1.0.0" thenify-all "^1.0.0"
nan@2.14.0, nan@^2.13.2, nan@^2.14.0: nan@^2.13.2, nan@^2.14.1:
version "2.14.0" version "2.14.1"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01"
integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==
napi-build-utils@^1.0.1: napi-build-utils@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.1.tgz#1381a0f92c39d66bf19852e7873432fc2123e508" resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.1.tgz#1381a0f92c39d66bf19852e7873432fc2123e508"
integrity sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA== integrity sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==
ngx-toastr@^10.2.0: ngx-toastr@^12.0.1:
version "10.2.0" version "12.0.1"
resolved "https://registry.yarnpkg.com/ngx-toastr/-/ngx-toastr-10.2.0.tgz#8a79008de0b1c013f90120a53e0355af5762e969" resolved "https://registry.yarnpkg.com/ngx-toastr/-/ngx-toastr-12.0.1.tgz#288c8ef505f1216aa4952cd2a8c6fa7c57a54ccc"
integrity sha512-6ASr5bcvQmtNKb4D2VEsQjCXyROq6GwberBWO0bVt+xcBYPUea4aRTgX8in9apX9buaTafzG+h3HlnIraspoPg== integrity sha512-PABtbn2dyHweVSbo/py1W3veXzcmZO7uVItfTW9AykSSeAUju3gOCgauAw89km0aJ9EBcPOieaoI+9tAR7Pfug==
dependencies:
tslib "^1.9.0"
node-abi@^2.15.0, node-abi@^2.7.0: node-abi@^2.18.0, node-abi@^2.7.0:
version "2.15.0" version "2.18.0"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.15.0.tgz#51d55cc711bd9e4a24a572ace13b9231945ccb10" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.18.0.tgz#1f5486cfd7d38bd4f5392fa44a4ad4d9a0dffbf4"
integrity sha512-FeLpTS0F39U7hHZU1srAK4Vx+5AHNVOTP+hxBNQknR/54laTHSFIJkDWDqiquY1LeLUgTfPN7sLPhMubx0PLAg== integrity sha512-yi05ZoiuNNEbyT/xXfSySZE+yVnQW6fxPZuFbLyS1s6b5Kw3HzV2PHOM4XR+nsjzkHxByK+2Wg+yCQbe35l8dw==
dependencies: dependencies:
semver "^5.4.1" semver "^5.4.1"
node-addon-api@3.0.0, node-addon-api@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.0.0.tgz#812446a1001a54f71663bed188314bba07e09247"
integrity sha512-sSHCgWfJ+Lui/u+0msF3oyCgvdkhxDbkCS6Q8uiJquzOimkJBvX6hl5aSSA7DR1XbMpdM8r7phjcF63sF4rkKg==
node-fetch-npm@^2.0.2: node-fetch-npm@^2.0.2:
version "2.0.2" version "2.0.2"
resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7"
@@ -2040,13 +2007,6 @@ node-gyp@^4.0.0:
tar "^4.4.8" tar "^4.4.8"
which "1" which "1"
node-pty@^0.10.0-beta2:
version "0.10.0-beta3"
resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.10.0-beta3.tgz#a33c9fc67c9e4d4f124111e1da2a72b0783008e7"
integrity sha512-j7MoJ3K999jrT9gAVs7JvM/skAQXQITrZK/PhL9B4W4GAPkANKwdu9uEtNvYionQ9dV8gRGte7lg9D2cRDdAiA==
dependencies:
nan "^2.14.0"
noop-logger@^0.1.1: noop-logger@^0.1.1:
version "0.1.1" version "0.1.1"
resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2"
@@ -2332,7 +2292,7 @@ opener@^1.5.1:
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
os-homedir@^1.0.0: os-homedir@^1.0.0, os-homedir@^1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
@@ -2459,11 +2419,6 @@ pacote@^9.1.0, pacote@^9.2.3, pacote@^9.5.0:
unique-filename "^1.1.1" unique-filename "^1.1.1"
which "^1.3.1" which "^1.3.1"
pako@^1.0.11:
version "1.0.11"
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
parallel-transform@^1.1.0: parallel-transform@^1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
@@ -2528,15 +2483,15 @@ pkg-up@^2.0.0:
dependencies: dependencies:
find-up "^2.1.0" find-up "^2.1.0"
prebuild-install@5.3.3, prebuild-install@^5.3.0: prebuild-install@5.3.4, prebuild-install@^5.3.3:
version "5.3.3" version "5.3.4"
resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.3.tgz#ef4052baac60d465f5ba6bf003c9c1de79b9da8e" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.4.tgz#6982d10084269d364c1856550b7d090ea31fa293"
integrity sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g== integrity sha512-AkKN+pf4fSEihjapLEEj8n85YIw/tN6BQqkhzbDc0RvEZGdkpJBGMUYx66AAMcPG2KzmPQS7Cm16an4HVBRRMA==
dependencies: dependencies:
detect-libc "^1.0.3" detect-libc "^1.0.3"
expand-template "^2.0.3" expand-template "^2.0.3"
github-from-package "0.0.0" github-from-package "0.0.0"
minimist "^1.2.0" minimist "^1.2.3"
mkdirp "^0.5.1" mkdirp "^0.5.1"
napi-build-utils "^1.0.1" napi-build-utils "^1.0.1"
node-abi "^2.7.0" node-abi "^2.7.0"
@@ -2745,9 +2700,9 @@ read@1, read@~1.0.1, read@~1.0.7:
util-deprecate "~1.0.1" util-deprecate "~1.0.1"
readable-stream@^3.0.1, readable-stream@^3.1.1: readable-stream@^3.0.1, readable-stream@^3.1.1:
version "3.4.0" version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
dependencies: dependencies:
inherits "^2.0.3" inherits "^2.0.3"
string_decoder "^1.1.1" string_decoder "^1.1.1"
@@ -2865,15 +2820,15 @@ run-queue@^1.0.0, run-queue@^1.0.3:
dependencies: dependencies:
aproba "^1.1.1" aproba "^1.1.1"
rxjs-compat@^6.5.4: rxjs-compat@^6.6.0:
version "6.5.4" version "6.6.0"
resolved "https://registry.yarnpkg.com/rxjs-compat/-/rxjs-compat-6.5.4.tgz#03825692af3fe363e04c43f41ff4113d76bbd305" resolved "https://registry.yarnpkg.com/rxjs-compat/-/rxjs-compat-6.6.0.tgz#fb86908ca9ea385befd25f6d4e451d1b0154fe5c"
integrity sha512-rkn+lbOHUQOurdd74J/hjmDsG9nFx0z66fvnbs8M95nrtKvNqCKdk7iZqdY51CGmDemTQk+kUPy4s8HVOHtkfA== integrity sha512-XvW8LM/3QnoehC74BAbC3bSiaSsfdZHC21QErD50TmdjNQhpQ6s3bM5PjcdcZWbX7mNgC3zi3BcbI9dWGJ6fsA==
rxjs@^6.5.4: rxjs@^6.5.5:
version "6.5.4" version "6.5.5"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec"
integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==
dependencies: dependencies:
tslib "^1.9.0" tslib "^1.9.0"
@@ -2882,16 +2837,16 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2,
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
version "2.1.2" version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
sax@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
semver-diff@^2.0.0: semver-diff@^2.0.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
@@ -2904,30 +2859,25 @@ semver-diff@^2.0.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
semver@^7.1.3:
version "7.1.3"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.3.tgz#e4345ce73071c53f336445cfc19efb1c311df2a6"
integrity sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==
semver@~5.3.0: semver@~5.3.0:
version "5.3.0" version "5.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8=
serialport@^8.0.7: serialport@^9.0.0:
version "8.0.7" version "9.0.0"
resolved "https://registry.yarnpkg.com/serialport/-/serialport-8.0.7.tgz#9f28b1b7c47333a0962f5505a1c3feb1d90f89a9" resolved "https://registry.yarnpkg.com/serialport/-/serialport-9.0.0.tgz#2721d618f5b12437be103f775e5173291c768dd5"
integrity sha512-R9bfNebs2dblYf5sD/Aaa7j8+siP4X7TGT02lqHM9DF5fyjlrPGXmsLw9+LKOz1AvjGjkxf2NzBVnDpqRX7clQ== integrity sha512-4kQqIM0XhT6QECyzJtPdSsDWRFt8u3/vscQxb+z4TrAMiPDkDGBTLDaXmCxarXDa1s7EeK1IyxMce9wzWPFzAQ==
dependencies: dependencies:
"@serialport/binding-mock" "^8.0.6" "@serialport/binding-mock" "^9.0.0"
"@serialport/bindings" "^8.0.7" "@serialport/bindings" "^9.0.0"
"@serialport/parser-byte-length" "^8.0.6" "@serialport/parser-byte-length" "^9.0.0"
"@serialport/parser-cctalk" "^8.0.6" "@serialport/parser-cctalk" "^9.0.0"
"@serialport/parser-delimiter" "^8.0.6" "@serialport/parser-delimiter" "^9.0.0"
"@serialport/parser-readline" "^8.0.6" "@serialport/parser-readline" "^9.0.0"
"@serialport/parser-ready" "^8.0.6" "@serialport/parser-ready" "^9.0.0"
"@serialport/parser-regex" "^8.0.6" "@serialport/parser-regex" "^9.0.0"
"@serialport/stream" "^8.0.6" "@serialport/stream" "^9.0.0"
debug "^4.1.1" debug "^4.1.1"
set-blocking@^2.0.0, set-blocking@~2.0.0: set-blocking@^2.0.0, set-blocking@~2.0.0:
@@ -3129,11 +3079,11 @@ string-width@^4.1.0, string-width@^4.2.0:
strip-ansi "^6.0.0" strip-ansi "^6.0.0"
string_decoder@^1.1.1: string_decoder@^1.1.1:
version "1.2.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies: dependencies:
safe-buffer "~5.1.0" safe-buffer "~5.2.0"
string_decoder@~0.10.x: string_decoder@~0.10.x:
version "0.10.31" version "0.10.31"
@@ -3343,11 +3293,6 @@ unique-string@^1.0.0:
dependencies: dependencies:
crypto-random-string "^1.0.0" crypto-random-string "^1.0.0"
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==
unpipe@~1.0.0: unpipe@~1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
@@ -3477,12 +3422,12 @@ windows-blurbehind@^1.0.1:
resolved "https://registry.yarnpkg.com/windows-blurbehind/-/windows-blurbehind-1.0.1.tgz#ff098713873304e38330b2c54cc41bb369b587b9" resolved "https://registry.yarnpkg.com/windows-blurbehind/-/windows-blurbehind-1.0.1.tgz#ff098713873304e38330b2c54cc41bb369b587b9"
integrity sha512-1HzHfCiM1ayrbACJu5qE9zELV24uX/tINT6kxaZwLY3rtQAoeav6x9z7LFHWoLaGDN/sYbnK+9Vk0cz7fsk5HQ== integrity sha512-1HzHfCiM1ayrbACJu5qE9zELV24uX/tINT6kxaZwLY3rtQAoeav6x9z7LFHWoLaGDN/sYbnK+9Vk0cz7fsk5HQ==
windows-native-registry@^1.0.17: windows-native-registry@^3.0.0:
version "1.0.17" version "3.0.0"
resolved "https://registry.yarnpkg.com/windows-native-registry/-/windows-native-registry-1.0.17.tgz#d8cce48b364703a55c226690431b325114405022" resolved "https://registry.yarnpkg.com/windows-native-registry/-/windows-native-registry-3.0.0.tgz#82e715df7a59d5054c768547d81e0bfc81a59d2e"
integrity sha512-u9Fp9TyDo5dvhlW6hYBOdHPETtAahXKxo3jeW5EXwNK7qa+nSNopQycN1drtBVWe3jpJXvyKpt9zrjiDd+u4JQ== integrity sha512-Mz/9a23UivwPc23DsTOL/ZCp/XXogT+6h/khk1psOfDDusXqpomBdxNdsBBE/BvIgOExjGom0XPOfEPiDnHy7A==
dependencies: dependencies:
nan "^2.14.0" node-addon-api "^3.0.0"
windows-process-tree@^0.2.4: windows-process-tree@^0.2.4:
version "0.2.4" version "0.2.4"
@@ -3491,13 +3436,6 @@ windows-process-tree@^0.2.4:
dependencies: dependencies:
nan "^2.13.2" nan "^2.13.2"
windows-swca@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/windows-swca/-/windows-swca-2.0.2.tgz#66807012f73f5d3c0f0cb49bfa61be297aaabb50"
integrity sha512-9935KGV1gH3EBy7re9UEfDrxY3fbXBcwrUgEZk1exxe6swcGKFhO82ECh4QXVBjIhq+ROIVW3SBF/OUnZFSNGw==
dependencies:
"@types/node" "^10.12.18"
worker-farm@^1.6.0: worker-farm@^1.6.0:
version "1.7.0" version "1.7.0"
resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
@@ -3536,6 +3474,13 @@ write-file-atomic@^2.0.0, write-file-atomic@^2.3.0, write-file-atomic@^2.4.2:
imurmurhash "^0.1.4" imurmurhash "^0.1.4"
signal-exit "^3.0.2" signal-exit "^3.0.2"
x11@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/x11/-/x11-2.3.0.tgz#bdaccedccdac2482fd560f0511e7bf2bd9e1dbf2"
integrity sha1-vazO3M2sJIL9Vg8FEee/K9nh2/I=
dependencies:
os-homedir "^1.0.1"
xdg-basedir@^3.0.0: xdg-basedir@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
@@ -3566,10 +3511,10 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==
yargs-parser@^16.1.0: yargs-parser@^18.1.2:
version "16.1.0" version "18.1.3"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg== integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
dependencies: dependencies:
camelcase "^5.0.0" camelcase "^5.0.0"
decamelize "^1.2.0" decamelize "^1.2.0"
@@ -3599,10 +3544,10 @@ yargs@^11.0.0:
y18n "^3.2.1" y18n "^3.2.1"
yargs-parser "^9.0.2" yargs-parser "^9.0.2"
yargs@^15.1.0: yargs@^15.4.1:
version "15.1.0" version "15.4.1"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.1.0.tgz#e111381f5830e863a89550bd4b136bb6a5f37219" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
integrity sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg== integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
dependencies: dependencies:
cliui "^6.0.0" cliui "^6.0.0"
decamelize "^1.2.0" decamelize "^1.2.0"
@@ -3614,9 +3559,9 @@ yargs@^15.1.0:
string-width "^4.2.0" string-width "^4.2.0"
which-module "^2.0.0" which-module "^2.0.0"
y18n "^4.0.0" y18n "^4.0.0"
yargs-parser "^16.1.0" yargs-parser "^18.1.2"
zone.js@^0.10.2: zone.js@^0.10.3:
version "0.10.2" version "0.10.3"
resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.10.2.tgz#67ca084b3116fc33fc40435e0d5ea40a207e392e" resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.10.3.tgz#3e5e4da03c607c9dcd92e37dd35687a14a140c16"
integrity sha512-UAYfiuvxLN4oyuqhJwd21Uxb4CNawrq6fPS/05Su5L4G+1TN+HVDJMUHNMobVQDFJRir2cLAODXwluaOKB7HFg== integrity sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==

View File

@@ -0,0 +1,16 @@
const fs = require('fs')
const signHook = require('./afterSignHook')
module.exports = async function (params) {
// notarize the app on Mac OS only.
if (process.platform !== 'darwin' || !process.env.GITHUB_REF || !process.env.GITHUB_REF.startsWith('refs/tags/')) {
return
}
console.log('afterBuild hook triggered')
let pkgName = fs.readdirSync('dist').find(x => x.endsWith('.pkg'))
signHook({
appOutDir: 'dist',
_pathOverride: pkgName,
})
}

View File

@@ -6,14 +6,14 @@ const notarizer = require('electron-notarize')
module.exports = async function (params) { module.exports = async function (params) {
// notarize the app on Mac OS only. // notarize the app on Mac OS only.
if (process.platform !== 'darwin' || process.env.GITHUB_REF !== 'refs/heads/master' || process.env.GITHUB_REF && !process.env.GITHUB_REF.startsWith('refs/tags/')) { if (process.platform !== 'darwin' || !process.env.GITHUB_REF || !process.env.GITHUB_REF.startsWith('refs/tags/')) {
return return
} }
console.log('afterSign hook triggered', params) console.log('afterSign hook triggered', params)
let appId = 'org.terminus' let appId = 'org.terminus'
let appPath = path.join(params.appOutDir, `${params.packager.appInfo.productFilename}.app`) let appPath = path.join(params.appOutDir, params._pathOverride || `${params.packager.appInfo.productFilename}.app`)
if (!fs.existsSync(appPath)) { if (!fs.existsSync(appPath)) {
throw new Error(`Cannot find application at: ${appPath}`) throw new Error(`Cannot find application at: ${appPath}`)
} }

View File

@@ -10,5 +10,9 @@
<true/> <true/>
<key>com.apple.security.cs.disable-library-validation</key> <key>com.apple.security.cs.disable-library-validation</key>
<true/> <true/>
<key>com.apple.security.device.microphone</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>
</dict> </dict>
</plist> </plist>

View File

@@ -3,6 +3,7 @@ appId: org.terminus
productName: Terminus productName: Terminus
compression: normal compression: normal
afterSign: "./build/mac/afterSignHook.js" afterSign: "./build/mac/afterSignHook.js"
afterAllArtifactBuild: "./build/mac/afterBuildHook.js"
files: files:
- "**/*" - "**/*"
- dist - dist
@@ -30,6 +31,15 @@ mac:
entitlementsInherit: "./build/mac/entitlements.plist" entitlementsInherit: "./build/mac/entitlements.plist"
extendInfo: extendInfo:
NSRequiresAquaSystemAppearance: false NSRequiresAquaSystemAppearance: false
NSCameraUsageDescription: "A subprocess requests access to the device's camera."
NSMicrophoneUsageDescription: "A subprocess requests access to the device's microphone."
NSLocationUsageDescription: "A subprocess requests access to the user's location information."
NSDesktopFolderUsageDescription: "A subprocess requests access to the user's Desktop folder."
NSDocumentsFolderUsageDescription: "A subprocess requests access to the user's Documents folder."
NSDownloadsFolderUsageDescription: "A subprocess requests access to the user's Downloads folder."
NSNetworkVolumesUsageDescription: 'A subprocess requests access to files on a network volume.'
NSRemovableVolumesUsageDescription: 'A subprocess requests access to files on a removable volume.'
pkg: pkg:
artifactName: terminus-${version}-macos.pkg artifactName: terminus-${version}-macos.pkg
@@ -48,6 +58,7 @@ deb:
depends: depends:
- gconf2 - gconf2
- gconf-service - gconf-service
- gnome-keyring
- libnotify4 - libnotify4
- libsecret-1-0 - libsecret-1-0
- libappindicator1 - libappindicator1
@@ -57,4 +68,4 @@ deb:
rpm: rpm:
depends: depends:
- screen - screen
- gnome-python2-gnomekeyring - gnome-keyring

Binary file not shown.

View File

@@ -1,35 +1,35 @@
{ {
"devDependencies": { "devDependencies": {
"@fortawesome/fontawesome-free": "^5.12.1", "@fortawesome/fontawesome-free": "^5.13.0",
"@sentry/cli": "^1.51.1", "@sentry/cli": "^1.52.3",
"@sentry/electron": "^1.2.1", "@sentry/electron": "^1.5.1",
"@types/electron-config": "^3.2.2", "@types/electron-config": "^3.2.2",
"@types/electron-debug": "^2.1.0", "@types/electron-debug": "^2.1.0",
"@types/js-yaml": "^3.12.1", "@types/js-yaml": "^3.12.4",
"@types/node": "12.7.12", "@types/node": "12.7.12",
"@types/webpack-env": "1.15.0", "@types/webpack-env": "^1.15.2",
"@typescript-eslint/eslint-plugin": "^2.21.0", "@typescript-eslint/eslint-plugin": "^2.26.0",
"@typescript-eslint/parser": "^2.21.0", "@typescript-eslint/parser": "^3.8.0",
"apply-loader": "2.0.0", "apply-loader": "2.0.0",
"awesome-typescript-loader": "^5.0.0", "awesome-typescript-loader": "^5.0.0",
"core-js": "^3.6.4", "core-js": "^3.6.5",
"cross-env": "7.0.0", "cross-env": "7.0.2",
"css-loader": "3.4.2", "css-loader": "3.4.2",
"electron": "^8.0.2", "electron": "^8.2.5",
"electron-builder": "22.3.2", "electron-builder": "22.6.1",
"electron-download": "^4.1.1", "electron-download": "^4.1.1",
"electron-installer-snap": "^5.0.0", "electron-installer-snap": "^5.0.0",
"electron-notarize": "^0.1.1", "electron-notarize": "^1.0.0",
"electron-rebuild": "^1.9.0", "electron-rebuild": "^1.10.1",
"eslint": "^6.8.0", "eslint": "^7.6.0",
"eslint-plugin-import": "^2.20.1", "eslint-plugin-import": "^2.21.1",
"file-loader": "^5.0.2", "file-loader": "^5.0.2",
"graceful-fs": "^4.2.2", "graceful-fs": "^4.2.4",
"html-loader": "0.5.5", "html-loader": "0.5.5",
"json-loader": "0.5.7", "json-loader": "0.5.7",
"node-abi": "^2.15.0", "node-abi": "^2.18.0",
"node-gyp": "^6.1.0", "node-gyp": "^7.0.0",
"node-sass": "^4.13.0", "node-sass": "^4.14.1",
"npmlog": "4.1.2", "npmlog": "4.1.2",
"npx": "^10.2.0", "npx": "^10.2.0",
"pug": "^2.0.4", "pug": "^2.0.4",
@@ -37,22 +37,22 @@
"pug-lint": "^2.6.0", "pug-lint": "^2.6.0",
"pug-loader": "^2.4.0", "pug-loader": "^2.4.0",
"pug-static-loader": "2.0.0", "pug-static-loader": "2.0.0",
"raw-loader": "4.0.0", "raw-loader": "4.0.1",
"sass-loader": "^8.0.0", "sass-loader": "^8.0.0",
"shelljs": "0.8.3", "shelljs": "0.8.4",
"source-code-pro": "^2.30.2", "source-code-pro": "^2.30.2",
"source-sans-pro": "3.6.0", "source-sans-pro": "3.6.0",
"style-loader": "^1.1.3", "style-loader": "^1.1.4",
"svg-inline-loader": "^0.8.0", "svg-inline-loader": "^0.8.0",
"to-string-loader": "1.1.6", "to-string-loader": "1.1.6",
"tslib": "^1.11.1", "tslib": "^2.0.0",
"typedoc": "^0.16.10", "typedoc": "^0.18.0",
"typescript": "^3.8.2", "typescript": "^3.9.3",
"url-loader": "^3.0.0", "url-loader": "^3.0.0",
"val-loader": "2.1.0", "val-loader": "2.1.1",
"webpack": "^5.0.0-beta.13", "webpack": "^5.0.0-beta.18",
"webpack-cli": "^3.3.10", "webpack-cli": "^3.3.12",
"yaml-loader": "0.5.0" "yaml-loader": "0.6.0"
}, },
"resolutions": { "resolutions": {
"*/node-abi": "^2.14.0" "*/node-abi": "^2.14.0"
@@ -62,10 +62,13 @@
"build:typings": "node scripts/build-typings.js", "build:typings": "node scripts/build-typings.js",
"watch": "cross-env TERMINUS_DEV=1 webpack --progress --color --watch", "watch": "cross-env TERMINUS_DEV=1 webpack --progress --color --watch",
"start": "cross-env TERMINUS_DEV=1 electron app --debug", "start": "cross-env TERMINUS_DEV=1 electron app --debug",
"start:prod": "electron app --debug",
"prod": "cross-env TERMINUS_DEV=1 electron app", "prod": "cross-env TERMINUS_DEV=1 electron app",
"docs": "typedoc --out docs/api terminus-core/src && typedoc --out docs/api/terminal --tsconfig terminus-terminal/tsconfig.typings.json terminus-terminal/src && typedoc --out docs/api/settings --tsconfig terminus-settings/tsconfig.typings.json terminus-settings/src", "docs": "typedoc --out docs/api terminus-core/src && typedoc --out docs/api/terminal --tsconfig terminus-terminal/tsconfig.typings.json terminus-terminal/src && typedoc --out docs/api/settings --tsconfig terminus-settings/tsconfig.typings.json terminus-settings/src",
"lint": "eslint --ext ts */src */lib", "lint": "eslint --ext ts */src */lib",
"postinstall": "node ./scripts/install-deps.js" "postinstall": "node ./scripts/install-deps.js"
}, },
"repository": "eugeny/terminus" "repository": "eugeny/terminus",
"author": "Eugene Pankov",
"license": "MIT"
} }

View File

@@ -1,9 +1,10 @@
#!/usr/bin/env node #!/usr/bin/env node
const builder = require('electron-builder').build const builder = require('electron-builder').build
const vars = require('./vars') const vars = require('./vars')
const fs = require('fs')
const signHook = require('../build/mac/afterSignHook')
const isTag = (process.env.GITHUB_REF || '').startsWith('refs/tags/') const isTag = (process.env.GITHUB_REF || '').startsWith('refs/tags/')
const isCI = !!process.env.GITHUB_REF
builder({ builder({
dir: true, dir: true,
@@ -14,4 +15,7 @@ builder({
}, },
}, },
publish: isTag ? 'always' : 'onTag', publish: isTag ? 'always' : 'onTag',
}).catch(() => process.exit(1)) }).catch(e => {
console.error(e)
process.exit(1)
})

View File

@@ -4,7 +4,7 @@ module.exports = {
target: 'node', target: 'node',
entry: 'src/index.ts', entry: 'src/index.ts',
context: __dirname, context: __dirname,
devtool: 'eval-cheap-module-source-map', devtool: 'cheap-module-source-map',
output: { output: {
path: path.resolve(__dirname, 'dist'), path: path.resolve(__dirname, 'dist'),
filename: 'index.js', filename: 'index.js',

View File

@@ -30,7 +30,7 @@
"ng2-dnd": "^5.0.2", "ng2-dnd": "^5.0.2",
"ngx-perfect-scrollbar": "^8.0.0", "ngx-perfect-scrollbar": "^8.0.0",
"shell-escape": "^0.2.0", "shell-escape": "^0.2.0",
"uuid": "^7.0.1", "uuid": "^8.0.0",
"winston": "^3.2.1" "winston": "^3.2.1"
}, },
"peerDependencies": { "peerDependencies": {

View File

@@ -1,5 +1,8 @@
export interface SelectorOption<T> { export interface SelectorOption<T> {
name: string name: string
description?: string description?: string
result: T result?: T
icon?: string
freeInputPattern?: string
callback?: (string?) => void
} }

View File

@@ -4,11 +4,15 @@ title-bar(
) )
.content( .content(
[class.tabs-on-top]='config.store.appearance.tabsLocation == "top"' [class.tabs-on-top]='config.store.appearance.tabsLocation == "top" || config.store.appearance.tabsLocation == "left"',
[class.tabs-on-side]='hasVerticalTabs()',
) )
.tab-bar .tab-bar
.inset.background(*ngIf='hostApp.platform == Platform.macOS && config.store.appearance.frame == "thin" && config.store.appearance.tabsLocation == "top"') .inset.background(*ngIf='hostApp.platform == Platform.macOS \
&& config.store.appearance.frame == "thin" \
&& (config.store.appearance.tabsLocation == "top" || config.store.appearance.tabsLocation == "left")')
.tabs( .tabs(
*ngIf='config.store.appearance.tabsLocation != "bottom"'
dnd-sortable-container, dnd-sortable-container,
[sortableData]='app.tabs', [sortableData]='app.tabs',
) )
@@ -24,6 +28,7 @@ title-bar(
[active]='tab == app.activeTab', [active]='tab == app.activeTab',
[hasActivity]='tab.activity$|async', [hasActivity]='tab.activity$|async',
@animateTab, @animateTab,
[@.disabled]='hasVerticalTabs()',
(click)='app.selectTab(tab)', (click)='app.selectTab(tab)',
[class.fully-draggable]='hostApp.platform != Platform.macOS', [class.fully-draggable]='hostApp.platform != Platform.macOS',
[class.drag-region]='hostApp.platform == Platform.macOS && !tabsDragging', [class.drag-region]='hostApp.platform == Platform.macOS && !tabsDragging',
@@ -87,7 +92,8 @@ title-bar(
) )
window-controls.background( window-controls.background(
*ngIf='config.store.appearance.frame == "thin" && (hostApp.platform == Platform.Windows || hostApp.platform == Platform.Linux)', *ngIf='config.store.appearance.frame == "thin" \
&& (hostApp.platform == Platform.Windows || hostApp.platform == Platform.Linux)',
) )
start-page(*ngIf='ready && app.tabs.length == 0') start-page(*ngIf='ready && app.tabs.length == 0')

View File

@@ -15,10 +15,18 @@
$tabs-height: 38px; $tabs-height: 38px;
$tab-border-radius: 4px; $tab-border-radius: 4px;
$side-tab-width: 200px;
.wrap {
display: flex;
width: 100vw;
height: 100vh;
flex-direction: row;
}
.content { .content {
height: 100%; width: 100vw;
height: 100vh;
flex: auto; flex: auto;
display: flex; display: flex;
flex-direction: column-reverse; flex-direction: column-reverse;
@@ -26,15 +34,50 @@ $tab-border-radius: 4px;
&.tabs-on-top { &.tabs-on-top {
flex-direction: column; flex-direction: column;
} }
&.tabs-on-side {
flex-direction: row-reverse;
&.tabs-on-top {
flex-direction: row;
} }
}
}
.content.tabs-on-side > .tab-bar {
height: 100%;
width: $side-tab-width;
overflow-y: auto;
overflow-x: hidden;
flex-direction: column;
background: rgba(0, 0, 0, 0.25);
.tabs {
width: $side-tab-width;
flex: none;
flex-direction: column;
tab-header {
flex: 0 0 $tabs-height;
}
}
.drag-space {
flex: auto;
}
}
.tab-bar { .tab-bar {
flex: none; flex: none;
height: $tabs-height; height: $tabs-height;
display: flex; display: flex;
width: 100%;
.btn-tab-bar { .btn-tab-bar {
line-height: $tabs-height + 2px; line-height: $tabs-height + 2px;
height: $tabs-height;
cursor: pointer; cursor: pointer;
display: flex; display: flex;
@@ -74,7 +117,10 @@ $tab-border-radius: 4px;
& > .inset { & > .inset {
width: 85px; width: 85px;
height: $tabs-height;
flex: none; flex: none;
opacity: 0;
-webkit-app-region: drag;
} }
window-controls { window-controls {

View File

@@ -114,6 +114,9 @@ export class AppRootComponent {
if (hotkey === 'move-tab-right') { if (hotkey === 'move-tab-right') {
this.app.moveSelectedTabRight() this.app.moveSelectedTabRight()
} }
if (hotkey === 'reopen-tab') {
this.app.reopenLastTab()
}
} }
if (hotkey === 'toggle-fullscreen') { if (hotkey === 'toggle-fullscreen') {
this.hostApp.toggleFullscreen() this.hostApp.toggleFullscreen()
@@ -125,17 +128,8 @@ export class AppRootComponent {
this.docking.dock() this.docking.dock()
}) })
this.hostApp.secondInstance$.subscribe(() => {
this.presentWindow()
})
this.hotkeys.globalHotkey.subscribe(() => {
this.onGlobalHotkey()
})
this.hostApp.windowCloseRequest$.subscribe(async () => { this.hostApp.windowCloseRequest$.subscribe(async () => {
if (await this.app.closeAllTabs()) { this.app.closeWindow()
this.hostApp.closeWindow()
}
}) })
if (window['safeModeReason']) { if (window['safeModeReason']) {
@@ -174,41 +168,6 @@ export class AppRootComponent {
}) })
} }
onGlobalHotkey () {
if (this.hostApp.getWindow().isFocused()) {
this.hideWindow()
} else {
this.presentWindow()
}
}
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().show()
this.hostApp.getWindow().focus()
})
} else {
// docked, visible
this.hostApp.getWindow().hide()
}
}
}
hideWindow () {
this.electron.loseFocus()
this.hostApp.getWindow().blur()
if (this.hostApp.platform !== Platform.macOS) {
this.hostApp.getWindow().hide()
}
}
async ngOnInit () { async ngOnInit () {
this.ready = true this.ready = true
@@ -225,6 +184,10 @@ export class AppRootComponent {
return false return false
} }
hasVerticalTabs () {
return this.config.store.appearance.tabsLocation === 'left' || this.config.store.appearance.tabsLocation === 'right'
}
async updateApp () { async updateApp () {
if ((await this.electron.showMessageBox( if ((await this.electron.showMessageBox(
this.hostApp.getWindow(), this.hostApp.getWindow(),

View File

@@ -14,6 +14,11 @@ export interface BaseTabProcess {
* Abstract base class for custom tab components * Abstract base class for custom tab components
*/ */
export abstract class BaseTabComponent { export abstract class BaseTabComponent {
/**
* Parent tab (usually a SplitTabComponent)
*/
parent: BaseTabComponent|null = null
/** /**
* Current tab title * Current tab title
*/ */
@@ -63,7 +68,7 @@ export abstract class BaseTabComponent {
get destroyed$ (): Observable<void> { return this.destroyed } get destroyed$ (): Observable<void> { return this.destroyed }
get recoveryStateChangedHint$ (): Observable<void> { return this.recoveryStateChangedHint } get recoveryStateChangedHint$ (): Observable<void> { return this.recoveryStateChangedHint }
constructor () { protected constructor () {
this.focused$.subscribe(() => { this.focused$.subscribe(() => {
this.hasFocus = true this.hasFocus = true
}) })

View File

@@ -4,15 +4,23 @@
[(ngModel)]='filter', [(ngModel)]='filter',
autofocus, autofocus,
[placeholder]='name', [placeholder]='name',
(ngModelChange)='onFilterChange()', (ngModelChange)='onFilterChange()'
(keyup.enter)='onFilterEnter()',
(keyup.escape)='close()'
) )
.list-group.mt-3(*ngIf='filteredOptions.length') .list-group.mt-3(*ngIf='filteredOptions.length')
a.list-group-item.list-group-item-action.d-flex.align-items-center( a.list-group-item.list-group-item-action.d-flex.align-items-center(
#item,
(click)='selectOption(option)', (click)='selectOption(option)',
*ngFor='let option of filteredOptions' [class.active]='selectedIndex == i',
*ngFor='let option of filteredOptions; let i = index'
) )
.mr-2 {{option.name}} i.icon(
class='fa-fw fas fa-{{option.icon}}',
*ngIf='!iconIsSVG(option.icon)'
)
.icon(
[fastHtmlBind]='option.icon',
*ngIf='iconIsSVG(option.icon)'
)
.mr-2.title {{getOptionText(option)}}
.text-muted {{option.description}} .text-muted {{option.description}}

View File

@@ -0,0 +1,13 @@
.list-group {
max-height: 70vh;
overflow: auto;
}
.icon {
width: 1.25rem;
margin-right: 0.25rem;
}
.title {
margin-left: 10px;
}

View File

@@ -1,17 +1,19 @@
import { Component, Input } from '@angular/core' import { Component, Input, HostListener, ViewChildren, QueryList, ElementRef } from '@angular/core'
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
import { SelectorOption } from '../api/selector' import { SelectorOption } from '../api/selector'
/** @hidden */ /** @hidden */
@Component({ @Component({
template: require('./selectorModal.component.pug'), template: require('./selectorModal.component.pug'),
// styles: [require('./selectorModal.component.scss')], styles: [require('./selectorModal.component.scss')],
}) })
export class SelectorModalComponent<T> { export class SelectorModalComponent<T> {
@Input() options: SelectorOption<T>[] @Input() options: SelectorOption<T>[]
@Input() filteredOptions: SelectorOption<T>[] @Input() filteredOptions: SelectorOption<T>[]
@Input() filter = '' @Input() filter = ''
@Input() name: string @Input() name: string
@Input() selectedIndex = 0
@ViewChildren('item') itemChildren: QueryList<ElementRef>
constructor ( constructor (
public modalInstance: NgbActiveModal, public modalInstance: NgbActiveModal,
@@ -21,27 +23,56 @@ export class SelectorModalComponent<T> {
this.onFilterChange() this.onFilterChange()
} }
@HostListener('keyup', ['$event']) onKeyUp (event: KeyboardEvent): void {
if (event.key === 'ArrowUp') {
this.selectedIndex--
}
if (event.key === 'ArrowDown') {
this.selectedIndex++
}
if (event.key === 'Enter') {
this.selectOption(this.filteredOptions[this.selectedIndex])
}
if (event.key === 'Escape') {
this.close()
}
this.selectedIndex = (this.selectedIndex + this.filteredOptions.length) % this.filteredOptions.length
Array.from(this.itemChildren)[this.selectedIndex]?.nativeElement.scrollIntoView({
behavior: 'smooth',
block: 'nearest',
})
}
onFilterChange (): void { onFilterChange (): void {
const f = this.filter.trim().toLowerCase() const f = this.filter.trim().toLowerCase()
if (!f) { if (!f) {
this.filteredOptions = this.options this.filteredOptions = this.options.filter(x => !x.freeInputPattern)
} else { } else {
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands // eslint-disable-next-line @typescript-eslint/restrict-plus-operands
this.filteredOptions = this.options.filter(x => (x.name + (x.description || '')).toLowerCase().includes(f)) this.filteredOptions = this.options.filter(x => x.freeInputPattern || (x.name + (x.description || '')).toLowerCase().includes(f))
} }
this.selectedIndex = Math.max(0, this.selectedIndex)
this.selectedIndex = Math.min(this.filteredOptions.length - 1, this.selectedIndex)
} }
onFilterEnter (): void { getOptionText (option: SelectorOption<T>): string {
if (this.filteredOptions.length === 1) { if (option.freeInputPattern) {
this.selectOption(this.filteredOptions[0]) return option.freeInputPattern.replace('%s', this.filter)
} }
return option.name
} }
selectOption (option: SelectorOption<T>): void { selectOption (option: SelectorOption<T>): void {
option.callback?.(this.filter)
this.modalInstance.close(option.result) this.modalInstance.close(option.result)
} }
close (): void { close (): void {
this.modalInstance.dismiss() this.modalInstance.dismiss()
} }
iconIsSVG (icon: string): boolean {
return icon?.startsWith('<')
}
} }

View File

@@ -157,6 +157,10 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
/** @hidden */ /** @hidden */
_spanners: SplitSpannerInfo[] = [] _spanners: SplitSpannerInfo[] = []
/** @hidden */
_allFocusMode = false
/** @hidden */
private focusedTab: BaseTabComponent private focusedTab: BaseTabComponent
private maximizedTab: BaseTabComponent|null = null private maximizedTab: BaseTabComponent|null = null
private hotkeysSubscription: Subscription private hotkeysSubscription: Subscription
@@ -254,12 +258,13 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
if (this._recoveredState) { if (this._recoveredState) {
await this.recoverContainer(this.root, this._recoveredState) await this.recoverContainer(this.root, this._recoveredState)
this.layout() this.layout()
setImmediate(() => { setTimeout(() => {
if (this.hasFocus) { if (this.hasFocus) {
this.getAllTabs().forEach(x => x.emitFocused()) for (const tab of this.getAllTabs()) {
this.focusAnyIn(this.root) this.focus(tab)
} }
}) }
}, 100)
} }
this.initialized.next() this.initialized.next()
this.initialized.complete() this.initialized.complete()
@@ -324,7 +329,7 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
* Inserts a new `tab` to the `side` of the `relative` tab * Inserts a new `tab` to the `side` of the `relative` tab
*/ */
async addTab (tab: BaseTabComponent, relative: BaseTabComponent|null, side: SplitDirection): Promise<void> { async addTab (tab: BaseTabComponent, relative: BaseTabComponent|null, side: SplitDirection): Promise<void> {
await this.initialized$.toPromise() tab.parent = this
let target = (relative ? this.getParentOf(relative) : null) || this.root let target = (relative ? this.getParentOf(relative) : null) || this.root
let insertIndex = relative ? target.children.indexOf(relative) : -1 let insertIndex = relative ? target.children.indexOf(relative) : -1
@@ -355,6 +360,9 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
target.children.splice(insertIndex, 0, tab) target.children.splice(insertIndex, 0, tab)
this.recoveryStateChangedHint.next() this.recoveryStateChangedHint.next()
await this.initialized$.toPromise()
this.attachTabView(tab) this.attachTabView(tab)
setImmediate(() => { setImmediate(() => {
@@ -374,11 +382,11 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
parent.children.splice(index, 1) parent.children.splice(index, 1)
this.detachTabView(tab) this.detachTabView(tab)
tab.parent = null
this.layout() this.layout()
this.tabRemoved.next(tab) this.tabRemoved.next(tab)
if (this.root.children.length === 0) { if (this.root.children.length === 0) {
this.destroy() this.destroy()
} else { } else {
@@ -477,6 +485,12 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
} }
} }
layout (): void {
this.root.normalize()
this._spanners = []
this.layoutInternal(this.root, 0, 0, 100, 100)
}
private attachTabView (tab: BaseTabComponent) { private attachTabView (tab: BaseTabComponent) {
const ref = this.viewContainer.insert(tab.hostView) as EmbeddedViewRef<any> // eslint-disable-line @typescript-eslint/no-unnecessary-type-assertion const ref = this.viewContainer.insert(tab.hostView) as EmbeddedViewRef<any> // eslint-disable-line @typescript-eslint/no-unnecessary-type-assertion
this.viewRefs.set(tab, ref) this.viewRefs.set(tab, ref)
@@ -502,12 +516,6 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
} }
} }
private layout () {
this.root.normalize()
this._spanners = []
this.layoutInternal(this.root, 0, 0, 100, 100)
}
private layoutInternal (root: SplitContainer, x: number, y: number, w: number, h: number) { private layoutInternal (root: SplitContainer, x: number, y: number, w: number, h: number) {
const size = root.orientation === 'v' ? h : w const size = root.orientation === 'v' ? h : w
const sizes = root.ratios.map(x => x * size) const sizes = root.ratios.map(x => x * size)
@@ -526,11 +534,13 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
if (child instanceof SplitContainer) { if (child instanceof SplitContainer) {
this.layoutInternal(child, childX, childY, childW, childH) this.layoutInternal(child, childX, childY, childW, childH)
} else { } else {
const element = this.viewRefs.get(child)!.rootNodes[0] const viewRef = this.viewRefs.get(child)
if (viewRef) {
const element = viewRef.rootNodes[0]
element.classList.toggle('child', true) element.classList.toggle('child', true)
element.classList.toggle('maximized', child === this.maximizedTab) element.classList.toggle('maximized', child === this.maximizedTab)
element.classList.toggle('minimized', this.maximizedTab && child !== this.maximizedTab) element.classList.toggle('minimized', this.maximizedTab && child !== this.maximizedTab)
element.classList.toggle('focused', child === this.focusedTab) element.classList.toggle('focused', this._allFocusMode || child === this.focusedTab)
element.style.left = `${childX}%` element.style.left = `${childX}%`
element.style.top = `${childY}%` element.style.top = `${childY}%`
element.style.width = `${childW}%` element.style.width = `${childW}%`
@@ -543,6 +553,7 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
element.style.height = '90%' element.style.height = '90%'
} }
} }
}
offset += sizes[i] offset += sizes[i]
if (i !== 0) { if (i !== 0) {
@@ -569,6 +580,7 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
if (recovered) { if (recovered) {
const tab = this.tabsService.create(recovered.type, recovered.options) const tab = this.tabsService.create(recovered.type, recovered.options)
children.push(tab) children.push(tab)
tab.parent = this
this.attachTabView(tab) this.attachTabView(tab)
} else { } else {
state.ratios.splice(state.children.indexOf(childState), 0) state.ratios.splice(state.children.indexOf(childState), 0)

View File

@@ -13,7 +13,7 @@ import { ToolbarButton, ToolbarButtonProvider } from '../api'
export class StartPageComponent { export class StartPageComponent {
version: string version: string
constructor ( private constructor (
private config: ConfigService, private config: ConfigService,
private domSanitizer: DomSanitizer, private domSanitizer: DomSanitizer,
public homeBase: HomeBaseService, public homeBase: HomeBaseService,

View File

@@ -1,7 +1,7 @@
.progressbar([style.width]='progress + "%"', *ngIf='progress != null') .progressbar([style.width]='progress + "%"', *ngIf='progress != null')
.index( .index(*ngIf='!config.store.terminal.hideTabIndex',
#handle, #handle,
[style.background-color]='tab.color', [style.background-color]='tab.color',
) {{index + 1}} ) {{index + 1}}
.name([title]='tab.customTitle || tab.title') {{tab.customTitle || tab.title}} .name([title]='tab.customTitle || tab.title') {{tab.customTitle || tab.title}}
button((click)='app.closeTab(tab, true)') &times; button(*ngIf='!config.store.terminal.hideCloseButton',(click)='app.closeTab(tab, true)') &times;

View File

@@ -13,6 +13,11 @@ $tabs-height: 38px;
overflow: hidden; overflow: hidden;
&.vertical {
flex: none;
height: $tabs-height;
}
.index { .index {
flex: none; flex: none;
font-weight: bold; font-weight: bold;

View File

@@ -9,6 +9,7 @@ import { HotkeysService } from '../services/hotkeys.service'
import { ElectronService } from '../services/electron.service' import { ElectronService } from '../services/electron.service'
import { AppService } from '../services/app.service' import { AppService } from '../services/app.service'
import { HostAppService, Platform } from '../services/hostApp.service' import { HostAppService, Platform } from '../services/hostApp.service'
import { ConfigService } from '../services/config.service'
/** @hidden */ /** @hidden */
export interface SortableComponentProxy { export interface SortableComponentProxy {
@@ -31,6 +32,7 @@ export class TabHeaderComponent {
private constructor ( private constructor (
public app: AppService, public app: AppService,
public config: ConfigService,
private electron: ElectronService, private electron: ElectronService,
private hostApp: HostAppService, private hostApp: HostAppService,
private ngbModal: NgbModal, private ngbModal: NgbModal,

View File

@@ -1,26 +1,33 @@
.container.mt-5.mb-5
.mb-4 .mb-4
.terminus-logo .terminus-logo
h1.terminus-title Terminus h1.terminus-title Terminus
sup α sup α
.container
.text-center.mb-5 Thank you for downloading Terminus! .text-center.mb-5 Thank you for downloading Terminus!
.form-line .form-line
.header .header
.title Enable analytics .title Enable analytics
.description Help us track the number of Terminus installs across the world! .description Help track the number of Terminus installs across the world!
toggle([(ngModel)]='config.store.enableAnalytics') toggle([(ngModel)]='config.store.enableAnalytics')
.form-line .form-line
.header .header
.title Enable SSH plugin .title Enable global hotkey (#[strong Ctrl-Space])
.description Toggles the Terminus window visibility
toggle([(ngModel)]='enableGlobalHotkey')
.form-line
.header
.title Enable #[strong SSH] plugin
.description Adds an SSH connection manager UI to Terminus .description Adds an SSH connection manager UI to Terminus
toggle([(ngModel)]='enableSSH') toggle([(ngModel)]='enableSSH')
.form-line .form-line
.header .header
.title Enable Serial plugin .title Enable #[strong Serial] plugin
.description Allows attaching Terminus to serial ports .description Allows attaching Terminus to serial ports
toggle([(ngModel)]='enableSerial') toggle([(ngModel)]='enableSerial')

View File

@@ -2,5 +2,7 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
margin: auto; margin: auto;
flex: 0 1 500px; flex: auto;
max-height: 100%;
overflow-y: auto;
} }

View File

@@ -13,6 +13,7 @@ import { HostAppService } from '../services/hostApp.service'
export class WelcomeTabComponent extends BaseTabComponent { export class WelcomeTabComponent extends BaseTabComponent {
enableSSH = false enableSSH = false
enableSerial = false enableSerial = false
enableGlobalHotkey = true
constructor ( constructor (
private hostApp: HostAppService, private hostApp: HostAppService,
@@ -33,6 +34,9 @@ export class WelcomeTabComponent extends BaseTabComponent {
if (!this.enableSerial) { if (!this.enableSerial) {
this.config.store.pluginBlacklist.push('serial') this.config.store.pluginBlacklist.push('serial')
} }
if (!this.enableGlobalHotkey) {
this.config.store.hotkeys['toggle-window'] = []
}
this.config.save() this.config.save()
this.hostApp.getWindow().reload() this.hostApp.getWindow().reload()
} }

View File

@@ -10,11 +10,9 @@ import { AppService } from '../services/app.service'
styles: [require('./windowControls.component.scss')], styles: [require('./windowControls.component.scss')],
}) })
export class WindowControlsComponent { export class WindowControlsComponent {
constructor (public hostApp: HostAppService, public app: AppService) { } private constructor (public hostApp: HostAppService, public app: AppService) { }
async closeWindow () { async closeWindow () {
if (await this.app.closeAllTabs()) { this.app.closeWindow()
this.hostApp.closeWindow()
}
} }
} }

View File

@@ -7,6 +7,8 @@ hotkeys:
- 'F11' - 'F11'
close-tab: close-tab:
- 'Ctrl-Shift-W' - 'Ctrl-Shift-W'
reopen-tab:
- 'Ctrl-Shift-T'
toggle-last-tab: [] toggle-last-tab: []
rename-tab: rename-tab:
- 'Ctrl-Shift-R' - 'Ctrl-Shift-R'

View File

@@ -7,6 +7,8 @@ hotkeys:
- 'Ctrl+⌘+F' - 'Ctrl+⌘+F'
close-tab: close-tab:
- '⌘-W' - '⌘-W'
reopen-tab:
- '⌘-Shift-T'
toggle-last-tab: [] toggle-last-tab: []
rename-tab: rename-tab:
- '⌘-R' - '⌘-R'

View File

@@ -8,6 +8,8 @@ hotkeys:
- 'Alt-Enter' - 'Alt-Enter'
close-tab: close-tab:
- 'Ctrl-Shift-W' - 'Ctrl-Shift-W'
reopen-tab:
- 'Ctrl-Shift-T'
toggle-last-tab: [] toggle-last-tab: []
rename-tab: rename-tab:
- 'Ctrl-Shift-R' - 'Ctrl-Shift-R'

View File

@@ -2,6 +2,8 @@ appearance:
dock: off dock: off
dockScreen: current dockScreen: current
dockFill: 0.5 dockFill: 0.5
dockHideOnBlur: false
dockAlwaysOnTop: true
tabsLocation: top tabsLocation: top
cycleTabs: true cycleTabs: true
theme: Standard theme: Standard

View File

@@ -25,6 +25,10 @@ export class AppHotkeyProvider extends HotkeyProvider {
id: 'close-tab', id: 'close-tab',
name: 'Close tab', name: 'Close tab',
}, },
{
id: 'reopen-tab',
name: 'Reopen last tab',
},
{ {
id: 'toggle-last-tab', id: 'toggle-last-tab',
name: 'Toggle last tab', name: 'Toggle last tab',

View File

@@ -36,7 +36,7 @@ import { ConfigService } from './services/config.service'
import { StandardTheme, StandardCompactTheme, PaperTheme } from './theme' import { StandardTheme, StandardCompactTheme, PaperTheme } from './theme'
import { CoreConfigProvider } from './config' import { CoreConfigProvider } from './config'
import { AppHotkeyProvider } from './hotkeys' import { AppHotkeyProvider } from './hotkeys'
import { TaskCompletionContextMenu, CommonOptionsContextMenu, CloseContextMenu } from './tabContextMenu' import { TaskCompletionContextMenu, CommonOptionsContextMenu, TabManagementContextMenu } from './tabContextMenu'
import 'perfect-scrollbar/css/perfect-scrollbar.css' import 'perfect-scrollbar/css/perfect-scrollbar.css'
import 'ng2-dnd/bundles/style.css' import 'ng2-dnd/bundles/style.css'
@@ -54,7 +54,7 @@ const PROVIDERS = [
{ provide: Theme, useClass: PaperTheme, multi: true }, { provide: Theme, useClass: PaperTheme, multi: true },
{ provide: ConfigProvider, useClass: CoreConfigProvider, multi: true }, { provide: ConfigProvider, useClass: CoreConfigProvider, multi: true },
{ provide: TabContextMenuItemProvider, useClass: CommonOptionsContextMenu, multi: true }, { provide: TabContextMenuItemProvider, useClass: CommonOptionsContextMenu, multi: true },
{ provide: TabContextMenuItemProvider, useClass: CloseContextMenu, multi: true }, { provide: TabContextMenuItemProvider, useClass: TabManagementContextMenu, multi: true },
{ provide: TabContextMenuItemProvider, useClass: TaskCompletionContextMenu, multi: true }, { provide: TabContextMenuItemProvider, useClass: TaskCompletionContextMenu, multi: true },
{ provide: TabRecoveryProvider, useClass: SplitTabRecoveryProvider, multi: true }, { provide: TabRecoveryProvider, useClass: SplitTabRecoveryProvider, multi: true },
{ provide: PERFECT_SCROLLBAR_CONFIG, useValue: { suppressScrollX: true } }, { provide: PERFECT_SCROLLBAR_CONFIG, useValue: { suppressScrollX: true } },

View File

@@ -8,6 +8,7 @@ import { BaseTabComponent } from '../components/baseTab.component'
import { SplitTabComponent } from '../components/splitTab.component' import { SplitTabComponent } from '../components/splitTab.component'
import { SelectorModalComponent } from '../components/selectorModal.component' import { SelectorModalComponent } from '../components/selectorModal.component'
import { SelectorOption } from '../api/selector' import { SelectorOption } from '../api/selector'
import { RecoveryToken } from '../api/tabRecovery'
import { ConfigService } from './config.service' import { ConfigService } from './config.service'
import { HostAppService } from './hostApp.service' import { HostAppService } from './hostApp.service'
@@ -49,6 +50,7 @@ export class AppService {
private lastTabIndex = 0 private lastTabIndex = 0
private _activeTab: BaseTabComponent private _activeTab: BaseTabComponent
private closedTabsStack: RecoveryToken[] = []
private activeTabChange = new Subject<BaseTabComponent>() private activeTabChange = new Subject<BaseTabComponent>()
private tabsChanged = new Subject<void>() private tabsChanged = new Subject<void>()
@@ -67,39 +69,44 @@ export class AppService {
get ready$ (): Observable<void> { return this.ready } get ready$ (): Observable<void> { return this.ready }
/** @hidden */ /** @hidden */
constructor ( private constructor (
private config: ConfigService, private config: ConfigService,
private hostApp: HostAppService, private hostApp: HostAppService,
private tabRecovery: TabRecoveryService, private tabRecovery: TabRecoveryService,
private tabsService: TabsService, private tabsService: TabsService,
private ngbModal: NgbModal, private ngbModal: NgbModal,
) { ) {
if (hostApp.getWindow().id === 1) {
if (config.store.terminal.recoverTabs) {
this.tabRecovery.recoverTabs().then(tabs => {
for (const tab of tabs) {
this.openNewTabRaw(tab.type, tab.options)
}
this.startTabStorage()
})
} else {
/** Continue to store the tabs even if the setting is currently off */
this.startTabStorage()
}
}
hostApp.windowFocused$.subscribe(() => {
this._activeTab?.emitFocused()
})
}
startTabStorage (): void {
this.tabsChanged$.subscribe(() => { this.tabsChanged$.subscribe(() => {
this.tabRecovery.saveTabs(this.tabs) this.tabRecovery.saveTabs(this.tabs)
}) })
setInterval(() => { setInterval(() => {
this.tabRecovery.saveTabs(this.tabs) this.tabRecovery.saveTabs(this.tabs)
}, 30000) }, 30000)
if (hostApp.getWindow().id === 1) {
if (config.store.terminal.recoverTabs) {
this.tabRecovery.recoverTabs().then(tabs => {
for (const tab of tabs) {
this.openNewTabRaw(tab.type, tab.options)
}
this.tabRecovery.enabled = true
})
} else {
/** Continue to store the tabs even if the setting is currently off */
this.tabRecovery.enabled = true
}
}
hostApp.windowFocused$.subscribe(() => {
this._activeTab?.emitFocused()
})
this.tabClosed$.subscribe(async tab => {
const token = await tab.getRecoveryToken()
if (token) {
this.closedTabsStack.push(token)
}
})
} }
addTabRaw (tab: BaseTabComponent, index: number|null = null): void { addTabRaw (tab: BaseTabComponent, index: number|null = null): void {
@@ -163,6 +170,23 @@ export class AppService {
return tab return tab
} }
async reopenLastTab (): Promise<BaseTabComponent|null> {
const token = this.closedTabsStack.pop()
if (token) {
const recoveredTab = await this.tabRecovery.recoverTab(token)
if (recoveredTab) {
const tab = this.tabsService.create(recoveredTab.type, recoveredTab.options)
if (this.activeTab) {
this.addTabRaw(tab, this.tabs.indexOf(this.activeTab) + 1)
} else {
this.addTabRaw(tab)
}
return tab
}
}
return null
}
selectTab (tab: BaseTabComponent): void { selectTab (tab: BaseTabComponent): void {
if (this._activeTab === tab) { if (this._activeTab === tab) {
this._activeTab.emitFocused() this._activeTab.emitFocused()
@@ -295,6 +319,16 @@ export class AppService {
return true return true
} }
async closeWindow (): Promise<void> {
this.tabRecovery.enabled = false
await this.tabRecovery.saveTabs(this.tabs)
if (await this.closeAllTabs()) {
this.hostApp.closeWindow()
} else {
this.tabRecovery.enabled = true
}
}
/** @hidden */ /** @hidden */
emitReady (): void { emitReady (): void {
this.ready.next() this.ready.next()

View File

@@ -102,7 +102,7 @@ export class ConfigService {
get changed$ (): Observable<void> { return this.changed } get changed$ (): Observable<void> { return this.changed }
/** @hidden */ /** @hidden */
constructor ( private constructor (
electron: ElectronService, electron: ElectronService,
private hostApp: HostAppService, private hostApp: HostAppService,
@Inject(ConfigProvider) configProviders: ConfigProvider[], @Inject(ConfigProvider) configProviders: ConfigProvider[],
@@ -155,9 +155,11 @@ export class ConfigService {
} }
save (): void { save (): void {
// Scrub undefined values
this._store = JSON.parse(JSON.stringify(this._store))
fs.writeFileSync(this.path, yaml.safeDump(this._store), 'utf8') fs.writeFileSync(this.path, yaml.safeDump(this._store), 'utf8')
this.emitChange() this.emitChange()
this.hostApp.broadcastConfigChange() this.hostApp.broadcastConfigChange(this.store)
} }
/** /**

View File

@@ -6,7 +6,7 @@ import { HostAppService, Bounds } from '../services/hostApp.service'
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class DockingService { export class DockingService {
/** @hidden */ /** @hidden */
constructor ( private constructor (
private electron: ElectronService, private electron: ElectronService,
private config: ConfigService, private config: ConfigService,
private hostApp: HostAppService, private hostApp: HostAppService,
@@ -53,7 +53,9 @@ export class DockingService {
newBounds.y = display.bounds.y newBounds.y = display.bounds.y
} }
this.hostApp.setAlwaysOnTop(true) const alwaysOnTop = this.config.store.appearance.dockAlwaysOnTop
this.hostApp.setAlwaysOnTop(alwaysOnTop)
setImmediate(() => { setImmediate(() => {
this.hostApp.setBounds(newBounds) this.hostApp.setBounds(newBounds)
}) })

View File

@@ -25,7 +25,7 @@ export class ElectronService {
private electron: any private electron: any
/** @hidden */ /** @hidden */
constructor () { private constructor () {
this.electron = require('electron') this.electron = require('electron')
this.remote = this.electron.remote this.remote = this.electron.remote
this.app = this.remote.app this.app = this.remote.app
@@ -43,15 +43,6 @@ export class ElectronService {
this.MenuItem = this.remote.MenuItem this.MenuItem = this.remote.MenuItem
} }
/**
* Removes OS focus from Terminus' window
*/
loseFocus (): void {
if (process.platform === 'darwin') {
this.remote.Menu.sendActionToFirstResponder('hide:')
}
}
async showMessageBox ( async showMessageBox (
browserWindow: Electron.BrowserWindow, browserWindow: Electron.BrowserWindow,
options: Electron.MessageBoxOptions options: Electron.MessageBoxOptions

View File

@@ -3,7 +3,7 @@ import { Injectable } from '@angular/core'
import { ElectronService } from './electron.service' import { ElectronService } from './electron.service'
import { ConfigService } from './config.service' import { ConfigService } from './config.service'
import * as mixpanel from 'mixpanel' import * as mixpanel from 'mixpanel'
import * as uuidv4 from 'uuid/v4' import { v4 as uuidv4 } from 'uuid'
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class HomeBaseService { export class HomeBaseService {
@@ -11,7 +11,7 @@ export class HomeBaseService {
mixpanel: any mixpanel: any
/** @hidden */ /** @hidden */
constructor ( private constructor (
private electron: ElectronService, private electron: ElectronService,
private config: ConfigService, private config: ConfigService,
) { ) {

View File

@@ -166,7 +166,6 @@ export class HostAppService {
this.configChangeBroadcast.next() this.configChangeBroadcast.next()
})) }))
if ( if (
isWindowsBuild(WIN_BUILD_FLUENT_BG_SUPPORTED) && isWindowsBuild(WIN_BUILD_FLUENT_BG_SUPPORTED) &&
!isWindowsBuild(WIN_BUILD_FLUENT_BG_MOVE_BUG_FIXED) !isWindowsBuild(WIN_BUILD_FLUENT_BG_MOVE_BUG_FIXED)
@@ -251,8 +250,8 @@ export class HostAppService {
/** /**
* Notifies other windows of config file changes * Notifies other windows of config file changes
*/ */
broadcastConfigChange (): void { broadcastConfigChange (configStore: {[k: string]: any}): void {
this.electron.ipcRenderer.send('app:config-change') this.electron.ipcRenderer.send('app:config-change', configStore)
} }
emitReady (): void { emitReady (): void {
@@ -267,6 +266,10 @@ export class HostAppService {
this.electron.ipcRenderer.send('window-close') this.electron.ipcRenderer.send('window-close')
} }
registerGlobalHotkey (specs: string[]): void {
this.electron.ipcRenderer.send('app:register-global-hotkey', specs)
}
relaunch (): void { relaunch (): void {
if (this.isPortable) { if (this.isPortable) {
this.electron.app.relaunch({ execPath: process.env.PORTABLE_EXECUTABLE_FILE }) this.electron.app.relaunch({ execPath: process.env.PORTABLE_EXECUTABLE_FILE })

View File

@@ -2,8 +2,9 @@ import { Injectable, Inject, NgZone, EventEmitter } from '@angular/core'
import { Observable, Subject } from 'rxjs' import { Observable, Subject } from 'rxjs'
import { HotkeyDescription, HotkeyProvider } from '../api/hotkeyProvider' import { HotkeyDescription, HotkeyProvider } from '../api/hotkeyProvider'
import { stringifyKeySequence } from './hotkeys.util' import { stringifyKeySequence } from './hotkeys.util'
import { ConfigService } from '../services/config.service' import { ConfigService } from './config.service'
import { ElectronService } from '../services/electron.service' import { ElectronService } from './electron.service'
import { HostAppService } from './hostApp.service'
export interface PartialHotkeyMatch { export interface PartialHotkeyMatch {
id: string id: string
@@ -30,7 +31,6 @@ export class HotkeysService {
*/ */
get hotkey$ (): Observable<string> { return this._hotkey } get hotkey$ (): Observable<string> { return this._hotkey }
globalHotkey = new EventEmitter<void>()
private _hotkey = new Subject<string>() private _hotkey = new Subject<string>()
private currentKeystrokes: EventBufferEntry[] = [] private currentKeystrokes: EventBufferEntry[] = []
private disabledLevel = 0 private disabledLevel = 0
@@ -38,6 +38,7 @@ export class HotkeysService {
private constructor ( private constructor (
private zone: NgZone, private zone: NgZone,
private hostApp: HostAppService,
private electron: ElectronService, private electron: ElectronService,
private config: ConfigService, private config: ConfigService,
@Inject(HotkeyProvider) private hotkeyProviders: HotkeyProvider[], @Inject(HotkeyProvider) private hotkeyProviders: HotkeyProvider[],
@@ -182,21 +183,23 @@ export class HotkeysService {
if (typeof value === 'string') { if (typeof value === 'string') {
value = [value] value = [value]
} }
const specs: string[] = []
value.forEach((item: string | string[]) => { value.forEach((item: string | string[]) => {
item = typeof item === 'string' ? [item] : item item = typeof item === 'string' ? [item] : item
try { try {
let electronKeySpec = item[0] let electronKeySpec = item[0]
electronKeySpec = electronKeySpec.replace('Meta', 'Super')
electronKeySpec = electronKeySpec.replace('⌘', 'Command') electronKeySpec = electronKeySpec.replace('⌘', 'Command')
electronKeySpec = electronKeySpec.replace('⌥', 'Alt') electronKeySpec = electronKeySpec.replace('⌥', 'Alt')
electronKeySpec = electronKeySpec.replace(/-/g, '+') electronKeySpec = electronKeySpec.replace(/-/g, '+')
this.electron.globalShortcut.register(electronKeySpec, () => { specs.push(electronKeySpec)
this.globalHotkey.emit()
})
} catch (err) { } catch (err) {
console.error('Could not register the global hotkey:', err) console.error('Could not register the global hotkey:', err)
} }
}) })
this.hostApp.registerGlobalHotkey(specs)
} }
private getHotkeysConfig () { private getHotkeysConfig () {

View File

@@ -65,7 +65,7 @@ export class LogService {
private log: any private log: any
/** @hidden */ /** @hidden */
constructor (electron: ElectronService) { private constructor (electron: ElectronService) {
this.log = initializeWinston(electron) this.log = initializeWinston(electron)
} }

View File

@@ -33,7 +33,7 @@ export class ShellIntegrationService {
command: 'paste "%V"', command: 'paste "%V"',
}, },
] ]
constructor ( private constructor (
private electron: ElectronService, private electron: ElectronService,
private hostApp: HostAppService, private hostApp: HostAppService,
) { ) {

View File

@@ -8,8 +8,9 @@ import { ConfigService } from '../services/config.service'
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class TabRecoveryService { export class TabRecoveryService {
logger: Logger logger: Logger
enabled = false
constructor ( private constructor (
@Inject(TabRecoveryProvider) private tabRecoveryProviders: TabRecoveryProvider[], @Inject(TabRecoveryProvider) private tabRecoveryProviders: TabRecoveryProvider[],
private config: ConfigService, private config: ConfigService,
log: LogService log: LogService
@@ -18,6 +19,9 @@ export class TabRecoveryService {
} }
async saveTabs (tabs: BaseTabComponent[]): Promise<void> { async saveTabs (tabs: BaseTabComponent[]): Promise<void> {
if (!this.enabled) {
return
}
window.localStorage.tabsRecovery = JSON.stringify( window.localStorage.tabsRecovery = JSON.stringify(
await Promise.all( await Promise.all(
tabs tabs
@@ -25,9 +29,12 @@ export class TabRecoveryService {
let token = tab.getRecoveryToken() let token = tab.getRecoveryToken()
if (token) { if (token) {
token = token.then(r => { token = token.then(r => {
if (r && tab.color) { if (r) {
r.tabTitle = tab.title
if (tab.color) {
r.tabColor = tab.color r.tabColor = tab.color
} }
}
return r return r
}) })
} }
@@ -45,6 +52,7 @@ export class TabRecoveryService {
if (tab !== null) { if (tab !== null) {
tab.options = tab.options || {} tab.options = tab.options || {}
tab.options.color = token.tabColor || null tab.options.color = token.tabColor || null
tab.options.title = token.tabTitle || ''
return tab return tab
} }
} catch (error) { } catch (error) {

View File

@@ -8,7 +8,7 @@ export type TabComponentType = new (...args: any[]) => BaseTabComponent
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class TabsService { export class TabsService {
/** @hidden */ /** @hidden */
constructor ( private constructor (
private componentFactoryResolver: ComponentFactoryResolver, private componentFactoryResolver: ComponentFactoryResolver,
private injector: Injector, private injector: Injector,
private tabRecovery: TabRecoveryService, private tabRecovery: TabRecoveryService,

View File

@@ -7,7 +7,7 @@ export class ThemesService {
private styleElement: HTMLElement|null = null private styleElement: HTMLElement|null = null
/** @hidden */ /** @hidden */
constructor ( private constructor (
private config: ConfigService, private config: ConfigService,
@Inject(Theme) private themes: Theme[], @Inject(Theme) private themes: Theme[],
) { ) {

View File

@@ -14,7 +14,7 @@ export class TouchbarService {
private tabSegments: SegmentedControlSegment[] = [] private tabSegments: SegmentedControlSegment[] = []
private nsImageCache: {[id: string]: Electron.NativeImage} = {} private nsImageCache: {[id: string]: Electron.NativeImage} = {}
constructor ( private constructor (
private app: AppService, private app: AppService,
private hostApp: HostAppService, private hostApp: HostAppService,
@Inject(ToolbarButtonProvider) private toolbarButtonProviders: ToolbarButtonProvider[], @Inject(ToolbarButtonProvider) private toolbarButtonProviders: ToolbarButtonProvider[],

View File

@@ -1,14 +1,9 @@
import axios from 'axios' import axios from 'axios'
import * as fs from 'fs'
import os from 'os'
import { spawn } from 'mz/child_process'
import { Injectable } from '@angular/core' import { Injectable } from '@angular/core'
import { Logger, LogService } from './log.service' import { Logger, LogService } from './log.service'
import { ElectronService } from './electron.service' import { ElectronService } from './electron.service'
import { ConfigService } from './config.service' import { ConfigService } from './config.service'
import { AppUpdater } from 'electron-updater'
const UPDATES_URL = 'https://api.github.com/repos/eugeny/terminus/releases/latest' const UPDATES_URL = 'https://api.github.com/repos/eugeny/terminus/releases/latest'
@@ -19,9 +14,8 @@ export class UpdaterService {
private downloaded: Promise<boolean> private downloaded: Promise<boolean>
private electronUpdaterAvailable = true private electronUpdaterAvailable = true
private updateURL: string private updateURL: string
private autoUpdater: AppUpdater
constructor ( private constructor (
log: LogService, log: LogService,
private electron: ElectronService, private electron: ElectronService,
private config: ConfigService, private config: ConfigService,
@@ -33,26 +27,25 @@ export class UpdaterService {
return return
} }
this.autoUpdater = electron.remote.require('electron-updater').autoUpdater electron.autoUpdater.on('update-available', () => {
this.autoUpdater.autoInstallOnAppQuit = !!config.store.enableAutomaticUpdates
this.autoUpdater.on('update-available', () => {
this.logger.info('Update available') this.logger.info('Update available')
this.autoUpdater.downloadUpdate()
}) })
this.autoUpdater.once('update-not-available', () => {
electron.autoUpdater.once('update-not-available', () => {
this.logger.info('No updates') this.logger.info('No updates')
}) })
this.downloaded = new Promise<boolean>(resolve => { this.downloaded = new Promise<boolean>(resolve => {
this.autoUpdater.once('update-downloaded', () => resolve(true)) electron.autoUpdater.once('update-downloaded', () => resolve(true))
}) })
if (config.store.enableAutomaticUpdates && this.electronUpdaterAvailable && !process.env.TERMINUS_DEV) { if (config.store.enableAutomaticUpdates && this.electronUpdaterAvailable && !process.env.TERMINUS_DEV) {
this.logger.debug('Checking for updates') this.logger.debug('Checking for updates')
try { try {
this.autoUpdater.checkForUpdates() electron.autoUpdater.setFeedURL({
url: `https://update.electronjs.org/eugeny/terminus/${process.platform}-${process.arch}/${electron.app.getVersion()}`,
})
electron.autoUpdater.checkForUpdates()
} catch (e) { } catch (e) {
this.electronUpdaterAvailable = false this.electronUpdaterAvailable = false
this.logger.info('Electron updater unavailable, falling back', e) this.logger.info('Electron updater unavailable, falling back', e)
@@ -83,22 +76,9 @@ export class UpdaterService {
async update (): Promise<void> { async update (): Promise<void> {
if (!this.electronUpdaterAvailable) { if (!this.electronUpdaterAvailable) {
this.electron.shell.openExternal(this.updateURL) this.electron.shell.openExternal(this.updateURL)
} else {
if (process.platform === 'win32') {
let downloadpath = await this.autoUpdater.downloadUpdate()
fs.exists(downloadpath[0], (exists) => {
if (exists) {
fs.copyFile(downloadpath[0], os.tmpdir() + 'terminus-installer-temp.exe', (err) => {
if (!err) {
spawn(os.tmpdir() + 'terminus-installer-temp.exe', ['--force-run'], { detached: true, stdio: 'ignore' })
}
})
}
})
} else { } else {
await this.downloaded await this.downloaded
this.autoUpdater.quitAndInstall(false, true) this.electron.autoUpdater.quitAndInstall()
}
} }
} }
} }

View File

@@ -4,12 +4,13 @@ import { Subscription } from 'rxjs'
import { AppService } from './services/app.service' import { AppService } from './services/app.service'
import { BaseTabComponent } from './components/baseTab.component' import { BaseTabComponent } from './components/baseTab.component'
import { TabHeaderComponent } from './components/tabHeader.component' import { TabHeaderComponent } from './components/tabHeader.component'
import { SplitTabComponent, SplitDirection } from './components/splitTab.component'
import { TabContextMenuItemProvider } from './api/tabContextMenuProvider' import { TabContextMenuItemProvider } from './api/tabContextMenuProvider'
/** @hidden */ /** @hidden */
@Injectable() @Injectable()
export class CloseContextMenu extends TabContextMenuItemProvider { export class TabManagementContextMenu extends TabContextMenuItemProvider {
weight = -5 weight = 99
constructor ( constructor (
private app: AppService, private app: AppService,
@@ -19,7 +20,7 @@ export class CloseContextMenu extends TabContextMenuItemProvider {
} }
async getItems (tab: BaseTabComponent, tabHeader?: TabHeaderComponent): Promise<Electron.MenuItemConstructorOptions[]> { async getItems (tab: BaseTabComponent, tabHeader?: TabHeaderComponent): Promise<Electron.MenuItemConstructorOptions[]> {
let items = [ let items: Electron.MenuItemConstructorOptions[] = [
{ {
label: 'Close', label: 'Close',
click: () => this.zone.run(() => { click: () => this.zone.run(() => {
@@ -59,6 +60,24 @@ export class CloseContextMenu extends TabContextMenuItemProvider {
}), }),
}, },
] ]
} else {
if (tab.parent instanceof SplitTabComponent) {
const directions: SplitDirection[] = ['r', 'b', 'l', 't']
items.push({
label: 'Split',
submenu: directions.map(dir => ({
label: {
r: 'Right',
b: 'Down',
l: 'Left',
t: 'Up',
}[dir],
click: () => this.zone.run(() => {
(tab.parent as SplitTabComponent).splitTab(tab, dir)
}),
})) as Electron.MenuItemConstructorOptions[],
})
}
} }
return items return items
} }
@@ -87,8 +106,10 @@ export class CommonOptionsContextMenu extends TabContextMenuItemProvider {
} }
async getItems (tab: BaseTabComponent, tabHeader?: TabHeaderComponent): Promise<Electron.MenuItemConstructorOptions[]> { async getItems (tab: BaseTabComponent, tabHeader?: TabHeaderComponent): Promise<Electron.MenuItemConstructorOptions[]> {
let items: Electron.MenuItemConstructorOptions[] = []
if (tabHeader) { if (tabHeader) {
return [ items = [
...items,
{ {
label: 'Rename', label: 'Rename',
click: () => this.zone.run(() => tabHeader?.showRenameTabModal()), click: () => this.zone.run(() => tabHeader?.showRenameTabModal()),
@@ -99,7 +120,7 @@ export class CommonOptionsContextMenu extends TabContextMenuItemProvider {
}, },
{ {
label: 'Color', label: 'Color',
sublabel: COLORS.find(x => x.value === tab.color)!.name, sublabel: COLORS.find(x => x.value === tab.color)?.name,
submenu: COLORS.map(color => ({ submenu: COLORS.map(color => ({
label: color.name, label: color.name,
type: 'radio', type: 'radio',
@@ -111,7 +132,7 @@ export class CommonOptionsContextMenu extends TabContextMenuItemProvider {
}, },
] ]
} }
return [] return items
} }
} }

View File

@@ -20,4 +20,8 @@ app-root {
ssh-tab .content { ssh-tab .content {
margin: 5px !important; margin: 5px !important;
} }
serial-tab .content {
margin: 5px !important;
}
} }

View File

@@ -29,7 +29,7 @@ body {
background: $body-bg; background: $body-bg;
&.vibrant { &.vibrant {
background: rgba(0,0,0,.4); background: rgba(0,0,0,.65);
} }
} }
@@ -246,7 +246,7 @@ ngb-tabset .tab-content {
} }
.list-group-item { .list-group-item {
transition: 0.25s background; transition: 0.0625s background;
i + * { i + * {
margin-left: 10px; margin-left: 10px;
@@ -262,6 +262,29 @@ ngb-tabset .tab-content {
} }
} }
.list-group-light {
.list-group-item {
background: transparent;
border: none;
border-top: 1px solid rgba(255, 255, 255, .1);
&:not(.combi) {
padding: $list-group-item-padding-y $list-group-item-padding-x;
}
&:first-child {
border-top: none;
}
&.list-group-item-action {
&:hover, &.active {
background: $list-group-hover-bg;
}
}
}
}
checkbox i.on { checkbox i.on {
color: $blue; color: $blue;
} }
@@ -392,3 +415,7 @@ search-panel {
border-color: $nav-tabs-link-active-border-color; border-color: $nav-tabs-link-active-border-color;
} }
} }
hr {
border-color: $list-group-border-color;
}

View File

@@ -4,7 +4,7 @@ module.exports = {
target: 'node', target: 'node',
entry: 'src/index.ts', entry: 'src/index.ts',
context: __dirname, context: __dirname,
devtool: 'eval-cheap-module-source-map', devtool: 'cheap-module-source-map',
output: { output: {
path: path.resolve(__dirname, 'dist'), path: path.resolve(__dirname, 'dist'),
filename: 'index.js', filename: 'index.js',

View File

@@ -2,10 +2,19 @@
# yarn lockfile v1 # yarn lockfile v1
"@dabh/diagnostics@^2.0.2":
version "2.0.2"
resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.2.tgz#290d08f7b381b8f94607dc8f471a12c675f9db31"
integrity sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==
dependencies:
colorspace "1.1.x"
enabled "2.0.x"
kuler "^2.0.0"
"@types/js-yaml@^3.9.0": "@types/js-yaml@^3.9.0":
version "3.12.2" version "3.12.4"
resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.2.tgz#a35a1809c33a68200fb6403d1ad708363c56470a" resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.4.tgz#7d3b534ec35a0585128e2d332db1403ebe057e25"
integrity sha512-0CFu/g4mDSNkodVwWijdlr8jH7RoplRWNgovjFLEZeT+QEbbZXjBmCe3HwaWheAlCbHwomTwzZoSedeOycABug== integrity sha512-fYMgzN+9e28R81weVN49inn/u798ruU91En1ZnGvSZzCRc5jXx9B2EDhlRaWmcO1RIxFHL8AajRXzxDuJu93+A==
"@types/node@*": "@types/node@*":
version "13.7.1" version "13.7.1"
@@ -45,12 +54,15 @@ argparse@^1.0.7:
dependencies: dependencies:
sprintf-js "~1.0.2" sprintf-js "~1.0.2"
async@^2.6.1: async@^3.1.0:
version "2.6.2" version "3.2.0"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720"
integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==
dependencies:
lodash "^4.17.11" at-least-node@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
axios@^0.19.0: axios@^0.19.0:
version "0.19.2" version "0.19.2"
@@ -64,10 +76,10 @@ bootstrap@^4.1.3:
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.4.1.tgz#8582960eea0c5cd2bede84d8b0baf3789c3e8b01" resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.4.1.tgz#8582960eea0c5cd2bede84d8b0baf3789c3e8b01"
integrity sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA== integrity sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==
builder-util-runtime@8.6.0: builder-util-runtime@8.7.0:
version "8.6.0" version "8.7.0"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.6.0.tgz#b7007c30126da9a90e99932128d2922c8c178649" resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.0.tgz#e48ad004835c8284662e8eaf47a53468c66e8e8d"
integrity sha512-WTDhTUVrm7zkFyd6Qn7AXgmWifjpZ/fYnEdV3XCOIDMNNb/KPddBTbQ8bUlxxVeuOYlhGpcLUypG+4USdGL1ww== integrity sha512-G1AqqVM2vYTrSFR982c1NNzwXKrGLQjVjaZaWQdn4O6Z3YKjdMDofw88aD9jpyK9ZXkrCxR0tI3Qe9wNbyTlXg==
dependencies: dependencies:
debug "^4.1.1" debug "^4.1.1"
sax "^1.2.4" sax "^1.2.4"
@@ -105,11 +117,6 @@ color@3.0.x:
color-convert "^1.9.1" color-convert "^1.9.1"
color-string "^1.5.2" color-string "^1.5.2"
colornames@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/colornames/-/colornames-1.1.1.tgz#f8889030685c7c4ff9e2a559f5077eb76a816f96"
integrity sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=
colors@^1.2.1: colors@^1.2.1:
version "1.3.3" version "1.3.3"
resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d"
@@ -124,9 +131,9 @@ colorspace@1.1.x:
text-hex "1.0.x" text-hex "1.0.x"
core-js@^3.1.2: core-js@^3.1.2:
version "3.6.4" version "3.6.5"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a"
integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==
core-util-is@~1.0.0: core-util-is@~1.0.0:
version "1.0.2" version "1.0.2"
@@ -159,40 +166,23 @@ deepmerge@^4.1.1:
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
diagnostics@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/diagnostics/-/diagnostics-1.1.1.tgz#cab6ac33df70c9d9a727490ae43ac995a769b22a"
integrity sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==
dependencies:
colorspace "1.1.x"
enabled "1.0.x"
kuler "1.0.x"
electron-updater@^4.0.6: electron-updater@^4.0.6:
version "4.2.2" version "4.3.1"
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.2.2.tgz#57e106bffad16f71b1ffa3968a52a1b71c8147e6" resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.3.1.tgz#9d485b6262bc56fcf7ee62b1dc1b3b105a3e96a7"
integrity sha512-e/OZhr5tLW0GcgmpR5wD0ImxgKMa8pPoNWRcwRyMzTL9pGej7+ORp0t9DtI5ZBHUbObIoEbrk+6EDGUGtJf+aA== integrity sha512-UDC5AHCgeiHJYDYWZG/rsl1vdAFKqI/Lm7whN57LKAk8EfhTewhcEHzheRcncLgikMcQL8gFo1KeX51tf5a5Wg==
dependencies: dependencies:
"@types/semver" "^7.1.0" "@types/semver" "^7.1.0"
builder-util-runtime "8.6.0" builder-util-runtime "8.7.0"
fs-extra "^8.1.0" fs-extra "^9.0.0"
js-yaml "^3.13.1" js-yaml "^3.13.1"
lazy-val "^1.0.4" lazy-val "^1.0.4"
lodash.isequal "^4.5.0" lodash.isequal "^4.5.0"
pako "^1.0.11"
semver "^7.1.3" semver "^7.1.3"
enabled@1.0.x: enabled@2.0.x:
version "1.0.2" version "2.0.0"
resolved "https://registry.yarnpkg.com/enabled/-/enabled-1.0.2.tgz#965f6513d2c2d1c5f4652b64a2e3396467fc2f93" resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2"
integrity sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M= integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==
dependencies:
env-variable "0.0.x"
env-variable@0.0.x:
version "0.0.5"
resolved "https://registry.yarnpkg.com/env-variable/-/env-variable-0.0.5.tgz#913dd830bef11e96a039c038d4130604eba37f88"
integrity sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==
es6-promise@^4.0.3: es6-promise@^4.0.3:
version "4.2.6" version "4.2.6"
@@ -216,10 +206,15 @@ fast-safe-stringify@^2.0.4:
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz#04b26106cc56681f51a044cfc0d76cf0008ac2c2" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz#04b26106cc56681f51a044cfc0d76cf0008ac2c2"
integrity sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg== integrity sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==
fecha@^2.3.3: fecha@^4.2.0:
version "2.3.3" version "4.2.0"
resolved "https://registry.yarnpkg.com/fecha/-/fecha-2.3.3.tgz#948e74157df1a32fd1b12c3a3c3cdcb6ec9d96cd" resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.0.tgz#3ffb6395453e3f3efff850404f0a59b6747f5f41"
integrity sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg== integrity sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==
fn.name@1.x.x:
version "1.1.0"
resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc"
integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==
follow-redirects@1.5.10: follow-redirects@1.5.10:
version "1.5.10" version "1.5.10"
@@ -228,14 +223,15 @@ follow-redirects@1.5.10:
dependencies: dependencies:
debug "=3.1.0" debug "=3.1.0"
fs-extra@^8.1.0: fs-extra@^9.0.0:
version "8.1.0" version "9.0.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3"
integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==
dependencies: dependencies:
at-least-node "^1.0.0"
graceful-fs "^4.2.0" graceful-fs "^4.2.0"
jsonfile "^4.0.0" jsonfile "^6.0.1"
universalify "^0.1.0" universalify "^1.0.0"
graceful-fs@^4.1.6, graceful-fs@^4.2.0: graceful-fs@^4.1.6, graceful-fs@^4.2.0:
version "4.2.2" version "4.2.2"
@@ -260,10 +256,10 @@ is-arrayish@^0.3.1:
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
is-stream@^1.1.0: is-stream@^2.0.0:
version "1.1.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
isarray@~1.0.0: isarray@~1.0.0:
version "1.0.0" version "1.0.0"
@@ -271,26 +267,26 @@ isarray@~1.0.0:
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
js-yaml@^3.13.1, js-yaml@^3.9.0: js-yaml@^3.13.1, js-yaml@^3.9.0:
version "3.13.1" version "3.14.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==
dependencies: dependencies:
argparse "^1.0.7" argparse "^1.0.7"
esprima "^4.0.0" esprima "^4.0.0"
jsonfile@^4.0.0: jsonfile@^6.0.1:
version "4.0.0" version "6.0.1"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179"
integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==
dependencies:
universalify "^1.0.0"
optionalDependencies: optionalDependencies:
graceful-fs "^4.1.6" graceful-fs "^4.1.6"
kuler@1.0.x: kuler@^2.0.0:
version "1.0.1" version "2.0.0"
resolved "https://registry.yarnpkg.com/kuler/-/kuler-1.0.1.tgz#ef7c784f36c9fb6e16dd3150d152677b2b0228a6" resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3"
integrity sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ== integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==
dependencies:
colornames "^1.1.1"
lazy-val@^1.0.4: lazy-val@^1.0.4:
version "1.0.4" version "1.0.4"
@@ -302,19 +298,14 @@ lodash.isequal@^4.5.0:
resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=
lodash@^4.17.11: logform@^2.2.0:
version "4.17.14" version "2.2.0"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" resolved "https://registry.yarnpkg.com/logform/-/logform-2.2.0.tgz#40f036d19161fc76b68ab50fdc7fe495544492f2"
integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== integrity sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==
logform@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/logform/-/logform-2.1.2.tgz#957155ebeb67a13164069825ce67ddb5bb2dd360"
integrity sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==
dependencies: dependencies:
colors "^1.2.1" colors "^1.2.1"
fast-safe-stringify "^2.0.4" fast-safe-stringify "^2.0.4"
fecha "^2.3.3" fecha "^4.2.0"
ms "^2.1.1" ms "^2.1.1"
triple-beam "^1.3.0" triple-beam "^1.3.0"
@@ -348,15 +339,12 @@ ngx-perfect-scrollbar@^8.0.0:
perfect-scrollbar "^1.4.0" perfect-scrollbar "^1.4.0"
resize-observer-polyfill "^1.5.0" resize-observer-polyfill "^1.5.0"
one-time@0.0.4: one-time@^1.0.0:
version "0.0.4" version "1.0.0"
resolved "https://registry.yarnpkg.com/one-time/-/one-time-0.0.4.tgz#f8cdf77884826fe4dff93e3a9cc37b1e4480742e" resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45"
integrity sha1-+M33eISCb+Tf+T46nMN7HkSAdC4= integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==
dependencies:
pako@^1.0.11: fn.name "1.x.x"
version "1.0.11"
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
perfect-scrollbar@^1.4.0: perfect-scrollbar@^1.4.0:
version "1.4.0" version "1.4.0"
@@ -368,10 +356,10 @@ process-nextick-args@~2.0.0:
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==
readable-stream@^2.3.6: readable-stream@^2.3.7:
version "2.3.6" version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
dependencies: dependencies:
core-util-is "~1.0.0" core-util-is "~1.0.0"
inherits "~2.0.3" inherits "~2.0.3"
@@ -381,10 +369,10 @@ readable-stream@^2.3.6:
string_decoder "~1.1.1" string_decoder "~1.1.1"
util-deprecate "~1.0.1" util-deprecate "~1.0.1"
readable-stream@^3.1.1: readable-stream@^3.4.0:
version "3.3.0" version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.3.0.tgz#cb8011aad002eb717bf040291feba8569c986fb9" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw== integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
dependencies: dependencies:
inherits "^2.0.3" inherits "^2.0.3"
string_decoder "^1.1.1" string_decoder "^1.1.1"
@@ -456,40 +444,40 @@ triple-beam@^1.2.0, triple-beam@^1.3.0:
resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9"
integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==
universalify@^0.1.0: universalify@^1.0.0:
version "0.1.2" version "1.0.0"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d"
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==
util-deprecate@^1.0.1, util-deprecate@~1.0.1: util-deprecate@^1.0.1, util-deprecate@~1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
uuid@^7.0.1: uuid@^8.0.0:
version "7.0.1" version "8.2.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.1.tgz#95ed6ff3d8c881cbf85f0f05cc3915ef994818ef" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.2.0.tgz#cb10dd6b118e2dada7d0cd9730ba7417c93d920e"
integrity sha512-yqjRXZzSJm9Dbl84H2VDHpM3zMjzSJQ+hn6C4zqd5ilW+7P4ZmLEEqwho9LjP+tGuZlF4xrHQXT0h9QZUS/pWA== integrity sha512-CYpGiFTUrmI6OBMkAdjSDM0k5h8SkkiTP4WAjQgDgNB1S3Ou9VBEvr6q0Kv2H1mMk7IWfxYGpMH5sd5AvcIV2Q==
winston-transport@^4.3.0: winston-transport@^4.4.0:
version "4.3.0" version "4.4.0"
resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.3.0.tgz#df68c0c202482c448d9b47313c07304c2d7c2c66" resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.4.0.tgz#17af518daa690d5b2ecccaa7acf7b20ca7925e59"
integrity sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A== integrity sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==
dependencies: dependencies:
readable-stream "^2.3.6" readable-stream "^2.3.7"
triple-beam "^1.2.0" triple-beam "^1.2.0"
winston@*, winston@^3.2.1: winston@*, winston@^3.2.1:
version "3.2.1" version "3.3.3"
resolved "https://registry.yarnpkg.com/winston/-/winston-3.2.1.tgz#63061377976c73584028be2490a1846055f77f07" resolved "https://registry.yarnpkg.com/winston/-/winston-3.3.3.tgz#ae6172042cafb29786afa3d09c8ff833ab7c9170"
integrity sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw== integrity sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==
dependencies: dependencies:
async "^2.6.1" "@dabh/diagnostics" "^2.0.2"
diagnostics "^1.1.1" async "^3.1.0"
is-stream "^1.1.0" is-stream "^2.0.0"
logform "^2.1.1" logform "^2.2.0"
one-time "0.0.4" one-time "^1.0.0"
readable-stream "^3.1.1" readable-stream "^3.4.0"
stack-trace "0.0.x" stack-trace "0.0.x"
triple-beam "^1.3.0" triple-beam "^1.3.0"
winston-transport "^4.3.0" winston-transport "^4.4.0"

View File

@@ -34,7 +34,7 @@ export class PluginManagerService {
private npmReady: Promise<void> private npmReady: Promise<void>
private npm: any private npm: any
constructor ( private constructor (
log: LogService, log: LogService,
) { ) {
this.logger = log.create('pluginManager') this.logger = log.create('pluginManager')

View File

@@ -4,7 +4,7 @@ module.exports = {
target: 'node', target: 'node',
entry: 'src/index.ts', entry: 'src/index.ts',
context: __dirname, context: __dirname,
devtool: 'eval-cheap-module-source-map', devtool: 'cheap-module-source-map',
output: { output: {
path: path.resolve(__dirname, 'dist'), path: path.resolve(__dirname, 'dist'),
filename: 'index.js', filename: 'index.js',

View File

@@ -60,9 +60,9 @@ object-assign@^4.0.1:
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
semver@^7.1.1: semver@^7.1.1:
version "7.1.1" version "7.2.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.1.tgz#29104598a197d6cbe4733eeecbe968f7b43a9667" resolved "https://registry.yarnpkg.com/semver/-/semver-7.2.2.tgz#d01432d74ed3010a20ffaf909d63a691520521cd"
integrity sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A== integrity sha512-Zo84u6o2PebMSK3zjJ6Zp5wi8VnQZnEaCP13Ul/lt1ANsLACxnJxq4EEm1PY94/por1Hm9+7xpIswdS5AkieMA==
thenify-all@^1.0.0: thenify-all@^1.0.0:
version "1.6.0" version "1.6.0"

View File

@@ -1,14 +1,13 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Injectable } from '@angular/core' import { Injectable, Injector } from '@angular/core'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { HotkeysService, ToolbarButtonProvider, ToolbarButton } from 'terminus-core' import { HotkeysService, ToolbarButtonProvider, ToolbarButton } from 'terminus-core'
import { SerialModalComponent } from './components/serialModal.component' import { SerialService } from './services/serial.service'
/** @hidden */ /** @hidden */
@Injectable() @Injectable()
export class ButtonProvider extends ToolbarButtonProvider { export class ButtonProvider extends ToolbarButtonProvider {
constructor ( constructor (
private ngbModal: NgbModal, private injector: Injector,
hotkeys: HotkeysService, hotkeys: HotkeysService,
) { ) {
super() super()
@@ -20,7 +19,7 @@ export class ButtonProvider extends ToolbarButtonProvider {
} }
activate () { activate () {
this.ngbModal.open(SerialModalComponent) this.injector.get(SerialService).showConnectionSelector()
} }
provide (): ToolbarButton[] { provide (): ToolbarButton[] {

View File

@@ -1,32 +0,0 @@
.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='connections.length')
a.list-group-item.list-group-item-action.d-flex.align-items-center(
*ngFor='let connection of connections',
(click)='connect(connection)'
)
.mr-2 {{connection.name}}
.text-muted {{connection.port}}
.list-group.mt-3(*ngIf='foundPorts.length')
a.list-group-item.list-group-item-action.d-flex.align-items-center(
(click)='connectFoundPort(port)',
*ngFor='let port of foundPorts'
)
.mr-2 {{port.name}}
.text-muted {{port.description}}

View File

@@ -1,5 +0,0 @@
.list-group.connections-list {
display: block;
max-height: 70vh;
overflow-y: auto;
}

View File

@@ -1,102 +0,0 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Component, NgZone } 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, SerialPortInfo, BAUD_RATES } from '../api'
import { SerialTabComponent } from './serialTab.component'
/** @hidden */
@Component({
template: require('./serialModal.component.pug'),
styles: [require('./serialModal.component.scss')],
})
export class SerialModalComponent {
connections: SerialConnection[]
quickTarget: string
lastConnection: SerialConnection|null = null
foundPorts: SerialPortInfo[] = []
constructor (
public modalInstance: NgbActiveModal,
private config: ConfigService,
private serial: SerialService,
private app: AppService,
private zone: NgZone,
private toastr: ToastrService,
) { }
async ngOnInit () {
this.connections = this.config.store.serial.connections
if (window.localStorage.lastSerialConnection) {
this.lastConnection = JSON.parse(window.localStorage.lastSerialConnection)
}
this.foundPorts = await this.serial.listPorts()
}
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,
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
}
async connect (connection: SerialConnection) {
this.close()
try {
const tab = this.zone.run(() => this.app.openNewTab(
SerialTabComponent,
{ connection }
) as SerialTabComponent)
if (connection.color) {
(this.app.getParentTab(tab) || tab).color = connection.color
}
setTimeout(() => {
this.app.activeTab.emitFocused()
})
} catch (error) {
this.toastr.error(`Could not connect: ${error}`)
}
}
manageConnections () {
this.close()
this.app.openNewTab(SettingsTabComponent, { activeTab: 'serial' })
}
close () {
this.modalInstance.close()
}
async connectFoundPort (port: SerialPortInfo) {
const rate = await this.app.showSelector('Baud rate', BAUD_RATES.map(x => ({
name: x.toString(), result: x,
})))
this.quickTarget = `${port.name}@${rate}`
this.quickConnect()
}
}

View File

@@ -21,9 +21,9 @@ export class SerialTabComponent extends BaseTerminalTabComponent {
serialPort: any serialPort: any
private homeEndSubscription: Subscription private homeEndSubscription: Subscription
// eslint-disable-next-line @typescript-eslint/no-useless-constructor
constructor ( constructor (
injector: Injector, injector: Injector,
private serial: SerialService,
) { ) {
super(injector) super(injector)
} }
@@ -62,7 +62,7 @@ export class SerialTabComponent extends BaseTerminalTabComponent {
return return
} }
this.session = this.serial.createSession(this.connection) this.session = this.injector.get(SerialService).createSession(this.connection)
this.session.serviceMessage$.subscribe(msg => { this.session.serviceMessage$.subscribe(msg => {
this.write('\r\n' + colors.black.bgWhite(' serial ') + ' ' + msg + '\r\n') this.write('\r\n' + colors.black.bgWhite(' serial ') + ' ' + msg + '\r\n')
this.session.resize(this.size.columns, this.size.rows) this.session.resize(this.size.columns, this.size.rows)
@@ -80,11 +80,7 @@ export class SerialTabComponent extends BaseTerminalTabComponent {
spinner.start() spinner.start()
try { try {
this.serialPort = await this.serial.connectSession(this.session, (message: string) => { this.serialPort = await this.injector.get(SerialService).connectSession(this.session)
spinner.stop(true)
this.write(message + '\r\n')
spinner.start()
})
spinner.stop(true) spinner.stop(true)
} catch (e) { } catch (e) {
spinner.stop(true) spinner.stop(true)

View File

@@ -8,7 +8,6 @@ import { SettingsTabProvider } from 'terminus-settings'
import TerminusTerminalModule from 'terminus-terminal' import TerminusTerminalModule from 'terminus-terminal'
import { EditConnectionModalComponent } from './components/editConnectionModal.component' import { EditConnectionModalComponent } from './components/editConnectionModal.component'
import { SerialModalComponent } from './components/serialModal.component'
import { SerialSettingsTabComponent } from './components/serialSettingsTab.component' import { SerialSettingsTabComponent } from './components/serialSettingsTab.component'
import { SerialTabComponent } from './components/serialTab.component' import { SerialTabComponent } from './components/serialTab.component'
@@ -37,13 +36,11 @@ import { SerialHotkeyProvider } from './hotkeys'
], ],
entryComponents: [ entryComponents: [
EditConnectionModalComponent, EditConnectionModalComponent,
SerialModalComponent,
SerialSettingsTabComponent, SerialSettingsTabComponent,
SerialTabComponent, SerialTabComponent,
], ],
declarations: [ declarations: [
EditConnectionModalComponent, EditConnectionModalComponent,
SerialModalComponent,
SerialSettingsTabComponent, SerialSettingsTabComponent,
SerialTabComponent, SerialTabComponent,
], ],

View File

@@ -1,8 +1,10 @@
import { Injectable, NgZone } from '@angular/core' import { Injectable, NgZone } from '@angular/core'
import SerialPort from 'serialport' import SerialPort from 'serialport'
import { ToastrService } from 'ngx-toastr' import { ToastrService } from 'ngx-toastr'
import { LogService } from 'terminus-core' import { LogService, AppService, SelectorOption, ConfigService } from 'terminus-core'
import { SerialConnection, SerialSession, SerialPortInfo } from '../api' import { SettingsTabComponent } from 'terminus-settings'
import { SerialConnection, SerialSession, SerialPortInfo, BAUD_RATES } from '../api'
import { SerialTabComponent } from '../components/serialTab.component'
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class SerialService { export class SerialService {
@@ -10,6 +12,8 @@ export class SerialService {
private log: LogService, private log: LogService,
private zone: NgZone, private zone: NgZone,
private toastr: ToastrService, private toastr: ToastrService,
private app: AppService,
private config: ConfigService,
) { } ) { }
async listPorts (): Promise<SerialPortInfo[]> { async listPorts (): Promise<SerialPortInfo[]> {
@@ -25,7 +29,7 @@ export class SerialService {
return session return session
} }
async connectSession (session: SerialSession, _?: (s: any) => void): Promise<SerialPort> { async connectSession (session: SerialSession): Promise<SerialPort> {
const serial = new SerialPort(session.connection.port, { autoOpen: false, baudRate: session.connection.baudrate, 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, dataBits: session.connection.databits, stopBits: session.connection.stopbits, parity: session.connection.parity,
rtscts: session.connection.rtscts, xon: session.connection.xon, xoff: session.connection.xoff, rtscts: session.connection.rtscts, xon: session.connection.xon, xoff: session.connection.xoff,
@@ -57,4 +61,109 @@ export class SerialService {
}) })
return serial return serial
} }
async showConnectionSelector (): Promise<void> {
const options: SelectorOption<void>[] = []
const foundPorts = await this.listPorts()
try {
const lastConnection = JSON.parse(window.localStorage.lastSerialConnection)
if (lastConnection) {
options.push({
name: lastConnection.name,
icon: 'history',
callback: () => this.connect(lastConnection),
})
options.push({
name: 'Clear last connection',
icon: 'eraser',
callback: () => {
window.localStorage.lastSerialConnection = null
},
})
}
} catch { }
for (const port of foundPorts) {
options.push({
name: port.name,
description: port.description,
icon: 'arrow-right',
callback: () => this.connectFoundPort(port),
})
}
for (const connection of this.config.store.serial.connections) {
options.push({
name: connection.name,
description: connection.port,
callback: () => this.connect(connection),
})
}
options.push({
name: 'Manage connections',
icon: 'cog',
callback: () => this.app.openNewTab(SettingsTabComponent, { activeTab: 'serial' }),
})
options.push({
name: 'Quick connect',
freeInputPattern: 'Open device: %s...',
icon: 'arrow-right',
callback: query => this.quickConnect(query),
})
await this.app.showSelector('Open a serial port', options)
}
async connect (connection: SerialConnection): Promise<SerialTabComponent> {
try {
const tab = this.app.openNewTab(
SerialTabComponent,
{ connection }
) as SerialTabComponent
if (connection.color) {
(this.app.getParentTab(tab) || tab).color = connection.color
}
setTimeout(() => {
this.app.activeTab.emitFocused()
})
return tab
} catch (error) {
this.toastr.error(`Could not connect: ${error}`)
throw error
}
}
quickConnect (query: string): Promise<SerialTabComponent> {
let path = query
let baudrate = 115200
if (query.includes('@')) {
baudrate = parseInt(path.split('@')[1])
path = path.split('@')[0]
}
const connection: SerialConnection = {
name: query,
port: path,
baudrate: baudrate,
databits: 8,
parity: 'none',
rtscts: false,
stopbits: 1,
xany: false,
xoff: false,
xon: false,
}
window.localStorage.lastSerialConnection = JSON.stringify(connection)
return this.connect(connection)
}
async connectFoundPort (port: SerialPortInfo): Promise<SerialTabComponent> {
const rate = await this.app.showSelector('Baud rate', BAUD_RATES.map(x => ({
name: x.toString(), result: x,
})))
return this.quickConnect(`${port.name}@${rate}`)
}
} }

View File

@@ -43,18 +43,32 @@ ngb-tabset.vertical(type='pills', [activeId]='activeTab')
ngbButton, ngbButton,
[value]='"top"' [value]='"top"'
) )
| On the top | Top
label.btn.btn-secondary(ngbButtonLabel) label.btn.btn-secondary(ngbButtonLabel)
input( input(
type='radio', type='radio',
ngbButton, ngbButton,
[value]='"bottom"' [value]='"bottom"'
) )
| At the bottom | Bottom
label.btn.btn-secondary(ngbButtonLabel)
input(
type='radio',
ngbButton,
[value]='"left"'
)
| Left
label.btn.btn-secondary(ngbButtonLabel)
input(
type='radio',
ngbButton,
[value]='"right"'
)
| Right
.form-line(*ngIf='hostApp.platform !== Platform.Linux') .form-line
.header .header
.title(*ngIf='hostApp.platform === Platform.Windows') Acrylic background .title(*ngIf='hostApp.platform !== Platform.macOS') Acrylic background
.title(*ngIf='hostApp.platform === Platform.macOS') Vibrancy .title(*ngIf='hostApp.platform === Platform.macOS') Vibrancy
.description Gives the window a blurred transparent background .description Gives the window a blurred transparent background
@@ -88,7 +102,7 @@ ngb-tabset.vertical(type='pills', [activeId]='activeTab')
.form-line .form-line
.header .header
.title Transparency .title Opacity
input( input(
type='range', type='range',
[(ngModel)]='config.store.appearance.opacity', [(ngModel)]='config.store.appearance.opacity',
@@ -207,6 +221,15 @@ ngb-tabset.vertical(type='pills', [activeId]='activeTab')
) )
| {{screen.name}} | {{screen.name}}
.form-line(*ngIf='config.store.appearance.dock != "off"')
.header
.title Dock always on top
.description Keep docked terminal always on top
toggle(
[(ngModel)]='config.store.appearance.dockAlwaysOnTop',
(ngModelChange)='config.save(); docking.dock()',
)
.form-line(*ngIf='config.store.appearance.dock != "off"') .form-line(*ngIf='config.store.appearance.dock != "off"')
.header .header
.title Docked terminal size .title Docked terminal size
@@ -219,6 +242,15 @@ ngb-tabset.vertical(type='pills', [activeId]='activeTab')
step='0.01' step='0.01'
) )
.form-line(*ngIf='config.store.appearance.dock != "off"')
.header
.title Hide dock on blur
.description Hides the docked terminal when you click away.
toggle(
[(ngModel)]='config.store.appearance.dockHideOnBlur',
(ngModelChange)='config.save(); ',
)
.form-line .form-line
.header .header
.title Debugging .title Debugging
@@ -270,7 +302,7 @@ ngb-tabset.vertical(type='pills', [activeId]='activeTab')
th ID th ID
th Hotkey th Hotkey
ng-container(*ngFor='let hotkey of hotkeyDescriptions') ng-container(*ngFor='let hotkey of hotkeyDescriptions')
tr(*ngIf='!hotkeyFilter || hotkey.name.toLowerCase().includes(hotkeyFilter.toLowerCase())') tr(*ngIf='!hotkeyFilter || hotkeyFilterFn(hotkey, hotkeyFilter)')
td {{hotkey.name}} td {{hotkey.name}}
td {{hotkey.id}} td {{hotkey.id}}
td.pr-5 td.pr-5

View File

@@ -65,7 +65,7 @@ export class SettingsTabComponent extends BaseTabComponent {
const onConfigChange = () => { const onConfigChange = () => {
this.configFile = config.readRaw() this.configFile = config.readRaw()
this.padWindowControls = hostApp.platform === Platform.macOS this.padWindowControls = hostApp.platform === Platform.macOS
&& config.store.appearance.tabsLocation === 'bottom' && config.store.appearance.tabsLocation !== 'top'
} }
this.configSubscription = config.changed$.subscribe(onConfigChange) this.configSubscription = config.changed$.subscribe(onConfigChange)
@@ -144,4 +144,10 @@ export class SettingsTabComponent extends BaseTabComponent {
} }
ptr[prop] = value ptr[prop] = value
} }
hotkeyFilterFn (hotkey: HotkeyDescription, query: string): boolean {
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
const s = hotkey.name + (this.getHotkey(hotkey.id) || []).toString() as string
return s.toLowerCase().includes(query.toLowerCase())
}
} }

View File

@@ -4,7 +4,7 @@ module.exports = {
target: 'node', target: 'node',
entry: 'src/index.ts', entry: 'src/index.ts',
context: __dirname, context: __dirname,
devtool: 'eval-cheap-module-source-map', devtool: 'cheap-module-source-map',
output: { output: {
path: path.resolve(__dirname, 'dist'), path: path.resolve(__dirname, 'dist'),
filename: 'index.js', filename: 'index.js',

View File

@@ -9,10 +9,12 @@
"typings": "typings/index.d.ts", "typings": "typings/index.d.ts",
"scripts": { "scripts": {
"build": "webpack --progress --color", "build": "webpack --progress --color",
"watch": "webpack --progress --color --watch" "watch": "webpack --progress --color --watch",
"postinstall": "xcopy /i /y node_modules\\ssh2\\util\\pagent.exe util\\"
}, },
"files": [ "files": [
"dist" "dist",
"util/pagent.exe"
], ],
"author": "Eugene Pankov", "author": "Eugene Pankov",
"license": "MIT", "license": "MIT",
@@ -21,8 +23,9 @@
"@types/ssh2": "^0.5.35", "@types/ssh2": "^0.5.35",
"ansi-colors": "^4.1.1", "ansi-colors": "^4.1.1",
"cli-spinner": "^0.2.10", "cli-spinner": "^0.2.10",
"run-script-os": "^1.1.3",
"ssh2": "^0.8.2", "ssh2": "^0.8.2",
"ssh2-streams": "^0.4.2", "ssh2-streams": "Eugeny/ssh2-streams#75f6d3425d071ac73a18fd46e2f5e738bfe897c5",
"sshpk": "^1.16.1", "sshpk": "^1.16.1",
"temp": "^0.9.1", "temp": "^0.9.1",
"terminus-terminal": "^1.0.98-nightly.0" "terminus-terminal": "^1.0.98-nightly.0"

View File

@@ -24,6 +24,7 @@ export interface SSHConnection {
host: string host: string
port: number port: number
user: string user: string
auth?: null|'password'|'publicKey'|'agent'|'keyboardInteractive'
password?: string password?: string
privateKey?: string privateKey?: string
group: string | null group: string | null
@@ -34,7 +35,10 @@ export interface SSHConnection {
color?: string color?: string
x11?: boolean x11?: boolean
skipBanner?: boolean skipBanner?: boolean
disableDynamicTitle?: boolean
jumpHost?: string
agentForward?: boolean
warnOnClose?: boolean
algorithms?: {[t: string]: string[]} algorithms?: {[t: string]: string[]}
} }
@@ -79,6 +83,7 @@ export class SSHSession extends BaseSession {
ssh: Client ssh: Client
forwardedPorts: ForwardedPort[] = [] forwardedPorts: ForwardedPort[] = []
logger: Logger logger: Logger
jumpStream: any
get serviceMessage$ (): Observable<string> { return this.serviceMessage } get serviceMessage$ (): Observable<string> { return this.serviceMessage }
private serviceMessage = new Subject<string>() private serviceMessage = new Subject<string>()
@@ -86,6 +91,13 @@ export class SSHSession extends BaseSession {
constructor (public connection: SSHConnection) { constructor (public connection: SSHConnection) {
super() super()
this.scripts = connection.scripts || [] this.scripts = connection.scripts || []
this.destroyed$.subscribe(() => {
for (const port of this.forwardedPorts) {
if (port.type === PortForwardType.Local) {
port.stopLocalListener()
}
}
})
} }
async start (): Promise<void> { async start (): Promise<void> {
@@ -95,6 +107,7 @@ export class SSHSession extends BaseSession {
this.shell = await this.openShellChannel({ x11: this.connection.x11 }) this.shell = await this.openShellChannel({ x11: this.connection.x11 })
} catch (err) { } catch (err) {
this.emitServiceMessage(colors.bgRed.black(' X ') + ` Remote rejected opening a shell channel: ${err}`) this.emitServiceMessage(colors.bgRed.black(' X ') + ` Remote rejected opening a shell channel: ${err}`)
return
} }
this.shell.on('greeting', greeting => { this.shell.on('greeting', greeting => {
@@ -233,10 +246,11 @@ export class SSHSession extends BaseSession {
fw.targetPort, fw.targetPort,
(err, stream) => { (err, stream) => {
if (err) { if (err) {
this.emitServiceMessage(colors.bgRed.black(' X ') + ` Remote has rejected the forwaded connection via ${fw}: ${err}`) this.emitServiceMessage(colors.bgRed.black(' X ') + ` Remote has rejected the forwarded connection via ${fw}: ${err}`)
socket.destroy() socket.destroy()
return return
} }
if (stream) {
stream.pipe(socket) stream.pipe(socket)
socket.pipe(stream) socket.pipe(stream)
stream.on('close', () => { stream.on('close', () => {
@@ -246,9 +260,10 @@ export class SSHSession extends BaseSession {
stream.close() stream.close()
}) })
} }
}
) )
}).then(() => { }).then(() => {
this.emitServiceMessage(colors.bgGreen.black(' -> ') + ` Forwaded ${fw}`) this.emitServiceMessage(colors.bgGreen.black(' -> ') + ` Forwarded ${fw}`)
this.forwardedPorts.push(fw) this.forwardedPorts.push(fw)
}).catch(e => { }).catch(e => {
this.emitServiceMessage(colors.bgRed.black(' X ') + ` Failed to forward port ${fw}: ${e}`) this.emitServiceMessage(colors.bgRed.black(' X ') + ` Failed to forward port ${fw}: ${e}`)
@@ -265,7 +280,7 @@ export class SSHSession extends BaseSession {
resolve() resolve()
}) })
}) })
this.emitServiceMessage(colors.bgGreen.black(' <- ') + ` Forwaded ${fw}`) this.emitServiceMessage(colors.bgGreen.black(' <- ') + ` Forwarded ${fw}`)
this.forwardedPorts.push(fw) this.forwardedPorts.push(fw)
} }
} }
@@ -290,7 +305,7 @@ export class SSHSession extends BaseSession {
write (data: Buffer): void { write (data: Buffer): void {
if (this.shell) { if (this.shell) {
this.shell.write(data.toString()) this.shell.write(data)
} }
} }

View File

@@ -1,15 +1,14 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Injectable } from '@angular/core' import { Injectable } from '@angular/core'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { HotkeysService, ToolbarButtonProvider, ToolbarButton } from 'terminus-core' import { HotkeysService, ToolbarButtonProvider, ToolbarButton } from 'terminus-core'
import { SSHModalComponent } from './components/sshModal.component' import { SSHService } from './services/ssh.service'
/** @hidden */ /** @hidden */
@Injectable() @Injectable()
export class ButtonProvider extends ToolbarButtonProvider { export class ButtonProvider extends ToolbarButtonProvider {
constructor ( constructor (
private ngbModal: NgbModal,
hotkeys: HotkeysService, hotkeys: HotkeysService,
private ssh: SSHService,
) { ) {
super() super()
hotkeys.matchedHotkey.subscribe(async (hotkey: string) => { hotkeys.matchedHotkey.subscribe(async (hotkey: string) => {
@@ -20,7 +19,7 @@ export class ButtonProvider extends ToolbarButtonProvider {
} }
activate () { activate () {
this.ngbModal.open(SSHModalComponent) this.ssh.showConnectionSelector()
} }
provide (): ToolbarButton[] { provide (): ToolbarButton[] {

View File

@@ -19,6 +19,7 @@
[(ngModel)]='connection.group', [(ngModel)]='connection.group',
) )
.d-flex
.form-group .form-group
label Host label Host
input.form-control( input.form-control(
@@ -42,6 +43,34 @@
) )
.form-line .form-line
.header
.title Authentication
.btn-group.w-100(
[(ngModel)]='connection.auth',
ngbRadioGroup
)
label.btn.btn-outline-secondary(ngbButtonLabel)
input(type='radio', ngbButton, [value]='null')
i.far.fa-lightbulb
.m-0 Auto
label.btn.btn-outline-secondary(ngbButtonLabel)
input(type='radio', ngbButton, [value]='"password"')
i.fas.fa-font
.m-0 Password
label.btn.btn-outline-secondary(ngbButtonLabel)
input(type='radio', ngbButton, [value]='"publicKey"')
i.fas.fa-key
.m-0 Key
label.btn.btn-outline-secondary(ngbButtonLabel)
input(type='radio', ngbButton, [value]='"agent"')
i.fas.fa-user-secret
.m-0 Agent
label.btn.btn-outline-secondary(ngbButtonLabel)
input(type='radio', ngbButton, [value]='"keyboardInteractive"')
i.far.fa-keyboard
.m-0 Interactive
.form-line(*ngIf='!connection.auth || connection.auth === "password"')
.header .header
.title Password .title Password
.description(*ngIf='!hasSavedPassword') Save a password in the keychain .description(*ngIf='!hasSavedPassword') Save a password in the keychain
@@ -53,7 +82,7 @@
i.fas.fa-trash-alt i.fas.fa-trash-alt
span Forget span Forget
.form-line .form-line(*ngIf='!connection.auth || connection.auth === "publicKey"')
.header .header
.title Private key .title Private key
.description Path to the private key file .description Path to the private key file
@@ -70,11 +99,23 @@
ngb-tab(id='advanced') ngb-tab(id='advanced')
ng-template(ngbTabTitle) Advanced ng-template(ngbTabTitle) Advanced
ng-template(ngbTabContent) ng-template(ngbTabContent)
.form-line
.header
.title Jump host
select.form-control([(ngModel)]='connection.jumpHost')
option([ngValue]='null') None
option([ngValue]='x.name', *ngFor='let x of config.store.ssh.connections') {{x.name}}
.form-line .form-line
.header .header
.title X11 forwarding .title X11 forwarding
toggle([(ngModel)]='connection.x11') toggle([(ngModel)]='connection.x11')
.form-line
.header
.title Agent Forwarding
toggle([(ngModel)]='connection.agentForward')
.form-line .form-line
.header .header
.title Tab color .title Tab color
@@ -85,9 +126,16 @@
placeholder='#000000' placeholder='#000000'
) )
.form-line
.header
.title Disable dynamic tab title
.description Connection name will be used as a title instead
toggle([(ngModel)]='connection.disableDynamicTitle')
.form-line .form-line
.header .header
.title Skip MoTD/banner .title Skip MoTD/banner
.description Will prevent the SSH greeting from showing up
toggle([(ngModel)]='connection.skipBanner') toggle([(ngModel)]='connection.skipBanner')
.form-line .form-line

View File

@@ -1,7 +1,7 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Component } from '@angular/core' import { Component } from '@angular/core'
import { NgbModal, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import { NgbModal, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
import { ElectronService, HostAppService } from 'terminus-core' import { ElectronService, HostAppService, ConfigService } from 'terminus-core'
import { PasswordStorageService } from '../services/passwordStorage.service' import { PasswordStorageService } from '../services/passwordStorage.service'
import { SSHConnection, LoginScript, SSHAlgorithmType } from '../api' import { SSHConnection, LoginScript, SSHAlgorithmType } from '../api'
import { PromptModalComponent } from './promptModal.component' import { PromptModalComponent } from './promptModal.component'
@@ -20,6 +20,7 @@ export class EditConnectionModalComponent {
algorithms: {[id: string]: {[a: string]: boolean}} = {} algorithms: {[id: string]: {[a: string]: boolean}} = {}
constructor ( constructor (
public config: ConfigService,
private modalInstance: NgbActiveModal, private modalInstance: NgbActiveModal,
private electron: ElectronService, private electron: ElectronService,
private hostApp: HostAppService, private hostApp: HostAppService,
@@ -48,6 +49,7 @@ export class EditConnectionModalComponent {
this.hasSavedPassword = !!await this.passwordStorage.loadPassword(this.connection) this.hasSavedPassword = !!await this.passwordStorage.loadPassword(this.connection)
this.connection.algorithms = this.connection.algorithms || {} this.connection.algorithms = this.connection.algorithms || {}
this.connection.scripts = this.connection.scripts || [] this.connection.scripts = this.connection.scripts || []
this.connection.auth = this.connection.auth || null
for (const k of Object.values(SSHAlgorithmType)) { for (const k of Object.values(SSHAlgorithmType)) {
if (!this.connection.algorithms[k]) { if (!this.connection.algorithms[k]) {

View File

@@ -1,32 +0,0 @@
.modal-body
input.form-control(
type='text',
[(ngModel)]='quickTarget',
autofocus,
placeholder='Quick connect: [user@]host[:port]',
(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.host}}

View File

@@ -1,5 +0,0 @@
.list-group.connections-list {
display: block;
max-height: 70vh;
overflow-y: auto;
}

View File

@@ -1,117 +0,0 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Component, NgZone } 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 { SSHConnection, SSHConnectionGroup } from '../api'
import { SSHTabComponent } from './sshTab.component'
/** @hidden */
@Component({
template: require('./sshModal.component.pug'),
styles: [require('./sshModal.component.scss')],
})
export class SSHModalComponent {
connections: SSHConnection[]
childFolders: SSHConnectionGroup[]
quickTarget: string
lastConnection: SSHConnection|null = null
childGroups: SSHConnectionGroup[]
groupCollapsed: {[id: string]: boolean} = {}
constructor (
public modalInstance: NgbActiveModal,
private config: ConfigService,
private app: AppService,
private toastr: ToastrService,
private zone: NgZone,
) { }
ngOnInit () {
this.connections = this.config.store.ssh.connections
if (window.localStorage.lastConnection) {
this.lastConnection = JSON.parse(window.localStorage.lastConnection)
}
this.refresh()
}
quickConnect () {
let user = 'root'
let host = this.quickTarget
let port = 22
if (host.includes('@')) {
[user, host] = host.split('@')
}
if (host.includes(':')) {
port = parseInt(host.split(':')[1])
host = host.split(':')[0]
}
const connection: SSHConnection = {
name: this.quickTarget,
group: null,
host,
user,
port,
}
window.localStorage.lastConnection = JSON.stringify(connection)
this.connect(connection)
}
clearLastConnection () {
window.localStorage.lastConnection = null
this.lastConnection = null
}
async connect (connection: SSHConnection) {
this.close()
try {
const tab = this.zone.run(() => this.app.openNewTab(
SSHTabComponent,
{ connection }
) as SSHTabComponent)
if (connection.color) {
(this.app.getParentTab(tab) || tab).color = connection.color
}
setTimeout(() => {
this.app.activeTab?.emitFocused()
})
} catch (error) {
this.toastr.error(`Could not connect: ${error}`)
}
}
manageConnections () {
this.close()
this.app.openNewTab(SettingsTabComponent, { activeTab: 'ssh' })
}
close () {
this.modalInstance.close()
}
refresh () {
this.childGroups = []
let connections = this.connections
if (this.quickTarget) {
connections = connections.filter((connection: SSHConnection) => (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)
}
}
}

View File

@@ -20,9 +20,32 @@ h3 Connections
.mr-auto .mr-auto
div {{connection.name}} div {{connection.name}}
.text-muted {{connection.host}} .text-muted {{connection.host}}
button.btn.btn-outline-info.ml-1((click)='$event.stopPropagation(); copyConnection(connection)')
i.fas.fa-copy
button.btn.btn-outline-danger.ml-1((click)='$event.stopPropagation(); deleteConnection(connection)') button.btn.btn-outline-danger.ml-1((click)='$event.stopPropagation(); deleteConnection(connection)')
i.fas.fa-trash i.fas.fa-trash
button.btn.btn-primary((click)='createConnection()') button.btn.btn-primary((click)='createConnection()')
i.fas.fa-fw.fa-plus i.fas.fa-fw.fa-plus
span.ml-2 Add connection span.ml-2 Add connection
h3.mt-5 Options
.form-line
.header
.title Warn when closing active connections
toggle(
[(ngModel)]='config.store.ssh.warnOnClose',
(ngModelChange)='config.save()',
)
.form-line
.header
.title WinSCP path
.descriptions When WinSCP is detected, you can launch an SCP session from the context menu.
input.form-control(
type='text',
placeholder='Auto-detect',
[(ngModel)]='config.store.ssh.winSCPPath',
(ngModelChange)='config.save()',
)

View File

@@ -46,6 +46,19 @@ export class SSHSettingsTabComponent {
}) })
} }
copyConnection (connection: SSHConnection) {
const modal = this.ngbModal.open(EditConnectionModalComponent)
modal.componentInstance.connection = Object.assign({
name: `${name} Copy`,
}, connection)
modal.result.then(result => {
this.connections.push(result)
this.config.store.ssh.connections = this.connections
this.config.save()
this.refresh()
})
}
editConnection (connection: SSHConnection) { editConnection (connection: SSHConnection) {
const modal = this.ngbModal.open(EditConnectionModalComponent, { size: 'lg' }) const modal = this.ngbModal.open(EditConnectionModalComponent, { size: 'lg' })
modal.componentInstance.connection = Object.assign({}, connection) modal.componentInstance.connection = Object.assign({}, connection)
@@ -96,7 +109,7 @@ export class SSHSettingsTabComponent {
this.hostApp.getWindow(), this.hostApp.getWindow(),
{ {
type: 'warning', type: 'warning',
message: `Delete "${group}"?`, message: `Delete "${group.name}"?`,
buttons: ['Keep', 'Delete'], buttons: ['Keep', 'Delete'],
defaultId: 1, defaultId: 1,
} }

View File

@@ -6,9 +6,9 @@
i.fas.fa-circle.text-danger.mr-2(*ngIf='!session.open') i.fas.fa-circle.text-danger.mr-2(*ngIf='!session.open')
strong.mr-auto(*ngIf='session') {{session.connection.user}}@{{session.connection.host}}:{{session.connection.port}} strong.mr-auto(*ngIf='session') {{session.connection.user}}@{{session.connection.host}}:{{session.connection.port}}
button.btn.btn-secondary.mr-2((click)='reconnect()', [class.btn-info]='!session.open')
span Reconnect
button.btn.btn-secondary((click)='showPortForwarding()', *ngIf='session.open') button.btn.btn-secondary((click)='showPortForwarding()', *ngIf='session.open')
i.fas.fa-plug i.fas.fa-plug
span Ports span Ports
button.btn.btn-info((click)='reconnect()', *ngIf='!session.open')
span Reconnect

View File

@@ -10,6 +10,7 @@ import { SSHConnection, SSHSession } from '../api'
import { SSHPortForwardingModalComponent } from './sshPortForwardingModal.component' import { SSHPortForwardingModalComponent } from './sshPortForwardingModal.component'
import { Subscription } from 'rxjs' import { Subscription } from 'rxjs'
/** @hidden */ /** @hidden */
@Component({ @Component({
selector: 'ssh-tab', selector: 'ssh-tab',
@@ -20,6 +21,7 @@ import { Subscription } from 'rxjs'
export class SSHTabComponent extends BaseTerminalTabComponent { export class SSHTabComponent extends BaseTerminalTabComponent {
connection: SSHConnection connection: SSHConnection
session: SSHSession session: SSHSession
private sessionStack: SSHSession[] = []
private homeEndSubscription: Subscription private homeEndSubscription: Subscription
constructor ( constructor (
@@ -33,6 +35,8 @@ export class SSHTabComponent extends BaseTerminalTabComponent {
ngOnInit (): void { ngOnInit (): void {
this.logger = this.log.create('terminalTab') this.logger = this.log.create('terminalTab')
this.enableDynamicTitle = !this.connection.disableDynamicTitle
this.homeEndSubscription = this.hotkeys.matchedHotkey.subscribe(hotkey => { this.homeEndSubscription = this.hotkeys.matchedHotkey.subscribe(hotkey => {
if (!this.hasFocus) { if (!this.hasFocus) {
return return
@@ -58,19 +62,44 @@ export class SSHTabComponent extends BaseTerminalTabComponent {
}) })
} }
async initializeSession (): Promise<void> { async setupOneSession (session: SSHSession): Promise<void> {
if (!this.connection) { if (session.connection.jumpHost) {
this.logger.error('No SSH connection info supplied') const jumpConnection = this.config.store.ssh.connections.find(x => x.name === session.connection.jumpHost)
return const jumpSession = this.ssh.createSession(jumpConnection)
await this.setupOneSession(jumpSession)
jumpSession.destroyed$.subscribe(() => session.destroy())
session.jumpStream = await new Promise((resolve, reject) => jumpSession.ssh.forwardOut(
'127.0.0.1', 0, session.connection.host, session.connection.port,
(err, stream) => {
if (err) {
jumpSession.emitServiceMessage(colors.bgRed.black(' X ') + ` Could not set up port forward on ${jumpConnection.name}`)
return reject(err)
}
resolve(stream)
}
))
session.jumpStream.on('close', () => {
jumpSession.destroy()
})
this.sessionStack.push(session)
} }
this.session = this.ssh.createSession(this.connection)
this.session.serviceMessage$.subscribe(msg => { session.serviceMessage$.subscribe(msg => {
this.write('\r\n' + colors.black.bgWhite(' SSH ') + ' ' + msg + '\r\n') this.write('\r\n' + colors.black.bgWhite(' SSH ') + ' ' + msg + '\r\n')
this.session.resize(this.size.columns, this.size.rows) session.resize(this.size.columns, this.size.rows)
}) })
this.attachSessionHandlers()
this.write(`Connecting to ${this.connection.host}`) session.destroyed$.subscribe(() => {
this.write('\r\n' + colors.black.bgCyan(' SSH ') + ` ${session.connection.host}: session closed\r\n`)
})
this.write('\r\n' + colors.black.bgCyan(' SSH ') + ` Connecting to ${session.connection.host}\r\n`)
const spinner = new Spinner({ const spinner = new Spinner({
text: 'Connecting', text: 'Connecting',
@@ -82,7 +111,7 @@ export class SSHTabComponent extends BaseTerminalTabComponent {
spinner.start() spinner.start()
try { try {
await this.ssh.connectSession(this.session, (message: string) => { await this.ssh.connectSession(session, (message: string) => {
spinner.stop(true) spinner.stop(true)
this.write(message + '\r\n') this.write(message + '\r\n')
spinner.start() spinner.start()
@@ -93,6 +122,20 @@ export class SSHTabComponent extends BaseTerminalTabComponent {
this.write(colors.black.bgRed(' X ') + ' ' + colors.red(e.message) + '\r\n') this.write(colors.black.bgRed(' X ') + ' ' + colors.red(e.message) + '\r\n')
return return
} }
}
async initializeSession (): Promise<void> {
if (!this.connection) {
this.logger.error('No SSH connection info supplied')
return
}
this.session = this.ssh.createSession(this.connection)
await this.setupOneSession(this.session)
this.attachSessionHandlers()
await this.session.start() await this.session.start()
this.session.resize(this.size.columns, this.size.rows) this.session.resize(this.size.columns, this.size.rows)
} }
@@ -110,8 +153,28 @@ export class SSHTabComponent extends BaseTerminalTabComponent {
modal.session = this.session modal.session = this.session
} }
reconnect (): void { async reconnect (): Promise<void> {
this.initializeSession() this.session?.destroy()
await this.initializeSession()
this.session.releaseInitialDataBuffer()
}
async canClose (): Promise<boolean> {
if (!this.session?.open) {
return true
}
if (!(this.connection.warnOnClose ?? this.config.store.ssh.warnOnClose)) {
return true
}
return (await this.electron.showMessageBox(
this.hostApp.getWindow(),
{
type: 'warning',
message: `Disconnect from ${this.connection.host}?`,
buttons: ['Cancel', 'Disconnect'],
defaultId: 1,
}
)).response === 1
} }
ngOnDestroy (): void { ngOnDestroy (): void {

View File

@@ -5,8 +5,9 @@ export class SSHConfigProvider extends ConfigProvider {
defaults = { defaults = {
ssh: { ssh: {
connections: [], connections: [],
options: { recentConnections: [],
}, warnOnClose: false,
winSCPPath: null,
}, },
hotkeys: { hotkeys: {
ssh: [ ssh: [

View File

@@ -3,12 +3,11 @@ import { CommonModule } from '@angular/common'
import { FormsModule } from '@angular/forms' import { FormsModule } from '@angular/forms'
import { NgbModule } from '@ng-bootstrap/ng-bootstrap' import { NgbModule } from '@ng-bootstrap/ng-bootstrap'
import { ToastrModule } from 'ngx-toastr' import { ToastrModule } from 'ngx-toastr'
import TerminusCoreModule, { ToolbarButtonProvider, ConfigProvider, TabRecoveryProvider, HotkeyProvider } from 'terminus-core' import TerminusCoreModule, { ToolbarButtonProvider, ConfigProvider, TabRecoveryProvider, HotkeyProvider, TabContextMenuItemProvider } from 'terminus-core'
import { SettingsTabProvider } from 'terminus-settings' import { SettingsTabProvider } from 'terminus-settings'
import TerminusTerminalModule from 'terminus-terminal' import TerminusTerminalModule from 'terminus-terminal'
import { EditConnectionModalComponent } from './components/editConnectionModal.component' import { EditConnectionModalComponent } from './components/editConnectionModal.component'
import { SSHModalComponent } from './components/sshModal.component'
import { SSHPortForwardingModalComponent } from './components/sshPortForwardingModal.component' import { SSHPortForwardingModalComponent } from './components/sshPortForwardingModal.component'
import { PromptModalComponent } from './components/promptModal.component' import { PromptModalComponent } from './components/promptModal.component'
import { SSHSettingsTabComponent } from './components/sshSettingsTab.component' import { SSHSettingsTabComponent } from './components/sshSettingsTab.component'
@@ -19,6 +18,7 @@ import { SSHConfigProvider } from './config'
import { SSHSettingsTabProvider } from './settings' import { SSHSettingsTabProvider } from './settings'
import { RecoveryProvider } from './recoveryProvider' import { RecoveryProvider } from './recoveryProvider'
import { SSHHotkeyProvider } from './hotkeys' import { SSHHotkeyProvider } from './hotkeys'
import { WinSCPContextMenu } from './winSCPIntegration'
/** @hidden */ /** @hidden */
@NgModule({ @NgModule({
@@ -36,11 +36,11 @@ import { SSHHotkeyProvider } from './hotkeys'
{ provide: SettingsTabProvider, useClass: SSHSettingsTabProvider, multi: true }, { provide: SettingsTabProvider, useClass: SSHSettingsTabProvider, multi: true },
{ provide: TabRecoveryProvider, useClass: RecoveryProvider, multi: true }, { provide: TabRecoveryProvider, useClass: RecoveryProvider, multi: true },
{ provide: HotkeyProvider, useClass: SSHHotkeyProvider, multi: true }, { provide: HotkeyProvider, useClass: SSHHotkeyProvider, multi: true },
{ provide: TabContextMenuItemProvider, useClass: WinSCPContextMenu, multi: true },
], ],
entryComponents: [ entryComponents: [
EditConnectionModalComponent, EditConnectionModalComponent,
PromptModalComponent, PromptModalComponent,
SSHModalComponent,
SSHPortForwardingModalComponent, SSHPortForwardingModalComponent,
SSHSettingsTabComponent, SSHSettingsTabComponent,
SSHTabComponent, SSHTabComponent,
@@ -48,7 +48,6 @@ import { SSHHotkeyProvider } from './hotkeys'
declarations: [ declarations: [
EditConnectionModalComponent, EditConnectionModalComponent,
PromptModalComponent, PromptModalComponent,
SSHModalComponent,
SSHPortForwardingModalComponent, SSHPortForwardingModalComponent,
SSHSettingsTabComponent, SSHSettingsTabComponent,
SSHTabComponent, SSHTabComponent,

View File

@@ -3,21 +3,30 @@ import { open as openTemp } from 'temp'
import { Injectable, NgZone } from '@angular/core' import { Injectable, NgZone } from '@angular/core'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { Client } from 'ssh2' import { Client } from 'ssh2'
import { SSH2Stream } from 'ssh2-streams'
import * as fs from 'mz/fs' import * as fs from 'mz/fs'
import { execFile } from 'mz/child_process' import { execFile } from 'mz/child_process'
import * as path from 'path' import * as path from 'path'
import * as sshpk from 'sshpk' import * as sshpk from 'sshpk'
import { ToastrService } from 'ngx-toastr' import { ToastrService } from 'ngx-toastr'
import { HostAppService, Platform, Logger, LogService, ElectronService } from 'terminus-core' import { HostAppService, Platform, Logger, LogService, ElectronService, AppService, SelectorOption, ConfigService } from 'terminus-core'
import { SettingsTabComponent } from 'terminus-settings'
import { SSHConnection, SSHSession } from '../api' import { SSHConnection, SSHSession } from '../api'
import { PromptModalComponent } from '../components/promptModal.component' import { PromptModalComponent } from '../components/promptModal.component'
import { PasswordStorageService } from './passwordStorage.service' import { PasswordStorageService } from './passwordStorage.service'
import { SSH2Stream } from 'ssh2-streams' import { SSHTabComponent } from '../components/sshTab.component'
const WINDOWS_OPENSSH_AGENT_PIPE = '\\\\.\\pipe\\openssh-ssh-agent'
try { try {
var windowsProcessTreeNative = require('windows-process-tree/build/Release/windows_process_tree.node') // eslint-disable-line @typescript-eslint/no-var-requires, no-var var windowsProcessTreeNative = require('windows-process-tree/build/Release/windows_process_tree.node') // eslint-disable-line @typescript-eslint/no-var-requires, no-var
} catch { } } catch { }
// eslint-disable-next-line @typescript-eslint/no-type-alias
export type SSHLogCallback = (message: string) => void
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class SSHService { export class SSHService {
private logger: Logger private logger: Logger
@@ -30,6 +39,8 @@ export class SSHService {
private hostApp: HostAppService, private hostApp: HostAppService,
private passwordStorage: PasswordStorageService, private passwordStorage: PasswordStorageService,
private toastr: ToastrService, private toastr: ToastrService,
private app: AppService,
private config: ConfigService,
) { ) {
this.logger = log.create('ssh') this.logger = log.create('ssh')
} }
@@ -40,33 +51,24 @@ export class SSHService {
return session return session
} }
async connectSession (session: SSHSession, logCallback?: (s: any) => void): Promise<void> { async loadPrivateKeyForSession (session: SSHSession, logCallback?: SSHLogCallback): Promise<string|null> {
let privateKey: string|null = null let privateKey: string|null = null
let privateKeyPath = session.connection.privateKey let privateKeyPath = session.connection.privateKey
if (!logCallback) {
logCallback = () => null
}
const log = (s: any) => {
logCallback!(s)
this.logger.info(s)
}
if (!privateKeyPath) { if (!privateKeyPath) {
const userKeyPath = path.join(process.env.HOME as string, '.ssh', 'id_rsa') const userKeyPath = path.join(process.env.HOME as string, '.ssh', 'id_rsa')
if (await fs.exists(userKeyPath)) { if (await fs.exists(userKeyPath)) {
log('Using user\'s default private key') logCallback?.('Using user\'s default private key')
privateKeyPath = userKeyPath privateKeyPath = userKeyPath
} }
} }
if (privateKeyPath) { if (privateKeyPath) {
log('Loading private key from ' + colors.bgWhite.blackBright(' ' + privateKeyPath + ' ')) logCallback?.('Loading private key from ' + colors.bgWhite.blackBright(' ' + privateKeyPath + ' '))
try { try {
privateKey = (await fs.readFile(privateKeyPath)).toString() privateKey = (await fs.readFile(privateKeyPath)).toString()
} catch (error) { } catch (error) {
log(colors.bgRed.black(' X ') + 'Could not read the private key file') logCallback?.(colors.bgRed.black(' X ') + 'Could not read the private key file')
this.toastr.error('Could not read the private key file') this.toastr.error('Could not read the private key file')
} }
@@ -77,7 +79,7 @@ export class SSHService {
} catch (e) { } catch (e) {
if (e instanceof sshpk.KeyEncryptedError) { if (e instanceof sshpk.KeyEncryptedError) {
const modal = this.ngbModal.open(PromptModalComponent) const modal = this.ngbModal.open(PromptModalComponent)
log(colors.bgYellow.yellow.black(' ! ') + ' Key requires passphrase') logCallback?.(colors.bgYellow.yellow.black(' ! ') + ' Key requires passphrase')
modal.componentInstance.prompt = 'Private key passphrase' modal.componentInstance.prompt = 'Private key passphrase'
modal.componentInstance.password = true modal.componentInstance.password = true
let passphrase = '' let passphrase = ''
@@ -109,6 +111,11 @@ export class SSHService {
'ssh-keygen', 'ssh-keygen',
'ssh-keygen.exe', 'ssh-keygen.exe',
) )
await execFile('icacls', [temp.path, '/inheritance:r'])
let sid = await execFile('whoami', ['/user', '/nh', '/fo', 'csv'])
sid = sid[0].split(',')[0]
sid = sid.substring(1, sid.length - 1)
await execFile('icacls', [temp.path, '/grant:r', `${sid}:(R,W)`])
} }
await execFile(sshKeygenPath, [ await execFile(sshKeygenPath, [
@@ -120,6 +127,20 @@ export class SSHService {
fs.unlink(temp.path) fs.unlink(temp.path)
} }
} }
return privateKey
}
async connectSession (session: SSHSession, logCallback?: SSHLogCallback): Promise<void> {
if (!logCallback) {
logCallback = () => null
}
const log = (s: any) => {
logCallback!(s)
this.logger.info(s)
}
let privateKey: string|null = null
const ssh = new Client() const ssh = new Client()
session.ssh = ssh session.ssh = ssh
@@ -145,6 +166,12 @@ export class SSHService {
} }
}) })
}) })
ssh.on('close', () => {
if (session.open) {
session.destroy()
}
})
ssh.on('keyboard-interactive', (name, instructions, instructionsLang, prompts, finish) => this.zone.run(async () => { ssh.on('keyboard-interactive', (name, instructions, instructionsLang, prompts, finish) => this.zone.run(async () => {
log(colors.bgBlackBright(' ') + ` Keyboard-interactive auth requested: ${name}`) log(colors.bgBlackBright(' ') + ` Keyboard-interactive auth requested: ${name}`)
this.logger.info('Keyboard-interactive auth:', name, instructions, instructionsLang) this.logger.info('Keyboard-interactive auth:', name, instructions, instructionsLang)
@@ -153,8 +180,13 @@ export class SSHService {
const modal = this.ngbModal.open(PromptModalComponent) const modal = this.ngbModal.open(PromptModalComponent)
modal.componentInstance.prompt = prompt.prompt modal.componentInstance.prompt = prompt.prompt
modal.componentInstance.password = !prompt.echo modal.componentInstance.password = !prompt.echo
try {
const result = await modal.result const result = await modal.result
results.push(result ? result.value : '') results.push(result ? result.value : '')
} catch {
results.push('')
}
} }
finish(results) finish(results)
})) }))
@@ -173,18 +205,46 @@ export class SSHService {
let agent: string|null = null let agent: string|null = null
if (this.hostApp.platform === Platform.Windows) { if (this.hostApp.platform === Platform.Windows) {
const pageantRunning = new Promise<boolean>(resolve => { if (await fs.exists(WINDOWS_OPENSSH_AGENT_PIPE)) {
agent = WINDOWS_OPENSSH_AGENT_PIPE
} else {
const pageantRunning = await new Promise<boolean>(resolve => {
windowsProcessTreeNative.getProcessList(list => { // eslint-disable-line block-scoped-var windowsProcessTreeNative.getProcessList(list => { // eslint-disable-line block-scoped-var
resolve(list.some(x => x.name === 'pageant.exe')) resolve(list.some(x => x.name === 'pageant.exe'))
}, 0) }, 0)
}) })
if (await pageantRunning) { if (pageantRunning) {
agent = 'pageant' agent = 'pageant'
} }
}
} else { } else {
agent = process.env.SSH_AUTH_SOCK as string agent = process.env.SSH_AUTH_SOCK as string
} }
const authMethodsLeft = ['none']
if (!session.connection.auth || session.connection.auth === 'publicKey') {
privateKey = await this.loadPrivateKeyForSession(session, log)
if (!privateKey) {
log('\r\nPrivate key auth selected, but no key is loaded\r\n')
} else {
authMethodsLeft.push('publickey')
}
}
if (!session.connection.auth || session.connection.auth === 'agent') {
if (!agent) {
log('\r\nAgent auth selected, but no running agent is detected\r\n')
} else {
authMethodsLeft.push('agent')
}
}
if (!session.connection.auth || session.connection.auth === 'password') {
authMethodsLeft.push('password')
}
if (!session.connection.auth || session.connection.auth === 'keyboardInteractive') {
authMethodsLeft.push('keyboard-interactive')
}
authMethodsLeft.push('hostbased')
try { try {
ssh.connect({ ssh.connect({
host: session.connection.host, host: session.connection.host,
@@ -194,18 +254,33 @@ export class SSHService {
privateKey: privateKey || undefined, privateKey: privateKey || undefined,
tryKeyboard: true, tryKeyboard: true,
agent: agent || undefined, agent: agent || undefined,
agentForward: !!agent, agentForward: session.connection.agentForward && !!agent,
keepaliveInterval: session.connection.keepaliveInterval, keepaliveInterval: session.connection.keepaliveInterval,
keepaliveCountMax: session.connection.keepaliveCountMax, keepaliveCountMax: session.connection.keepaliveCountMax,
readyTimeout: session.connection.readyTimeout, readyTimeout: session.connection.readyTimeout,
hostVerifier: digest => { hostVerifier: (digest: string) => {
log(colors.bgWhite(' ') + ' Host key fingerprint:') log(colors.bgWhite(' ') + ' Host key fingerprint:')
log(colors.bgWhite(' ') + ' ' + colors.black.bgWhite(' SHA256 ') + colors.bgBlackBright(' ' + digest + ' ')) log(colors.bgWhite(' ') + ' ' + colors.black.bgWhite(' SHA256 ') + colors.bgBlackBright(' ' + digest + ' '))
return true return true
}, },
hostHash: 'sha256' as any, hostHash: 'sha256' as any,
algorithms: session.connection.algorithms, algorithms: session.connection.algorithms,
}) sock: session.jumpStream,
authHandler: methodsLeft => {
while (true) {
let method = authMethodsLeft.shift()
if (!method) {
return false
}
if (methodsLeft && !methodsLeft.includes(method) && method !== 'agent') {
// Agent can still be used even if not in methodsLeft
this.logger.info('Server does not support auth method', method)
continue
}
return method
}
},
} as any)
} catch (e) { } catch (e) {
this.toastr.error(e.message) this.toastr.error(e.message)
reject(e) reject(e)
@@ -247,6 +322,124 @@ export class SSHService {
}) })
}) })
} }
async showConnectionSelector (): Promise<void> {
const options: SelectorOption<void>[] = []
const recentConnections = this.config.store.ssh.recentConnections
for (const connection of recentConnections) {
options.push({
name: connection.name,
description: connection.host,
icon: 'history',
callback: () => this.connect(connection),
})
}
if (recentConnections.length) {
options.push({
name: 'Clear recent connections',
icon: 'eraser',
callback: () => {
this.config.store.ssh.recentConnections = []
this.config.save()
},
})
}
let groups: { name: string, connections: SSHConnection[] }[] = []
let connections = this.config.store.ssh.connections
for (const connection of connections) {
connection.group = connection.group || null
let group = groups.find(x => x.name === connection.group)
if (!group) {
group = {
name: connection.group!,
connections: [],
}
groups.push(group!)
}
group.connections.push(connection)
}
for (const group of groups) {
for (const connection of group.connections) {
options.push({
name: (group.name ? `${group.name} / ` : '') + connection.name,
description: connection.host,
icon: 'desktop',
callback: () => this.connect(connection),
})
}
}
options.push({
name: 'Manage connections',
icon: 'cog',
callback: () => this.app.openNewTab(SettingsTabComponent, { activeTab: 'ssh' }),
})
options.push({
name: 'Quick connect',
freeInputPattern: 'Connect to "%s"...',
icon: 'arrow-right',
callback: query => this.quickConnect(query),
})
await this.app.showSelector('Open an SSH connection', options)
}
async connect (connection: SSHConnection): Promise<SSHTabComponent> {
try {
const tab = this.app.openNewTab(
SSHTabComponent,
{ connection }
) as SSHTabComponent
if (connection.color) {
(this.app.getParentTab(tab) || tab).color = connection.color
}
setTimeout(() => {
this.app.activeTab?.emitFocused()
})
return tab
} catch (error) {
this.toastr.error(`Could not connect: ${error}`)
throw error
}
}
quickConnect (query: string): Promise<SSHTabComponent> {
let user = 'root'
let host = query
let port = 22
if (host.includes('@')) {
[user, host] = host.split('@')
}
if (host.includes(':')) {
port = parseInt(host.split(':')[1])
host = host.split(':')[0]
}
const connection: SSHConnection = {
name: query,
group: null,
host,
user,
port,
}
const recentConnections = this.config.store.ssh.recentConnections
recentConnections.unshift(connection)
if (recentConnections.length > 5) {
recentConnections.pop()
}
this.config.store.ssh.recentConnections = recentConnections
this.config.save()
return this.connect(connection)
}
} }
/* eslint-disable */ /* eslint-disable */

View File

@@ -0,0 +1,85 @@
import { execFile } from 'child_process'
import { Injectable } from '@angular/core'
import { ConfigService, BaseTabComponent, TabContextMenuItemProvider, TabHeaderComponent, HostAppService, Platform } from 'terminus-core'
import { SSHTabComponent } from './components/sshTab.component'
import { PasswordStorageService } from './services/passwordStorage.service'
import { SSHConnection } from './api'
/* eslint-disable block-scoped-var */
try {
var wnr = require('windows-native-registry') // eslint-disable-line @typescript-eslint/no-var-requires, no-var
} catch { }
/** @hidden */
@Injectable()
export class WinSCPContextMenu extends TabContextMenuItemProvider {
weight = 10
private detectedPath?: string
constructor (
private hostApp: HostAppService,
private config: ConfigService,
private passwordStorage: PasswordStorageService,
) {
super()
if (hostApp.platform !== Platform.Windows) {
return
}
const key = wnr.getRegistryKey(wnr.HK.CR, 'WinSCP.Url\\DefaultIcon')
if (key?.['']) {
this.detectedPath = key[''].value?.split(',')[0]
this.detectedPath = this.detectedPath?.substring(1, this.detectedPath.length - 1)
}
}
async getItems (tab: BaseTabComponent, tabHeader?: TabHeaderComponent): Promise<Electron.MenuItemConstructorOptions[]> {
if (this.hostApp.platform !== Platform.Windows || tabHeader) {
return []
}
if (!this.getPath()) {
return []
}
if (!(tab instanceof SSHTabComponent)) {
return []
}
return [
{
label: 'Launch WinSCP',
click: (): void => {
this.launchWinSCP(tab.connection)
},
},
]
}
getPath (): string|undefined {
return this.detectedPath ?? this.config.store.ssh.winSCPPath
}
async getURI (connection: SSHConnection): Promise<string> {
let uri = `scp://${connection.user}`
const password = await this.passwordStorage.loadPassword(connection)
if (password) {
uri += ':' + encodeURIComponent(password)
}
uri += `@${connection.host}:${connection.port}/`
return uri
}
async launchWinSCP (connection: SSHConnection): Promise<void> {
const path = this.getPath()
if (!path) {
return
}
let args = [await this.getURI(connection)]
if ((!connection.auth || connection.auth === 'publicKey') && connection.privateKey) {
args.push('/privatekey')
args.push(connection.privateKey)
}
execFile(path, args)
}
}

View File

@@ -4,7 +4,7 @@ module.exports = {
target: 'node', target: 'node',
entry: 'src/index.ts', entry: 'src/index.ts',
context: __dirname, context: __dirname,
devtool: 'eval-cheap-module-source-map', devtool: 'cheap-module-source-map',
output: { output: {
path: path.resolve(__dirname, 'dist'), path: path.resolve(__dirname, 'dist'),
filename: 'index.js', filename: 'index.js',
@@ -45,10 +45,12 @@ module.exports = {
], ],
}, },
externals: [ externals: [
'child_process',
'fs', 'fs',
'keytar', 'keytar',
'path', 'path',
'ngx-toastr', 'ngx-toastr',
'windows-native-registry',
'windows-process-tree/build/Release/windows_process_tree.node', 'windows-process-tree/build/Release/windows_process_tree.node',
/^rxjs/, /^rxjs/,
/^@angular/, /^@angular/,

View File

@@ -20,9 +20,9 @@
"@types/node" "*" "@types/node" "*"
"@types/ssh2@^0.5.35": "@types/ssh2@^0.5.35":
version "0.5.40" version "0.5.44"
resolved "https://registry.yarnpkg.com/@types/ssh2/-/ssh2-0.5.40.tgz#b65465897f40c67e66e630b1f059f13a1ea7f1fa" resolved "https://registry.yarnpkg.com/@types/ssh2/-/ssh2-0.5.44.tgz#8bda3ffe9cab038a997f6749df76cc52249d1916"
integrity sha512-Yrs2vFIirdscR+xY4leiUosHTClRbVBiFLlm5gA0JMZMjbCulHKO3qcgMqATElrquiZal5sSHoXMk4t8DzDawA== integrity sha512-2aKqF0no055Zs8E6eaUtgDJv9yw1ViR7GLkWhuMIMnSPIU46vJJviEFZZtEqGxZEnrPpYxvOPPpWzwll/a4YwQ==
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
"@types/ssh2-streams" "*" "@types/ssh2-streams" "*"
@@ -157,26 +157,39 @@ rimraf@~2.6.2:
dependencies: dependencies:
glob "^7.1.3" glob "^7.1.3"
run-script-os@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/run-script-os/-/run-script-os-1.1.3.tgz#1069b418307f4fd36ff056b5eda309c273fca8b0"
integrity sha512-xPlzE6533nvWVea5z7e5J7+JAIepfpxTu/HLGxcjJYlemVukOCWJBaRCod/DWXJFRIWEFOgSGbjd2m1QWTJi5w==
safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
version "2.1.2" version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
ssh2-streams@^0.4.2, ssh2-streams@~0.4.9: ssh2-streams@Eugeny/ssh2-streams#75f6d3425d071ac73a18fd46e2f5e738bfe897c5:
version "0.4.9" version "0.4.10"
resolved "https://registry.yarnpkg.com/ssh2-streams/-/ssh2-streams-0.4.9.tgz#d3d92155410001437d27119d9c023b303cbe2309" resolved "https://codeload.github.com/Eugeny/ssh2-streams/tar.gz/75f6d3425d071ac73a18fd46e2f5e738bfe897c5"
integrity sha512-glMQKeYKuA+rLaH16fJC3nZMV1BWklbxuYCR4C5/LlBSf2yaoNRpPU7Ul702xsi5nvYjIx9XDkKBJwrBjkDynw== dependencies:
asn1 "~0.2.0"
bcrypt-pbkdf "^1.0.2"
streamsearch "~0.1.2"
ssh2-streams@~0.4.10:
version "0.4.10"
resolved "https://registry.yarnpkg.com/ssh2-streams/-/ssh2-streams-0.4.10.tgz#48ef7e8a0e39d8f2921c30521d56dacb31d23a34"
integrity sha512-8pnlMjvnIZJvmTzUIIA5nT4jr2ZWNNVHwyXfMGdRJbug9TpI3kd99ffglgfSWqujVv/0gxwMsDn9j9RVst8yhQ==
dependencies: dependencies:
asn1 "~0.2.0" asn1 "~0.2.0"
bcrypt-pbkdf "^1.0.2" bcrypt-pbkdf "^1.0.2"
streamsearch "~0.1.2" streamsearch "~0.1.2"
ssh2@^0.8.2: ssh2@^0.8.2:
version "0.8.8" version "0.8.9"
resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-0.8.8.tgz#1d9815e287faef623ae2b7db32e674dadbef4664" resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-0.8.9.tgz#54da3a6c4ba3daf0d8477a538a481326091815f3"
integrity sha512-egJVQkf3sbjECTY6rCeg8rgV/fab6S/7E5kpYqHT3Fe/YpfJbLYeA1qTcB2d+LRUUAjqKi7rlbfWkaP66YdpAQ== integrity sha512-GmoNPxWDMkVpMFa9LVVzQZHF6EW3WKmBwL+4/GeILf2hFmix5Isxm7Amamo8o7bHiU0tC+wXsGcUXOxp8ChPaw==
dependencies: dependencies:
ssh2-streams "~0.4.9" ssh2-streams "~0.4.10"
sshpk@^1.16.1: sshpk@^1.16.1:
version "1.16.1" version "1.16.1"

View File

@@ -9,7 +9,7 @@ Terminus Terminal Plugin
Using the API: Using the API:
```ts ```ts
import { TerminalContextMenuItemProvider } from 'terminus-terminal' import { ShellProvider } from 'terminus-terminal'
``` ```
Exporting your subclasses: Exporting your subclasses:
@@ -19,7 +19,7 @@ Exporting your subclasses:
... ...
providers: [ providers: [
... ...
{ provide: TerminalContextMenuItemProvider, useClass: MyContextMenu, multi: true }, { provide: ShellProvider, useClass: MyShellPlugin, multi: true },
... ...
] ]
}) })

View File

@@ -26,14 +26,13 @@
"ps-node": "^0.1.6", "ps-node": "^0.1.6",
"runes": "^0.4.2", "runes": "^0.4.2",
"slugify": "^1.4.0", "slugify": "^1.4.0",
"uuid": "^7.0.1", "xterm": "^4.9.0-beta.7",
"xterm": "^4.5.0-beta.9", "xterm-addon-fit": "^0.4.0-beta.8",
"xterm-addon-fit": "^0.4.0-beta2", "xterm-addon-ligatures": "^0.4.0-beta.5",
"xterm-addon-ligatures": "^0.2.1", "xterm-addon-search": "^0.7.0-beta.2",
"xterm-addon-search": "^0.5.0", "xterm-addon-serialize": "^0.3.0",
"xterm-addon-serialize": "^0.1.1", "xterm-addon-unicode11": "^0.2.0",
"xterm-addon-unicode11": "^0.1.1", "xterm-addon-webgl": "^0.8.0",
"xterm-addon-webgl": "^0.6.0-beta.2",
"zmodem.js": "^0.1.9" "zmodem.js": "^0.1.9"
}, },
"peerDependencies": { "peerDependencies": {

View File

@@ -4,7 +4,7 @@ import { ToastrService } from 'ngx-toastr'
import colors from 'ansi-colors' import colors from 'ansi-colors'
import { NgZone, OnInit, OnDestroy, Injector, ViewChild, HostBinding, Input, ElementRef, InjectFlags } from '@angular/core' import { NgZone, OnInit, OnDestroy, Injector, ViewChild, HostBinding, Input, ElementRef, InjectFlags } from '@angular/core'
import { trigger, transition, style, animate, AnimationTriggerMetadata } from '@angular/animations' import { trigger, transition, style, animate, AnimationTriggerMetadata } from '@angular/animations'
import { AppService, ConfigService, BaseTabComponent, ElectronService, HostAppService, HotkeysService, Platform, LogService, Logger, TabContextMenuItemProvider } from 'terminus-core' import { AppService, ConfigService, BaseTabComponent, ElectronService, HostAppService, HotkeysService, Platform, LogService, Logger, TabContextMenuItemProvider, SplitTabComponent } from 'terminus-core'
import { BaseSession, SessionsService } from '../services/sessions.service' import { BaseSession, SessionsService } from '../services/sessions.service'
import { TerminalFrontendService } from '../services/terminalFrontend.service' import { TerminalFrontendService } from '../services/terminalFrontend.service'
@@ -63,6 +63,13 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
*/ */
enablePassthrough = true enablePassthrough = true
/**
* Enables receiving dynamic window/tab title provided by the shell
*/
enableDynamicTitle = true
alternateScreenActive = false
// Deps start // Deps start
config: ConfigService config: ConfigService
element: ElementRef element: ElementRef
@@ -85,6 +92,7 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
private hotkeysSubscription: Subscription private hotkeysSubscription: Subscription
private bellPlayer: HTMLAudioElement private bellPlayer: HTMLAudioElement
private termContainerSubscriptions: Subscription[] = [] private termContainerSubscriptions: Subscription[] = []
private allFocusModeSubscription: Subscription|null = null
get input$ (): Observable<Buffer> { return this.frontend.input$ } get input$ (): Observable<Buffer> { return this.frontend.input$ }
get output$ (): Observable<string> { return this.output } get output$ (): Observable<string> { return this.output }
@@ -148,16 +156,28 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
this.resetZoom() this.resetZoom()
break break
case 'previous-word': case 'previous-word':
this.sendInput('\x1bb') this.sendInput({
[Platform.Windows]: '\x1b[1;5D',
[Platform.macOS]: '\x1bb',
[Platform.Linux]: '\x1bb',
}[this.hostApp.platform])
break break
case 'next-word': case 'next-word':
this.sendInput('\x1bf') this.sendInput({
[Platform.Windows]: '\x1b[1;5C',
[Platform.macOS]: '\x1bf',
[Platform.Linux]: '\x1bf',
}[this.hostApp.platform])
break break
case 'delete-previous-word': case 'delete-previous-word':
this.sendInput('\x1b\x7f') this.sendInput('\x1b\x7f')
break break
case 'delete-next-word': case 'delete-next-word':
this.sendInput('\x1bd') this.sendInput({
[Platform.Windows]: '\x1bd\x1b[3;5~',
[Platform.macOS]: '\x1bd',
[Platform.Linux]: '\x1bd',
}[this.hostApp.platform])
break break
case 'search': case 'search':
this.showSearchPanel = true this.showSearchPanel = true
@@ -165,6 +185,9 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
this.element.nativeElement.querySelector('.search-input').focus() this.element.nativeElement.querySelector('.search-input').focus()
}) })
break break
case 'pane-focus-all':
this.focusAllPanes()
break
} }
}) })
this.bellPlayer = document.createElement('audio') this.bellPlayer = document.createElement('audio')
@@ -205,6 +228,10 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
this.session.releaseInitialDataBuffer() this.session.releaseInitialDataBuffer()
}) })
this.alternateScreenActive$.subscribe(x => {
this.alternateScreenActive = x
})
if (this.savedState) { if (this.savedState) {
this.frontend.restoreState(this.savedState) this.frontend.restoreState(this.savedState)
this.frontend.write('\r\n\r\n') this.frontend.write('\r\n\r\n')
@@ -244,6 +271,10 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
}) })
this.frontend.focus() this.frontend.focus()
this.blurred$.subscribe(() => {
this.cancelFocusAllPanes()
})
} }
async buildContextMenu (): Promise<Electron.MenuItemConstructorOptions[]> { async buildContextMenu (): Promise<Electron.MenuItemConstructorOptions[]> {
@@ -274,7 +305,7 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
*/ */
write (data: string): void { write (data: string): void {
const percentageMatch = /(^|[^\d])(\d+(\.\d+)?)%([^\d]|$)/.exec(data) const percentageMatch = /(^|[^\d])(\d+(\.\d+)?)%([^\d]|$)/.exec(data)
if (percentageMatch) { if (!this.alternateScreenActive && percentageMatch) {
const percentage = percentageMatch[3] ? parseFloat(percentageMatch[2]) : parseInt(percentageMatch[2]) const percentage = percentageMatch[3] ? parseFloat(percentageMatch[2]) : parseInt(percentageMatch[2])
if (percentage > 0 && percentage <= 100) { if (percentage > 0 && percentage <= 100) {
this.setProgress(percentage) this.setProgress(percentage)
@@ -286,7 +317,7 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
this.frontend.write(data) this.frontend.write(data)
} }
paste (): void { async paste (): Promise<void> {
let data = this.electron.clipboard.readText() as string let data = this.electron.clipboard.readText() as string
if (this.config.store.terminal.bracketedPaste) { if (this.config.store.terminal.bracketedPaste) {
data = '\x1b[200~' + data + '\x1b[201~' data = '\x1b[200~' + data + '\x1b[201~'
@@ -296,6 +327,28 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
} else { } else {
data = data.replace(/\n/g, '\r') data = data.replace(/\n/g, '\r')
} }
if (!this.alternateScreenActive) {
data = data.trim()
if (data.includes('\r') && this.config.store.terminal.warnOnMultilinePaste) {
const buttons = ['Paste', 'Cancel']
const result = (await this.electron.showMessageBox(
this.hostApp.getWindow(),
{
type: 'warning',
detail: data,
message: `Paste multiple lines?`,
buttons,
defaultId: 0,
cancelId: 1,
}
)).response
if (result === 1) {
return
}
}
}
this.sendInput(data) this.sendInput(data)
} }
@@ -307,7 +360,7 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
this.topPadded = this.hostApp.platform === Platform.macOS this.topPadded = this.hostApp.platform === Platform.macOS
&& this.config.store.appearance.frame === 'thin' && this.config.store.appearance.frame === 'thin'
&& this.config.store.appearance.tabsLocation === 'bottom' && this.config.store.appearance.tabsLocation !== 'top'
if (this.config.store.terminal.background === 'colorScheme') { if (this.config.store.terminal.background === 'colorScheme') {
if (this.config.store.terminal.colorScheme.background) { if (this.config.store.terminal.colorScheme.background) {
@@ -333,6 +386,35 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
this.frontend.setZoom(this.zoom) this.frontend.setZoom(this.zoom)
} }
focusAllPanes (): void {
if (this.allFocusModeSubscription) {
return
}
if (this.parent instanceof SplitTabComponent) {
this.parent._allFocusMode = true
this.parent.layout()
this.allFocusModeSubscription = this.frontend.input$.subscribe(data => {
for (const tab of (this.parent as SplitTabComponent).getAllTabs()) {
if (tab !== this && tab instanceof BaseTerminalTabComponent) {
tab.sendInput(data)
}
}
})
}
}
cancelFocusAllPanes (): void {
if (!this.allFocusModeSubscription) {
return
}
if (this.parent instanceof SplitTabComponent) {
this.allFocusModeSubscription?.unsubscribe?.()
this.allFocusModeSubscription = null
this.parent._allFocusMode = false
this.parent.layout()
}
}
/** @hidden */ /** @hidden */
ngOnDestroy (): void { ngOnDestroy (): void {
this.frontend.detach(this.content.nativeElement) this.frontend.detach(this.content.nativeElement)
@@ -375,7 +457,11 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
} }
this.termContainerSubscriptions = [ this.termContainerSubscriptions = [
this.frontend.title$.subscribe(title => this.zone.run(() => this.setTitle(title))), this.frontend.title$.subscribe(title => this.zone.run(() => {
if (this.enableDynamicTitle) {
this.setTitle(title)
}
})),
this.focused$.subscribe(() => this.frontend.enableResizing = true), this.focused$.subscribe(() => this.frontend.enableResizing = true),
this.blurred$.subscribe(() => this.frontend.enableResizing = false), this.blurred$.subscribe(() => this.frontend.enableResizing = false),
@@ -437,7 +523,7 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
] ]
} }
protected attachSessionHandlers (): void { protected attachSessionHandlers (destroyOnSessionClose = false): void {
// this.session.output$.bufferTime(10).subscribe((datas) => { // this.session.output$.bufferTime(10).subscribe((datas) => {
this.session.output$.subscribe(data => { this.session.output$.subscribe(data => {
if (this.enablePassthrough) { if (this.enablePassthrough) {
@@ -448,9 +534,11 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
} }
}) })
if (destroyOnSessionClose) {
this.sessionCloseSubscription = this.session.closed$.subscribe(() => { this.sessionCloseSubscription = this.session.closed$.subscribe(() => {
this.frontend.destroy() this.frontend.destroy()
this.destroy() this.destroy()
}) })
} }
} }
}

View File

@@ -19,6 +19,7 @@ export interface Profile {
name: string name: string
color?: string color?: string
sessionOptions: SessionOptions sessionOptions: SessionOptions
shell?: string
isBuiltin?: boolean isBuiltin?: boolean
icon?: string icon?: string
} }

Some files were not shown because too many files have changed in this diff Show More