Compare commits

...

460 Commits

Author SHA1 Message Date
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
Eugene Pankov
0d65fe348b lint 2020-03-01 17:07:11 +01:00
Eugene Pankov
e4b7693685 dropped slug 2020-03-01 17:02:49 +01:00
Eugene Pankov
566aa83fa9 bumped plugin versions 2020-03-01 16:40:43 +01:00
Eugene Pankov
eb2d88eac2 added a build-typings script 2020-03-01 16:40:26 +01:00
Eugene Pankov
316b77ec7b lint 2020-03-01 16:33:24 +01:00
Eugene Pankov
a4dc6832f3 Merge branch 'master' of github.com:Eugeny/terminus 2020-03-01 16:16:26 +01:00
Eugene Pankov
7a895dda1a fixes 2020-03-01 16:16:03 +01:00
Eugene Pankov
b2fc016aa8 bumped sentry 2020-03-01 16:13:12 +01:00
Eugene
32096ea4fd Merge pull request #2170 from Eugeny/dependabot/npm_and_yarn/sentry/cli-1.51.1
Bump @sentry/cli from 1.49.0 to 1.51.1
2020-03-01 16:12:18 +01:00
Eugene
30fd36ed26 Merge pull request #2189 from Eugeny/dependabot/npm_and_yarn/typescript-3.8.2
Bump typescript from 3.7.5 to 3.8.2
2020-03-01 16:11:47 +01:00
dependabot-preview[bot]
afdf09076a Bump tslib from 1.10.0 to 1.11.1 (#2196)
Bumps [tslib](https://github.com/Microsoft/tslib) from 1.10.0 to 1.11.1.
- [Release notes](https://github.com/Microsoft/tslib/releases)
- [Commits](https://github.com/Microsoft/tslib/compare/1.10.0...1.11.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-01 16:11:30 +01:00
Eugene Pankov
04a0a0cc64 lint 2020-03-01 16:10:45 +01:00
Eugene Pankov
fda4d2dcef Merge branch 'dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-2.21.0' 2020-03-01 15:23:05 +01:00
Eugene Pankov
2c341e23b5 Merge branch 'dependabot/npm_and_yarn/typescript-eslint/parser-2.21.0' 2020-03-01 15:21:59 +01:00
Eugene Pankov
953b06f43f skip invalid hotkey config (fixes #817) 2020-03-01 15:20:16 +01:00
Eugene Pankov
e1cc1d56ea fixes 2020-03-01 15:12:24 +01:00
Eugene Pankov
df2f4d4a6c angular 9 fixes 2020-03-01 14:26:55 +01:00
Eugene Pankov
092820173f fixed #2111 2020-03-01 14:08:54 +01:00
Eugene Pankov
58c7c23bd8 Merge branch 'master' of github.com:Eugeny/terminus 2020-03-01 14:07:07 +01:00
Eugene Pankov
920afe450a bumped angular 2020-03-01 14:07:02 +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
dependabot-preview[bot]
3edcce29fa Bump keytar from 5.2.0 to 5.4.0 in /app (#2188)
Bumps [keytar](https://github.com/atom/node-keytar) from 5.2.0 to 5.4.0.
- [Release notes](https://github.com/atom/node-keytar/releases)
- [Commits](https://github.com/atom/node-keytar/compare/v5.2.0...v5.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-03-01 13:45:29 +01:00
Eugene Pankov
e14c7fec10 Revert "Update linux.yml"
This reverts commit b3ed62244d.
2020-03-01 13:30:14 +01:00
Eugene Pankov
b3ed62244d Update linux.yml 2020-03-01 13:29:10 +01:00
Eugene Pankov
ff1bfa990c node-version prop 2020-03-01 13:26:40 +01:00
Eugene Pankov
bd3463880e Update linux.yml 2020-03-01 13:25:02 +01:00
Eugene Pankov
95a61ec369 Update linux.yml 2020-03-01 13:15:58 +01:00
Eugene Pankov
1b29797a81 serial plugin ui improv 2020-03-01 13:08:16 +01:00
Eugene Pankov
10b21ee085 added serial port detection 2020-03-01 12:15:02 +01:00
Eugene
f5ffdc1707 Use ssh-keygen to convert ssh keys (#2197)
* use ssh-keygen to convert keys

* drop incorrect typings

* .

* Update ssh.service.ts

* Update ssh.service.ts

* Update ssh.service.ts
2020-03-01 11:17:11 +01:00
Eugene Pankov
b3f17b84ff added hotkeys to save session output 2020-02-29 15:05:58 +01:00
dependabot-preview[bot]
1a332128e3 Bump @typescript-eslint/parser from 2.19.2 to 2.21.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 2.19.2 to 2.21.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.21.0/packages/parser)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-27 04:21:13 +00:00
dependabot-preview[bot]
b5db7e80d0 Bump typescript from 3.7.5 to 3.8.2
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 3.7.5 to 3.8.2.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v3.7.5...v3.8.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-27 04:20:22 +00:00
dependabot-preview[bot]
5bba719624 Bump @sentry/cli from 1.49.0 to 1.51.1
Bumps [@sentry/cli](https://github.com/getsentry/sentry-cli) from 1.49.0 to 1.51.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.49.0...1.51.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-26 10:07:21 +00:00
Eugene
09d6838b08 Merge pull request #2060 from Eugeny/dependabot/npm_and_yarn/terminus-core/types/js-yaml-3.12.2
Bump @types/js-yaml from 3.12.1 to 3.12.2 in /terminus-core
2020-02-26 11:06:10 +01:00
Eugene
325d2dc2a4 Merge pull request #2065 from Eugeny/dependabot/npm_and_yarn/terminus-plugin-manager/types/semver-7.1.0
Bump @types/semver from 6.2.0 to 7.1.0 in /terminus-plugin-manager
2020-02-26 11:06:01 +01:00
dependabot-preview[bot]
94c7e2b5c3 Bump @types/js-yaml from 3.12.1 to 3.12.2 in /terminus-core
Bumps [@types/js-yaml](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/js-yaml) from 3.12.1 to 3.12.2.
- [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-02-26 10:05:48 +00:00
dependabot-preview[bot]
9da2e8d489 Bump @types/semver from 6.2.0 to 7.1.0 in /terminus-plugin-manager
Bumps [@types/semver](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/semver) from 6.2.0 to 7.1.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/semver)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-26 10:05:42 +00:00
Eugene
ff1c5df30b Merge pull request #1974 from Eugeny/dependabot/npm_and_yarn/sentry/electron-1.2.0
Bump @sentry/electron from 1.0.0 to 1.2.0
2020-02-26 11:05:22 +01:00
Eugene
159adf9911 Merge pull request #2140 from Eugeny/dependabot/npm_and_yarn/app/electron-updater-4.2.2
Bump electron-updater from 4.2.0 to 4.2.2 in /app
2020-02-26 11:04:25 +01:00
Eugene
994a94f8f1 Merge pull request #2141 from Eugeny/dependabot/npm_and_yarn/terminus-core/electron-updater-4.2.2
Bump electron-updater from 4.2.0 to 4.2.2 in /terminus-core
2020-02-26 11:04:14 +01:00
Eugene
571db20523 Merge pull request #2179 from Eugeny/all-contributors/add-nstefanou
docs: add nstefanou as a contributor
2020-02-26 11:02:57 +01:00
Eugene
a422d62db0 Merge pull request #2175 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/uuid-7.0.1
Bump uuid from 3.4.0 to 7.0.1 in /terminus-terminal
2020-02-26 11:02:35 +01:00
Eugene
feb2a52b37 Merge pull request #2178 from Eugeny/dependabot/npm_and_yarn/terminus-core/uuid-7.0.1
Bump uuid from 3.4.0 to 7.0.1 in /terminus-core
2020-02-26 11:02:17 +01:00
allcontributors[bot]
267ca2e95c docs: update .all-contributorsrc [skip ci] 2020-02-26 10:01:51 +00:00
allcontributors[bot]
9691a932ac docs: update README.md [skip ci] 2020-02-26 10:01:50 +00:00
Eugene Pankov
94d51c029e serial fixes 2020-02-26 11:01:05 +01:00
Eugene Pankov
efd7b2ca2b Merge branch 'master' into pr/2173 2020-02-26 10:18:49 +01:00
Eugene Pankov
ed88784431 Merge branch 'master' of github.com:Eugeny/terminus 2020-02-26 10:18:32 +01:00
Eugene Pankov
e48f844ea0 lint 2020-02-26 10:16:45 +01:00
Eugene
fd21be5408 Merge pull request #2134 from Eugeny/dependabot/npm_and_yarn/typedoc-0.16.10
Bump typedoc from 0.16.7 to 0.16.10
2020-02-26 10:16:39 +01:00
Eugene
f4c2d01df8 Merge pull request #2136 from Eugeny/dependabot/npm_and_yarn/eslint-plugin-import-2.20.1
Bump eslint-plugin-import from 2.20.0 to 2.20.1
2020-02-26 10:16:29 +01:00
Eugene
4828bb4df7 Merge pull request #2137 from Eugeny/dependabot/npm_and_yarn/webpack-5.0.0-beta.13
Bump webpack from 5.0.0-beta.12 to 5.0.0-beta.13
2020-02-26 10:16:21 +01:00
Eugene
037e91508b Merge pull request #2166 from Eugeny/dependabot/npm_and_yarn/terminus-ssh/ssh2-0.8.8
Bump ssh2 from 0.8.7 to 0.8.8 in /terminus-ssh
2020-02-26 10:15:06 +01:00
dependabot-preview[bot]
735010dd1f Bump uuid from 3.4.0 to 7.0.1 in /terminus-core
Bumps [uuid](https://github.com/uuidjs/uuid) from 3.4.0 to 7.0.1.
- [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/v3.4.0...v7.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-26 09:15:05 +00:00
dependabot-preview[bot]
11364dd788 Bump uuid from 3.4.0 to 7.0.1 in /terminus-terminal
Bumps [uuid](https://github.com/uuidjs/uuid) from 3.4.0 to 7.0.1.
- [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/v3.4.0...v7.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-26 09:14:59 +00:00
Eugene Pankov
0eced6f4a9 bumped xterm (fixes #2153) 2020-02-26 10:13:22 +01:00
Eugene
3157c89be3 Merge pull request #2132 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-webgl-0.6.0-beta.3
Bump xterm-addon-webgl from 0.6.0-beta.2 to 0.6.0-beta.3 in /terminus-terminal
2020-02-26 10:10:14 +01:00
Eugene
a7f909d06a Merge pull request #2177 from Eugeny/dependabot/npm_and_yarn/electron-8.0.2
Bump electron from 8.0.0 to 8.0.2
2020-02-26 10:09:35 +01:00
dependabot-preview[bot]
527b55a46e Bump electron from 8.0.0 to 8.0.2
Bumps [electron](https://github.com/electron/electron) from 8.0.0 to 8.0.2.
- [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.0...v8.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-26 04:23:29 +00:00
Nikolaos Stefanou
a610306f29 unused parameters 2020-02-25 20:08:43 +00:00
Nikolaos Stefanou
3daf0b394e lint fixes 2020-02-25 19:54:36 +00:00
Nikolaos Stefanou
f151928b6b make serialport native bindings work 2020-02-25 19:49:25 +00:00
Nikolaos Stefanou
041a3ce2b6 fix lint errors 2020-02-25 17:00:41 +00:00
Nikolaos Stefanou
6348e7b8f0 first working version of serial port integration 2020-02-25 16:31:42 +00:00
dependabot-preview[bot]
8be72618e6 Bump @typescript-eslint/eslint-plugin from 2.13.0 to 2.21.0
Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 2.13.0 to 2.21.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.21.0/packages/eslint-plugin)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-25 04:24:16 +00:00
dependabot-preview[bot]
a50c7cb474 Bump ssh2 from 0.8.7 to 0.8.8 in /terminus-ssh
Bumps [ssh2](https://github.com/mscdex/ssh2) from 0.8.7 to 0.8.8.
- [Release notes](https://github.com/mscdex/ssh2/releases)
- [Commits](https://github.com/mscdex/ssh2/compare/v0.8.7...v0.8.8)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-25 04:21:05 +00:00
Eugene
8cef4e5cf9 Merge pull request #2148 from nstefanou/master
resolves #1988
2020-02-24 11:56:29 +01:00
Nikolaos Stefanou
9705a1b5b5 resolves #1988 2020-02-19 12:45:18 +00:00
Eugene Pankov
d0ddd82906 fixed wsl crash when default distro is not available (fixes #2130) 2020-02-18 10:52:17 +01:00
dependabot-preview[bot]
dfa17948e2 Bump electron-updater from 4.2.0 to 4.2.2 in /terminus-core
Bumps [electron-updater](https://github.com/electron-userland/electron-builder) from 4.2.0 to 4.2.2.
- [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.0...v4.2.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-18 04:21:41 +00:00
dependabot-preview[bot]
3607391d55 Bump electron-updater from 4.2.0 to 4.2.2 in /app
Bumps [electron-updater](https://github.com/electron-userland/electron-builder) from 4.2.0 to 4.2.2.
- [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.0...v4.2.2)

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

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-17 04:25:03 +00:00
dependabot-preview[bot]
b467c7de65 Bump eslint-plugin-import from 2.20.0 to 2.20.1
Bumps [eslint-plugin-import](https://github.com/benmosher/eslint-plugin-import) from 2.20.0 to 2.20.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.0...v2.20.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-17 04:24:30 +00:00
dependabot-preview[bot]
c3e793229d Bump typedoc from 0.16.7 to 0.16.10
Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.16.7 to 0.16.10.
- [Release notes](https://github.com/TypeStrong/TypeDoc/releases)
- [Commits](https://github.com/TypeStrong/TypeDoc/compare/v0.16.7...v0.16.10)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-17 04:23:23 +00:00
dependabot-preview[bot]
14bcfb01c2 Bump xterm-addon-webgl in /terminus-terminal
Bumps [xterm-addon-webgl](https://github.com/xtermjs/xterm.js) from 0.6.0-beta.2 to 0.6.0-beta.3.
- [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-02-17 04:22:05 +00:00
Eugene Pankov
8a5846ff81 dropped local fsevents 2020-02-16 23:07:12 +01:00
Eugene Pankov
298209b03a option to skip the ssh banner (fixes #2121) 2020-02-16 23:04:26 +01:00
Eugene Pankov
dc03a7f135 fixed #1629 2020-02-16 23:00:02 +01:00
Eugene Pankov
2d357d0ed2 made zmodem xfers cancelable 2020-02-16 22:57:54 +01:00
Eugene Pankov
58d2590495 moved decorators in to features/ 2020-02-16 21:34:49 +01:00
Eugene Pankov
0c892225f3 nicer terminal messages for SSH 2020-02-16 21:26:01 +01:00
Eugene Pankov
851d92a140 fixed private key handling (fixed #2018, fixed #2053, fixed #1966) 2020-02-16 21:25:52 +01:00
Eugene Pankov
665ce2f022 limited xterm serialization length 2020-02-16 16:59:59 +01:00
Eugene Pankov
5ea1ff1ea5 added fsevents 2020-02-16 16:59:40 +01:00
dependabot-preview[bot]
5d28369b8b Bump @sentry/electron from 1.0.0 to 1.2.0
Bumps [@sentry/electron](https://github.com/getsentry/sentry-electron) from 1.0.0 to 1.2.0.
- [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.0.0...v1.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-16 15:46:16 +00:00
Eugene
5ed92342ea Merge pull request #2104 from Eugeny/dependabot/npm_and_yarn/terminus-ssh/types/ssh2-0.5.40
Bump @types/ssh2 from 0.5.39 to 0.5.40 in /terminus-ssh
2020-02-16 16:44:49 +01:00
Eugene
d9843c4ff0 Merge pull request #2106 from Eugeny/dependabot/npm_and_yarn/typescript-eslint/parser-2.19.2
Bump @typescript-eslint/parser from 2.17.0 to 2.19.2
2020-02-16 16:44:40 +01:00
Eugene
448371dffa Merge pull request #2126 from Eugeny/dependabot/npm_and_yarn/app/node-abi-2.15.0
Bump node-abi from 2.14.0 to 2.15.0 in /app
2020-02-16 16:44:20 +01:00
Eugene
425c288aa0 Merge pull request #2125 from Eugeny/dependabot/npm_and_yarn/node-abi-2.15.0
Bump node-abi from 2.14.0 to 2.15.0
2020-02-16 16:44:09 +01:00
Eugene
09b118987e Merge pull request #2119 from Eugeny/dependabot/npm_and_yarn/fortawesome/fontawesome-free-5.12.1
Bump @fortawesome/fontawesome-free from 5.12.0 to 5.12.1
2020-02-16 16:43:43 +01:00
dependabot-preview[bot]
70dbb6bfcc Bump node-abi from 2.14.0 to 2.15.0 in /app
Bumps [node-abi](https://github.com/lgeiger/node-abi) from 2.14.0 to 2.15.0.
- [Release notes](https://github.com/lgeiger/node-abi/releases)
- [Commits](https://github.com/lgeiger/node-abi/compare/v2.14.0...v2.15.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-14 04:22:48 +00:00
dependabot-preview[bot]
4b55f9cd97 Bump node-abi from 2.14.0 to 2.15.0
Bumps [node-abi](https://github.com/lgeiger/node-abi) from 2.14.0 to 2.15.0.
- [Release notes](https://github.com/lgeiger/node-abi/releases)
- [Commits](https://github.com/lgeiger/node-abi/compare/v2.14.0...v2.15.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-14 04:22:32 +00:00
Eugene Pankov
fbb6614553 fixed #185 2020-02-13 12:32:04 +01:00
dependabot-preview[bot]
8d849b40a2 Bump @fortawesome/fontawesome-free from 5.12.0 to 5.12.1
Bumps [@fortawesome/fontawesome-free](https://github.com/FortAwesome/Font-Awesome) from 5.12.0 to 5.12.1.
- [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.0...5.12.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-13 10:00:56 +00:00
Eugene
5e678c15f3 Merge pull request #2113 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-webgl-0.6.0-beta.2
Bump xterm-addon-webgl from 0.5.0 to 0.6.0-beta.2 in /terminus-terminal
2020-02-13 10:56:30 +01:00
Eugene
6642be3050 Merge pull request #2090 from Eugeny/dependabot/npm_and_yarn/app/node-abi-2.14.0
Bump node-abi from 2.13.0 to 2.14.0 in /app
2020-02-13 10:55:21 +01:00
Eugene
9998fa97f7 Merge pull request #2069 from Eugeny/dependabot/npm_and_yarn/cross-env-7.0.0
Bump cross-env from 6.0.3 to 7.0.0
2020-02-13 10:54:49 +01:00
dependabot-preview[bot]
2b3113b67d Bump xterm-addon-webgl from 0.5.0 to 0.6.0-beta.2 in /terminus-terminal
Bumps [xterm-addon-webgl](https://github.com/xtermjs/xterm.js) from 0.5.0 to 0.6.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-02-13 09:49:55 +00:00
Eugene
f933c29e5e Merge pull request #2102 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-serialize-0.1.2
Bump xterm-addon-serialize from 0.1.1 to 0.1.2 in /terminus-terminal
2020-02-13 10:48:35 +01:00
Eugene
a908d737a4 Merge pull request #2040 from Eugeny/dependabot/npm_and_yarn/typescript-3.7.5
Bump typescript from 3.7.4 to 3.7.5
2020-02-13 10:48:27 +01:00
Eugene
469b4e4f44 Merge pull request #2103 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-search-0.5.0
Bump xterm-addon-search from 0.4.0 to 0.5.0 in /terminus-terminal
2020-02-13 10:48:11 +01:00
Eugene
13b31d16e8 Merge pull request #2036 from Eugeny/dependabot/npm_and_yarn/style-loader-1.1.3
Bump style-loader from 1.1.2 to 1.1.3
2020-02-13 10:46:26 +01:00
Eugene
afa2eb3a6e Merge pull request #2045 from Eugeny/dependabot/npm_and_yarn/terminus-plugin-manager/axios-0.19.2
Bump axios from 0.19.1 to 0.19.2 in /terminus-plugin-manager
2020-02-13 10:46:06 +01:00
Eugene
01eb26e5c1 Merge pull request #2042 from Eugeny/dependabot/npm_and_yarn/terminus-core/axios-0.19.2
Bump axios from 0.19.1 to 0.19.2 in /terminus-core
2020-02-13 10:45:56 +01:00
Eugene
b967a1ecfa Merge pull request #2110 from Eugeny/dependabot/npm_and_yarn/app/keytar-5.2.0
Bump keytar from 5.1.0 to 5.2.0 in /app
2020-02-13 10:44:52 +01:00
Eugene Pankov
dfe91e98c3 Update windows.yml 2020-02-13 10:42:47 +01:00
Eugene Pankov
6706aa67eb portable build artifact name 2020-02-13 10:42:26 +01:00
Eugene
15fe4f34f9 Merge pull request #2112 from CyrilTaylor/dev/portable_performance
improve the launch performance of portable
2020-02-13 10:41:22 +01:00
Cyril Taylor
9b7c446fd7 improve the launch performance of portable 2020-02-13 10:36:08 +08:00
dependabot-preview[bot]
9225239433 Bump keytar from 5.1.0 to 5.2.0 in /app
Bumps [keytar](https://github.com/atom/node-keytar) from 5.1.0 to 5.2.0.
- [Release notes](https://github.com/atom/node-keytar/releases)
- [Commits](https://github.com/atom/node-keytar/compare/v5.1.0...v5.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-12 04:23:08 +00:00
Eugene Pankov
e764b22698 updater 2020-02-11 15:34:56 +01:00
dependabot-preview[bot]
a4d88e4631 Bump @typescript-eslint/parser from 2.17.0 to 2.19.2
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 2.17.0 to 2.19.2.
- [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.19.2/packages/parser)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-11 04:23:30 +00:00
dependabot-preview[bot]
20da700ad4 Bump @types/ssh2 from 0.5.39 to 0.5.40 in /terminus-ssh
Bumps [@types/ssh2](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/ssh2) from 0.5.39 to 0.5.40.
- [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-02-11 04:21:22 +00:00
dependabot-preview[bot]
e4a4937023 Bump xterm-addon-search from 0.4.0 to 0.5.0 in /terminus-terminal
Bumps [xterm-addon-search](https://github.com/xtermjs/xterm.js) from 0.4.0 to 0.5.0.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/compare/0.4...0.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-11 04:20:14 +00:00
dependabot-preview[bot]
822b60b454 Bump xterm-addon-serialize from 0.1.1 to 0.1.2 in /terminus-terminal
Bumps xterm-addon-serialize from 0.1.1 to 0.1.2.

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-10 04:20:58 +00:00
Eugene Pankov
72a024c713 fixed wsl shell provider 2020-02-09 18:01:57 +01:00
Eugene Pankov
6132881b8a allow saving terminal state for debugging 2020-02-06 14:52:39 +03:00
Eugene Pankov
1ac22ec563 disable vibrancy while dragging window on buggy windows 10 builds (fixes #949) 2020-02-05 16:02:58 +03:00
Eugene Pankov
ca68905b05 disable background throttling 2020-02-05 15:22:35 +03:00
Eugene Pankov
2470f5f941 LRU fix 2020-02-05 15:22:28 +03:00
Eugene Pankov
fd1ea4fc49 delete saved password when deleting and ssh connection (fixes #1999) 2020-02-05 15:16:51 +03:00
Eugene Pankov
3f8b933d05 lint 2020-02-05 15:16:31 +03:00
dependabot-preview[bot]
3b13f0d73f Bump cross-env from 6.0.3 to 7.0.0
Bumps [cross-env](https://github.com/kentcdodds/cross-env) from 6.0.3 to 7.0.0.
- [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/v6.0.3...v7.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-05 11:55:37 +00:00
dependabot-preview[bot]
a261efbc01 Bump node-abi from 2.13.0 to 2.14.0 in /app
Bumps [node-abi](https://github.com/lgeiger/node-abi) from 2.13.0 to 2.14.0.
- [Release notes](https://github.com/lgeiger/node-abi/releases)
- [Commits](https://github.com/lgeiger/node-abi/compare/v2.13.0...v2.14.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-05 11:55:18 +00:00
Eugene Pankov
04d4474648 Update app.ts 2020-02-05 14:54:10 +03:00
Eugene Pankov
4a50c84cfe hotkeys to move tabs around (fixes #2079) 2020-02-05 14:53:26 +03:00
Eugene Pankov
9ca091e592 bumped electron 2020-02-05 14:53:04 +03:00
Eugene Pankov
fa56f30f63 lint 2020-02-05 14:52:53 +03:00
Eugene Pankov
9c19307181 more tab saving fixes 2020-02-05 14:52:33 +03:00
Eugene Pankov
bfd34df41e fixed crash for unknown wsl distros (fixes #2083, fixes #2021) 2020-02-05 14:25:14 +03:00
Eugene Pankov
26ee36458d don't even think about updating if not enabled (fixes #2088) 2020-02-05 14:16:15 +03:00
Eugene Pankov
e99b83dfdc recovery fixes 2020-02-05 14:15:51 +03:00
Eugene Pankov
ceb75323fe restore tab colors during recovery (fixes #1713) 2020-02-05 13:58:18 +03:00
Eugene Pankov
bfb6417865 Merge branch 'master' of github.com:Eugeny/terminus 2020-02-05 13:37:07 +03:00
Eugene Pankov
498564be9a added scrollback saving 2020-02-05 13:37:04 +03:00
Eugene
6c38aa4008 Merge pull request #2064 from Eugeny/dependabot/npm_and_yarn/app/keytar-5.1.0
Bump keytar from 5.0.0 to 5.1.0 in /app
2020-02-05 12:59:38 +03:00
Eugene Pankov
32aaa3d0ff Merge branch 'master' of github.com:Eugeny/terminus 2020-02-05 12:58:41 +03:00
Eugene
7ce5d647da Merge pull request #2067 from Eugeny/dependabot/npm_and_yarn/electron-builder-22.3.2
Bump electron-builder from 22.1.0 to 22.3.2
2020-02-05 12:58:09 +03:00
Eugene Pankov
bf0be7fa0e split electron-builder configuration 2020-02-05 12:57:24 +03:00
Eugene Pankov
a10eb5ff90 set executableArgs for linux 2020-02-05 12:54:21 +03:00
Eugene
c6a27d8893 Merge pull request #2089 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-webgl-0.5.0
Bump xterm-addon-webgl from 0.5.0-beta.7 to 0.5.0 in /terminus-terminal
2020-02-05 12:48:43 +03:00
Eugene
7ee1fb4b76 Merge pull request #2091 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-4.4.0
Bump xterm from 4.4.0-beta.15 to 4.4.0 in /terminus-terminal
2020-02-05 12:48:10 +03:00
dependabot-preview[bot]
e0f9f558f1 Bump xterm from 4.4.0-beta.15 to 4.4.0 in /terminus-terminal
Bumps [xterm](https://github.com/xtermjs/xterm.js) from 4.4.0-beta.15 to 4.4.0.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/commits/4.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-05 04:20:35 +00:00
dependabot-preview[bot]
d511bb9fc0 Bump xterm-addon-webgl from 0.5.0-beta.7 to 0.5.0 in /terminus-terminal
Bumps [xterm-addon-webgl](https://github.com/xtermjs/xterm.js) from 0.5.0-beta.7 to 0.5.0.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/commits/0.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-05 04:20:11 +00:00
Eugene
15f99c8ae8 Merge pull request #2081 from CyrilTaylor/dev/portable_for_plugins
Fix: save plugins to path `UserData` for fit portable mode
2020-02-03 16:18:29 +03:00
Cyril Taylor
1027fbfb60 Fix: sentry will use userData before redirect it, ahead of the time 2020-02-03 20:59:46 +08:00
Cyril Taylor
d89abde860 Fix: save plugins to UserData path for fit portable mode 2020-02-02 16:45:06 +08:00
Eugene Pankov
1d76f6b056 re-fixed #2054 2020-02-01 12:15:24 +03:00
Eugene Pankov
f09fb735a7 Update splitTab.component.ts 2020-01-30 19:17:11 +03:00
Eugene Pankov
f6d08af986 Revert "re-added snap build"
This reverts commit ff2c2031b5.
2020-01-30 18:54:55 +03:00
Eugene Pankov
7ddb67f28e added snap plugs 2020-01-29 15:10:47 +03:00
Eugene Pankov
ff2c2031b5 re-added snap build 2020-01-29 15:05:34 +03:00
Eugene Pankov
1ab528b05c append --no-sandbox when starting on Linux (fixes #1525) 2020-01-29 14:28:03 +03:00
dependabot-preview[bot]
9ae92ef88c Bump electron-builder from 22.1.0 to 22.3.2
Bumps [electron-builder](https://github.com/electron-userland/electron-builder) from 22.1.0 to 22.3.2.
- [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.1.0...v22.3.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-29 04:24:32 +00:00
Eugene Pankov
f4f52321f5 unify context menus (fixes #2054) 2020-01-28 21:39:02 +03:00
Eugene Pankov
286b6cfdde fixed improper split tab saving (fixes #2025) 2020-01-28 20:55:51 +03:00
Eugene Pankov
b97149aa73 duplicate tab placement (fixes #2062) 2020-01-28 20:55:27 +03:00
Eugene
2094c44992 Merge pull request #2037 from Eugeny/dependabot/npm_and_yarn/electron-installer-snap-5.0.0
Bump electron-installer-snap from 4.1.0 to 5.0.0
2020-01-28 20:18:50 +03:00
Eugene
a8409a0aec Merge pull request #2047 from Eugeny/dependabot/npm_and_yarn/electron-rebuild-1.9.0
Bump electron-rebuild from 1.8.6 to 1.9.0
2020-01-28 20:18:38 +03:00
Eugene
5c2ac72bac Bump electron from 7.1.9 to 7.1.10 (#2046)
Bump electron from 7.1.9 to 7.1.10
2020-01-28 20:18:01 +03:00
dependabot-preview[bot]
b58d6e1bfd Bump keytar from 5.0.0 to 5.1.0 in /app
Bumps [keytar](https://github.com/atom/node-keytar) from 5.0.0 to 5.1.0.
- [Release notes](https://github.com/atom/node-keytar/releases)
- [Commits](https://github.com/atom/node-keytar/compare/v5.0.0...v5.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-28 04:20:25 +00:00
Eugene
be09e7829f fixed #2048 2020-01-23 14:01:56 +01:00
dependabot-preview[bot]
a9320a33c9 Bump electron-rebuild from 1.8.6 to 1.9.0
Bumps [electron-rebuild](https://github.com/electron/electron-rebuild) from 1.8.6 to 1.9.0.
- [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.8.6...v1.9.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-23 04:24:49 +00:00
dependabot-preview[bot]
0e881e47e2 Bump electron from 7.1.9 to 7.1.10
Bumps [electron](https://github.com/electron/electron) from 7.1.9 to 7.1.10.
- [Release notes](https://github.com/electron/electron/releases)
- [Commits](https://github.com/electron/electron/compare/v7.1.9...v7.1.10)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-23 04:24:20 +00:00
dependabot-preview[bot]
a3a5da8550 Bump axios from 0.19.1 to 0.19.2 in /terminus-plugin-manager
Bumps [axios](https://github.com/axios/axios) from 0.19.1 to 0.19.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/0.19.1...v0.19.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-23 04:22:03 +00:00
dependabot-preview[bot]
178a2e34c6 Bump axios from 0.19.1 to 0.19.2 in /terminus-core
Bumps [axios](https://github.com/axios/axios) from 0.19.1 to 0.19.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/0.19.1...v0.19.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-22 04:28:24 +00:00
dependabot-preview[bot]
b39276feca Bump typescript from 3.7.4 to 3.7.5
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 3.7.4 to 3.7.5.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v3.7.4...v3.7.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-22 04:27:21 +00:00
dependabot-preview[bot]
3b7f4be643 Bump electron-installer-snap from 4.1.0 to 5.0.0
Bumps [electron-installer-snap](https://github.com/electron-userland/electron-installer-snap) from 4.1.0 to 5.0.0.
- [Release notes](https://github.com/electron-userland/electron-installer-snap/releases)
- [Changelog](https://github.com/electron-userland/electron-installer-snap/blob/master/NEWS.md)
- [Commits](https://github.com/electron-userland/electron-installer-snap/compare/v4.1.0...v5.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-22 04:25:45 +00:00
dependabot-preview[bot]
2c40f0dddc Bump style-loader from 1.1.2 to 1.1.3
Bumps [style-loader](https://github.com/webpack-contrib/style-loader) from 1.1.2 to 1.1.3.
- [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.2...v1.1.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-22 04:25:18 +00:00
Eugene Pankov
8f361f841c Update README.md 2020-01-21 23:11:01 +01:00
Eugene Pankov
0e0d59f2c5 blacklisted shell-selector 2020-01-21 23:09:27 +01:00
Eugene
ca9b8307c2 Merge pull request #1998 from Eugeny/dependabot/npm_and_yarn/terminus-core/core-js-3.6.4
Bump core-js from 3.6.3 to 3.6.4 in /terminus-core
2020-01-21 23:03:16 +01:00
Eugene
d837a3d7fd Merge pull request #1997 from Eugeny/dependabot/npm_and_yarn/core-js-3.6.4
Bump core-js from 3.6.2 to 3.6.4
2020-01-21 23:02:55 +01:00
Eugene
555e1e733d Merge pull request #2010 from Eugeny/dependabot/npm_and_yarn/webpack-5.0.0-beta.12
Bump webpack from 5.0.0-beta.11 to 5.0.0-beta.12
2020-01-21 23:02:38 +01:00
Eugene
2e546fb72e Merge pull request #2015 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/uuid-3.4.0
Bump uuid from 3.3.3 to 3.4.0 in /terminus-terminal
2020-01-21 23:01:31 +01:00
Eugene
a2d4b76070 Merge pull request #2016 from Eugeny/dependabot/npm_and_yarn/terminus-core/uuid-3.4.0
Bump uuid from 3.3.3 to 3.4.0 in /terminus-core
2020-01-21 23:01:18 +01:00
Eugene
34edee2f37 Merge pull request #2024 from Eugeny/dependabot/npm_and_yarn/typedoc-0.16.7
Bump typedoc from 0.15.7 to 0.16.7
2020-01-21 23:00:58 +01:00
Eugene
f17b7fb8ce Update updater.service.ts 2020-01-21 11:57:01 +01:00
dependabot-preview[bot]
cbe5ea7fdd Bump core-js from 3.6.2 to 3.6.4
Bumps [core-js](https://github.com/zloirock/core-js) from 3.6.2 to 3.6.4.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/v3.6.2...v3.6.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-21 10:37:51 +00:00
dependabot-preview[bot]
c00405afff Bump core-js from 3.6.3 to 3.6.4 in /terminus-core
Bumps [core-js](https://github.com/zloirock/core-js) from 3.6.3 to 3.6.4.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/v3.6.3...v3.6.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-21 10:37:06 +00:00
dependabot-preview[bot]
555db7bef9 Bump webpack from 5.0.0-beta.11 to 5.0.0-beta.12
Bumps [webpack](https://github.com/webpack/webpack) from 5.0.0-beta.11 to 5.0.0-beta.12.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.0.0-beta.11...v5.0.0-beta.12)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-21 10:35:55 +00:00
Eugene
94e9e7d439 Bump electron from 7.1.7 to 7.1.9 (#1995)
Bump electron from 7.1.7 to 7.1.9
2020-01-21 11:35:44 +01:00
dependabot-preview[bot]
c4850f2172 Bump electron from 7.1.7 to 7.1.9
Bumps [electron](https://github.com/electron/electron) from 7.1.7 to 7.1.9.
- [Release notes](https://github.com/electron/electron/releases)
- [Commits](https://github.com/electron/electron/compare/v7.1.7...v7.1.9)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-21 10:35:11 +00:00
Eugene
2d33a0030d Merge pull request #2033 from Eugeny/dependabot/npm_and_yarn/typescript-eslint/parser-2.17.0
Bump @typescript-eslint/parser from 2.15.0 to 2.17.0
2020-01-21 11:33:45 +01:00
Eugene
1f576edf85 Merge pull request #1984 from Eugeny/dependabot/npm_and_yarn/css-loader-3.4.2
Bump css-loader from 3.4.1 to 3.4.2
2020-01-21 11:33:11 +01:00
Eugene
6d139434d7 Merge pull request #1982 from Eugeny/dependabot/npm_and_yarn/eslint-plugin-import-2.20.0
Bump eslint-plugin-import from 2.19.1 to 2.20.0
2020-01-21 11:33:03 +01:00
dependabot-preview[bot]
e9ba07c7a3 Bump @typescript-eslint/parser from 2.15.0 to 2.17.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 2.15.0 to 2.17.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.17.0/packages/parser)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-21 04:23:20 +00:00
Eugene
4f083098c3 Merge pull request #2026 from CyrilTaylor/dev/wsl/icon
add icon for wsl distributions(fixes #2020)
2020-01-20 09:47:58 +01:00
Eugene
03369da32c Merge pull request #2028 from CyrilTaylor/dev/os.platform
update identify of platform
2020-01-20 09:46:19 +01:00
Cyril Taylor
edb2cf2b7b add icon for wsl distributions(#2020) 2020-01-20 15:56:46 +08:00
Cyril Taylor
91a1ae1cbe update identify of platform 2020-01-20 15:30:39 +08:00
dependabot-preview[bot]
4a9f17ace9 Bump typedoc from 0.15.7 to 0.16.7
Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.15.7 to 0.16.7.
- [Release notes](https://github.com/TypeStrong/TypeDoc/releases)
- [Commits](https://github.com/TypeStrong/TypeDoc/compare/v0.15.7...v0.16.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-20 04:26:08 +00:00
Eugene
d5babde1fa Update xtermFrontend.ts 2020-01-17 13:57:31 +01:00
dependabot-preview[bot]
902c1fceb1 Bump uuid from 3.3.3 to 3.4.0 in /terminus-core
Bumps [uuid](https://github.com/uuidjs/uuid) from 3.3.3 to 3.4.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/v3.3.3...v3.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-17 04:30:59 +00:00
dependabot-preview[bot]
1d340e4666 Bump uuid from 3.3.3 to 3.4.0 in /terminus-terminal
Bumps [uuid](https://github.com/uuidjs/uuid) from 3.3.3 to 3.4.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/v3.3.3...v3.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-17 04:24:01 +00:00
Eugene Pankov
b922fe7776 fixed corrupted profile icons 2020-01-16 17:48:40 +01:00
Eugene Pankov
de3829a94c fixed cygwin $PATH (fixes #1683, fixes #1570) 2020-01-16 17:45:32 +01:00
Eugene Pankov
964e0ad2bc hide __nonStructural members from the default config (fixes #2004) 2020-01-15 16:20:32 +01:00
Eugene Pankov
742affb88b allow resizing window near the drag space (fixes #2005) 2020-01-15 16:07:51 +01:00
Eugene Pankov
e9999ee883 don't crash if the PTY suddenly produces strings (#2004, fixes #1955) 2020-01-15 16:07:13 +01:00
Eugene Pankov
1c8288bfe1 bumped xterm 2020-01-14 11:57:17 +01:00
Eugene Pankov
37044fbb01 enable vibrancy by default 2020-01-14 11:57:08 +01:00
Eugene Pankov
5507171fee zmodem fixes (fixes #1949) 2020-01-14 11:41:05 +01:00
Eugene
472b421484 Merge pull request #2000 from CyrilTaylor/dev/portable/userData_location
set userData location to the 'data' folder which at the same level as the Terminus executable directory if exist with portable mode
2020-01-14 09:26:26 +01:00
Eugene
b076541962 Merge pull request #1991 from CyrilTaylor/dev.theme.compact.margin
narrow down the margin of ssh tab to 5px with theme compact
2020-01-14 09:25:12 +01:00
Cyril Taylor
8201e0b9ef set userData location to the 'data' folder which at the same level as the Terminus executable directory if exist with portable mode 2020-01-14 15:06:54 +08:00
Cyril Taylor
6293a43571 narrow down the margin of ssh tab to 5px with theme compact 2020-01-14 11:34:52 +08:00
Eugene
b61bc943ec Merge pull request #1989 from Eugeny/all-contributors/add-CyrilTaylor
docs: add CyrilTaylor as a contributor
2020-01-13 12:27:47 +01:00
allcontributors[bot]
be668403c5 docs: update .all-contributorsrc [skip ci] 2020-01-13 11:27:32 +00:00
allcontributors[bot]
90a173d8b7 docs: update README.md [skip ci] 2020-01-13 11:27:31 +00:00
Eugene
bbcc84e9b0 1. Fit the shell integration with windos registry style 2. Add… (#1986)
1. Fit the shell integration with windos registry style 2. Add folder context menu with Terminus
2020-01-13 12:27:13 +01:00
Cyril Taylor
b0a8832499 remove old entry for windows shell integration 2020-01-13 19:07:03 +08:00
Eugene
8cd1c4a9af Update sshTab.component.ts 2020-01-13 11:53:28 +01:00
Cyril Taylor
1ada4338b7 1. Fit the shell integration with windos registry style 2. Add folder context menu with Terminus 2020-01-13 14:08:58 +08:00
dependabot-preview[bot]
4a701fa7b4 Bump css-loader from 3.4.1 to 3.4.2
Bumps [css-loader](https://github.com/webpack-contrib/css-loader) from 3.4.1 to 3.4.2.
- [Release notes](https://github.com/webpack-contrib/css-loader/releases)
- [Changelog](https://github.com/webpack-contrib/css-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/css-loader/compare/v3.4.1...v3.4.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-13 04:25:02 +00:00
dependabot-preview[bot]
b718448904 Bump eslint-plugin-import from 2.19.1 to 2.20.0
Bumps [eslint-plugin-import](https://github.com/benmosher/eslint-plugin-import) from 2.19.1 to 2.20.0.
- [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.19.1...v2.20.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-13 04:24:11 +00:00
Eugene
7770cf2573 Bump core-js from 3.6.1 to 3.6.3 in /terminus-core (#1978)
Bump core-js from 3.6.1 to 3.6.3 in /terminus-core
2020-01-11 14:13:50 +01:00
dependabot-preview[bot]
49755f855f Bump core-js from 3.6.1 to 3.6.3 in /terminus-core
Bumps [core-js](https://github.com/zloirock/core-js) from 3.6.1 to 3.6.3.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/v3.6.1...v3.6.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-11 13:12:40 +00:00
Eugene
daa1b4572e Bump node-gyp from 6.0.1 to 6.1.0 (#1968)
Bump node-gyp from 6.0.1 to 6.1.0
2020-01-11 14:11:22 +01:00
Eugene
d48e22a9d2 Bump slug from 2.0.0 to 2.1.0 in /terminus-terminal (#1947)
Bump slug from 2.0.0 to 2.1.0 in /terminus-terminal
2020-01-11 14:08:30 +01:00
Eugene
fc82010729 Bump @types/webpack-env from 1.14.1 to 1.15.0 (#1961)
Bump @types/webpack-env from 1.14.1 to 1.15.0
2020-01-11 14:08:17 +01:00
Eugene
4a8f3fbd7f Bump core-js from 3.6.1 to 3.6.2 in /terminus-core (#1965)
Bump core-js from 3.6.1 to 3.6.2 in /terminus-core
2020-01-11 14:08:05 +01:00
Eugene
4c435672a5 Bump core-js from 3.6.1 to 3.6.2 (#1963)
Bump core-js from 3.6.1 to 3.6.2
2020-01-11 14:07:44 +01:00
Eugene
0311754ce0 Bump css-loader from 3.4.0 to 3.4.1 (#1960)
Bump css-loader from 3.4.0 to 3.4.1
2020-01-11 14:07:30 +01:00
Eugene
ff5da104c1 Bump @typescript-eslint/parser from 2.14.0 to 2.15.0 (#1962)
Bump @typescript-eslint/parser from 2.14.0 to 2.15.0
2020-01-11 14:07:12 +01:00
Eugene
b01b902829 Bump typedoc from 0.15.6 to 0.15.7 (#1975)
Bump typedoc from 0.15.6 to 0.15.7
2020-01-11 14:06:45 +01:00
Eugene
595707eed4 Bump axios from 0.19.0 to 0.19.1 in /terminus-core (#1969)
Bump axios from 0.19.0 to 0.19.1 in /terminus-core
2020-01-11 14:06:35 +01:00
Eugene
441ee4fb6e Bump axios from 0.19.0 to 0.19.1 in /terminus-plugin-manager (#1970)
Bump axios from 0.19.0 to 0.19.1 in /terminus-plugin-manager
2020-01-11 14:06:20 +01:00
dependabot-preview[bot]
51827d6750 Bump typedoc from 0.15.6 to 0.15.7
Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.15.6 to 0.15.7.
- [Release notes](https://github.com/TypeStrong/TypeDoc/releases)
- [Commits](https://github.com/TypeStrong/TypeDoc/compare/v0.15.6...v0.15.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-10 04:23:31 +00:00
dependabot-preview[bot]
9807bbe32a Bump axios from 0.19.0 to 0.19.1 in /terminus-plugin-manager
Bumps [axios](https://github.com/axios/axios) from 0.19.0 to 0.19.1.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.19.0...0.19.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-08 04:25:18 +00:00
dependabot-preview[bot]
181b55890d Bump axios from 0.19.0 to 0.19.1 in /terminus-core
Bumps [axios](https://github.com/axios/axios) from 0.19.0 to 0.19.1.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.19.0...0.19.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-08 04:25:09 +00:00
dependabot-preview[bot]
c8c5f1a0fd Bump node-gyp from 6.0.1 to 6.1.0
Bumps [node-gyp](https://github.com/nodejs/node-gyp) from 6.0.1 to 6.1.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.0.1...v6.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-08 04:24:57 +00:00
dependabot-preview[bot]
222c6a9f3c Bump core-js from 3.6.1 to 3.6.2 in /terminus-core
Bumps [core-js](https://github.com/zloirock/core-js) from 3.6.1 to 3.6.2.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/v3.6.1...v3.6.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-07 04:25:23 +00:00
dependabot-preview[bot]
0400c8fe63 Bump core-js from 3.6.1 to 3.6.2
Bumps [core-js](https://github.com/zloirock/core-js) from 3.6.1 to 3.6.2.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/v3.6.1...v3.6.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-07 04:22:18 +00:00
dependabot-preview[bot]
099d9b06d6 Bump @typescript-eslint/parser from 2.14.0 to 2.15.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 2.14.0 to 2.15.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.15.0/packages/parser)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-07 04:21:51 +00:00
dependabot-preview[bot]
ad26b39cca Bump @types/webpack-env from 1.14.1 to 1.15.0
Bumps [@types/webpack-env](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/webpack-env) from 1.14.1 to 1.15.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/webpack-env)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-06 04:24:44 +00:00
dependabot-preview[bot]
f465c359ef Bump css-loader from 3.4.0 to 3.4.1
Bumps [css-loader](https://github.com/webpack-contrib/css-loader) from 3.4.0 to 3.4.1.
- [Release notes](https://github.com/webpack-contrib/css-loader/releases)
- [Changelog](https://github.com/webpack-contrib/css-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/css-loader/compare/v3.4.0...v3.4.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-06 04:24:25 +00:00
Eugene Pankov
67aead225c Merge branch 'master' of github.com:Eugeny/terminus 2020-01-03 18:40:46 +01:00
Eugene Pankov
280c421ae4 use node-sshpk for better key parsing (fixes #1956, fixes #1612, fixes #1191, fixes #1788, fixes #1300) 2020-01-03 18:40:43 +01:00
Eugene
b6fc43faa2 Bump yargs from 15.0.2 to 15.1.0 in /app (#1953)
Bump yargs from 15.0.2 to 15.1.0 in /app
2020-01-03 16:14:31 +01:00
Eugene Pankov
b5a985b8a3 ui tweaks 2020-01-03 16:11:31 +01:00
Eugene Pankov
2f7dcf3339 made x11 forwarding configurable (fixes #1950, fixes #1954) 2020-01-03 16:04:30 +01:00
dependabot-preview[bot]
7e38f11c06 Bump yargs from 15.0.2 to 15.1.0 in /app
Bumps [yargs](https://github.com/yargs/yargs) from 15.0.2 to 15.1.0.
- [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.0.2...v15.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-03 04:24:28 +00:00
Eugene Pankov
86cd560089 disabled electron-updater on Linux 2020-01-02 12:22:56 +01:00
dependabot-preview[bot]
c0c4580461 Bump slug from 2.0.0 to 2.1.0 in /terminus-terminal
Bumps [slug](https://github.com/Trott/node-slug) from 2.0.0 to 2.1.0.
- [Release notes](https://github.com/Trott/node-slug/releases)
- [Changelog](https://github.com/Trott/node-slug/blob/master/CHANGELOG)
- [Commits](https://github.com/Trott/node-slug/compare/v2.0.0...v2.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-01 04:23:06 +00:00
Eugene
5cb65dfd84 Bump bootstrap from 4.3.1 to 4.4.1 in /terminus-core (#1841)
Bump bootstrap from 4.3.1 to 4.4.1 in /terminus-core
2020-01-01 01:09:05 +01:00
Eugene Pankov
2b5f623b50 profile and SSH connection colors (fixes #954) 2020-01-01 01:04:41 +01:00
Eugene Pankov
a8d5cf469e ui fixes 2020-01-01 01:04:25 +01:00
Eugene Pankov
d261b89803 added notifications for tab activity (fixes #1123) 2019-12-31 23:38:27 +01:00
Eugene Pankov
21cb452d62 fixed terminal not getting focus when switching windows (fixes #692) 2019-12-31 23:20:07 +01:00
Eugene Pankov
b07a2113d2 ssh: added a reconnect button (fixes #761) 2019-12-31 23:12:08 +01:00
Eugene Pankov
f545b3eacf mention Zmodem in README 2019-12-31 22:51:58 +01:00
Eugene Pankov
87fe8deaa8 apis 2019-12-31 22:48:36 +01:00
Eugene Pankov
1068450ddd performance improv 2019-12-31 22:30:05 +01:00
Eugene Pankov
b355fff0f8 added a shortcut to maximize a pane (fixes #819) 2019-12-31 21:53:36 +01:00
Eugene
f80b0eb65b Bump rxjs from 6.5.3 to 6.5.4 in /app (#1934)
Bump rxjs from 6.5.3 to 6.5.4 in /app
2019-12-31 20:16:49 +01:00
dependabot-preview[bot]
285691326f Bump rxjs from 6.5.3 to 6.5.4 in /app
Bumps [rxjs](https://github.com/reactivex/rxjs) from 6.5.3 to 6.5.4.
- [Release notes](https://github.com/reactivex/rxjs/releases)
- [Changelog](https://github.com/ReactiveX/rxjs/blob/6.5.4/CHANGELOG.md)
- [Commits](https://github.com/reactivex/rxjs/compare/6.5.3...6.5.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-12-31 19:15:39 +00:00
Eugene
3ecffbfda6 Bump typescript from 3.7.3 to 3.7.4 (#1939)
Bump typescript from 3.7.3 to 3.7.4
2019-12-31 20:14:36 +01:00
Eugene
3d89a15d18 Bump rxjs-compat from 6.5.3 to 6.5.4 in /app (#1936)
Bump rxjs-compat from 6.5.3 to 6.5.4 in /app
2019-12-31 20:14:17 +01:00
dependabot-preview[bot]
491d4c3b3a Bump typescript from 3.7.3 to 3.7.4
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 3.7.3 to 3.7.4.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-12-31 19:13:57 +00:00
Eugene
995f329835 Bump @fortawesome/fontawesome-free from 5.11.2 to 5.12.0 (#1937)
Bump @fortawesome/fontawesome-free from 5.11.2 to 5.12.0
2019-12-31 20:13:19 +01:00
Eugene
28f2ea595d Bump style-loader from 1.0.1 to 1.1.2 (#1938)
Bump style-loader from 1.0.1 to 1.1.2
2019-12-31 20:12:34 +01:00
Eugene
42b7c573ea Bump @typescript-eslint/parser from 2.13.0 to 2.14.0 (#1945)
Bump @typescript-eslint/parser from 2.13.0 to 2.14.0
2019-12-31 20:12:05 +01:00
Eugene Pankov
c40294628a zmodem support (fixes #693) 2019-12-31 20:10:37 +01:00
Eugene Pankov
c11a10144e ssh: stow away the ports button (fixes #1932) 2019-12-31 13:27:34 +01:00
Eugene Pankov
7b6cdb274c fixed shell process not being killed on tab close 2019-12-31 13:01:37 +01:00
dependabot-preview[bot]
a3c74ecdba Bump @typescript-eslint/parser from 2.13.0 to 2.14.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 2.13.0 to 2.14.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.14.0/packages/parser)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-12-31 04:24:07 +00:00
Eugene Pankov
94d91f8182 reset split ratio on double click (fixes #1377) 2019-12-30 18:42:50 +01:00
Eugene Pankov
e4f32c9ade fixed split tab spanner width (fixes #1676) 2019-12-30 18:24:14 +01:00
dependabot-preview[bot]
65fd7b05b1 Bump style-loader from 1.0.1 to 1.1.2
Bumps [style-loader](https://github.com/webpack-contrib/style-loader) from 1.0.1 to 1.1.2.
- [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.0.1...v1.1.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-12-30 04:24:12 +00:00
dependabot-preview[bot]
2150fab55b Bump @fortawesome/fontawesome-free from 5.11.2 to 5.12.0
Bumps [@fortawesome/fontawesome-free](https://github.com/FortAwesome/Font-Awesome) from 5.11.2 to 5.12.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.11.2...5.12.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-12-30 04:23:42 +00:00
dependabot-preview[bot]
644cb76fd3 Bump rxjs-compat from 6.5.3 to 6.5.4 in /app
Bumps rxjs-compat from 6.5.3 to 6.5.4.

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-12-30 04:23:22 +00:00
dependabot-preview[bot]
87837bf66b Bump bootstrap from 4.3.1 to 4.4.1 in /terminus-core
Bumps [bootstrap](https://github.com/twbs/bootstrap) from 4.3.1 to 4.4.1.
- [Release notes](https://github.com/twbs/bootstrap/releases)
- [Commits](https://github.com/twbs/bootstrap/compare/v4.3.1...v4.4.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-11-29 04:38:02 +00:00
199 changed files with 7037 additions and 2547 deletions

View File

@@ -234,6 +234,34 @@
"contributions": [ "contributions": [
"code" "code"
] ]
},
{
"login": "CyrilTaylor",
"name": "Cyril Taylor",
"avatar_url": "https://avatars0.githubusercontent.com/u/12631466?v=4",
"profile": "https://github.com/CyrilTaylor",
"contributions": [
"code"
]
},
{
"login": "nstefanou",
"name": "nstefanou",
"avatar_url": "https://avatars3.githubusercontent.com/u/51129173?v=4",
"profile": "https://github.com/nstefanou",
"contributions": [
"code",
"plugin"
]
},
{
"login": "orin220444",
"name": "orin220444",
"avatar_url": "https://avatars3.githubusercontent.com/u/30747229?v=4",
"profile": "https://github.com/orin220444",
"contributions": [
"code"
]
} }
], ],
"contributorsPerLine": 7, "contributorsPerLine": 7,

View File

@@ -79,6 +79,7 @@ rules:
args: after-used args: after-used
argsIgnorePattern: ^_ argsIgnorePattern: ^_
no-undef: error no-undef: error
no-var: error
object-curly-spacing: object-curly-spacing:
- error - error
- always - always
@@ -98,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

@@ -11,7 +11,7 @@ jobs:
- name: Installing Node - name: Installing Node
uses: actions/setup-node@v1 uses: actions/setup-node@v1
with: with:
version: 10 node-version: 10
- name: Build - name: Build
run: | run: |

View File

@@ -11,7 +11,7 @@ jobs:
- name: Installing Node - name: Installing Node
uses: actions/setup-node@v1 uses: actions/setup-node@v1
with: with:
version: 10 node-version: 10
- name: Install deps - name: Install deps
run: | run: |

View File

@@ -11,7 +11,7 @@ jobs:
- name: Install Node - name: Install Node
uses: actions/setup-node@v1 uses: actions/setup-node@v1
with: with:
version: 10 node-version: 10
- name: Install deps - name: Install deps
run: | run: |
@@ -25,9 +25,6 @@ jobs:
- name: Build native deps - name: Build native deps
run: scripts/build-native.js run: scripts/build-native.js
- name: Build typings
run: yarn run build:typings
- name: Webpack - name: Webpack
run: yarn run build run: yarn run build

View File

@@ -11,7 +11,7 @@ jobs:
- name: Installing Node - name: Installing Node
uses: actions/setup-node@v1 uses: actions/setup-node@v1
with: with:
version: 10 node-version: 10
- name: Install deps - name: Install deps
run: | run: |
@@ -25,9 +25,6 @@ jobs:
- name: Build native deps - name: Build native deps
run: scripts/build-native.js run: scripts/build-native.js
- name: Build typings
run: yarn run build:typings
- name: Webpack - name: Webpack
run: yarn run build run: yarn run build
@@ -38,7 +35,7 @@ jobs:
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'
env: env:
DEBUG: electron-builder,electron-builder:* #DEBUG: electron-builder,electron-builder:*
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 }}

View File

@@ -11,7 +11,7 @@ jobs:
- name: Installing Node - name: Installing Node
uses: actions/setup-node@v1 uses: actions/setup-node@v1
with: with:
version: 10 node-version: 10
- name: Build - name: Build
shell: powershell shell: powershell
@@ -39,7 +39,7 @@ jobs:
mkdir artifact-setup mkdir artifact-setup
mv dist/*-setup.exe artifact-setup/ mv dist/*-setup.exe artifact-setup/
mkdir artifact-portable mkdir artifact-portable
mv dist/*-portable.exe artifact-portable/ mv dist/*-portable.zip artifact-portable/
- uses: actions/upload-artifact@master - uses: actions/upload-artifact@master
name: Upload installer name: Upload installer

View File

@@ -13,12 +13,13 @@
**Terminus** is a highly configurable terminal emulator for Windows, macOS and Linux **Terminus** is a highly configurable terminal emulator for Windows, macOS and Linux
* Integrated SSH client and connection manager
* Theming and color schemes * Theming and color schemes
* Fully configurable shortcuts * Fully configurable shortcuts
* Split panes * Split panes
* Remembers your tabs * Remembers your tabs
* PowerShell (and PS Core), WSL, Git-Bash, Cygwin, Cmder and CMD support * PowerShell (and PS Core), WSL, Git-Bash, Cygwin, Cmder and CMD support
* Integrated SSH client and connection manager * Direct file transfer from/to SSH sessions via Zmodem
* Full Unicode support including double-width characters * Full Unicode support including double-width characters
* Doesn't choke on fast-flowing outputs * Doesn't choke on fast-flowing outputs
* Proper shell experience on Windows including tab completion (via Clink) * Proper shell experience on Windows including tab completion (via Clink)
@@ -34,12 +35,15 @@
--- ---
# Portable
For portable in windows, user can create folder `data` at the same directory as `Terminal.exe` to save the settings.
# Plugins # Plugins
Plugins and themes can be installed directly from the Settings view inside Terminus. Plugins and themes can be installed directly from the Settings view inside Terminus.
* [clickable-links](https://github.com/Eugeny/terminus-clickable-links) - makes paths and URLs in the terminal clickable * [clickable-links](https://github.com/Eugeny/terminus-clickable-links) - makes paths and URLs in the terminal clickable
* [shell-selector](https://github.com/Eugeny/terminus-shell-selector) - a quick shell selector pane
* [title-control](https://github.com/kbjr/terminus-title-control) - allows modifying the title of the terminal tabs by providing a prefix, suffix, and/or strings to be removed * [title-control](https://github.com/kbjr/terminus-title-control) - allows modifying the title of the terminal tabs by providing a prefix, suffix, and/or strings to be removed
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - quickly send commands to one or all terminal tabs * [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - quickly send commands to one or all terminal tabs
* [save-output](https://github.com/Eugeny/terminus-save-output) - record terminal output into a file * [save-output](https://github.com/Eugeny/terminus-save-output) - record terminal output into a file
@@ -101,6 +105,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<td align="center"><a href="https://chriskaczor.com"><img src="https://avatars2.githubusercontent.com/u/180906?v=4" width="100px;" alt=""/><br /><sub><b>Chris Kaczor</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=ckaczor" title="Code">💻</a></td> <td align="center"><a href="https://chriskaczor.com"><img src="https://avatars2.githubusercontent.com/u/180906?v=4" width="100px;" alt=""/><br /><sub><b>Chris Kaczor</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=ckaczor" title="Code">💻</a></td>
<td align="center"><a href="https://www.boxmein.net"><img src="https://avatars1.githubusercontent.com/u/358714?v=4" width="100px;" alt=""/><br /><sub><b>Johannes Kadak</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=boxmein" title="Code">💻</a></td> <td align="center"><a href="https://www.boxmein.net"><img src="https://avatars1.githubusercontent.com/u/358714?v=4" width="100px;" alt=""/><br /><sub><b>Johannes Kadak</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=boxmein" 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/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/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>
</table> </table>

View File

@@ -8,17 +8,15 @@ 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
.terminus-logo .terminus-logo
h1.terminus-title Terminus h1.terminus-title Terminus
sup α sup α
.progress .progress
.bar(style='width: 0%') .bar(style='width: 0%')

View File

@@ -1,4 +1,5 @@
import { app, ipcMain, Menu, Tray, shell } from 'electron' import { app, ipcMain, Menu, Tray, shell, globalShortcut } from 'electron'
// 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'
import { Window, WindowOptions } from './window' import { Window, WindowOptions } from './window'
@@ -8,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()
@@ -23,13 +33,14 @@ export class Application {
app.commandLine.appendSwitch('disable-http-cache') app.commandLine.appendSwitch('disable-http-cache')
app.commandLine.appendSwitch('lang', 'EN') app.commandLine.appendSwitch('lang', 'EN')
app.allowRendererProcessReuse = false
for (const flag of configData.flags || [['force_discrete_gpu', '0']]) { for (const flag of configData.flags || [['force_discrete_gpu', '0']]) {
app.commandLine.appendSwitch(flag[0], flag[1]) app.commandLine.appendSwitch(flag[0], flag[1])
} }
} }
init () { init (): void {
electron.screen.on('display-metrics-changed', () => this.broadcast('host:display-metrics-changed')) electron.screen.on('display-metrics-changed', () => this.broadcast('host:display-metrics-changed'))
} }
@@ -43,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()
} }
@@ -50,20 +64,38 @@ export class Application {
return window return window
} }
broadcast (event, ...args) { 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) { for (let window of this.windows) {
window.present()
}
}
broadcast (event: string, ...args): void {
for (const window of this.windows) {
window.send(event, ...args) window.send(event, ...args)
} }
} }
async send (event, ...args) { async send (event: string, ...args): Promise<void> {
if (!this.hasWindows()) { if (!this.hasWindows()) {
await this.newWindow() await this.newWindow()
} }
this.windows.filter(w => !w.isDestroyed())[0].send(event, ...args) this.windows.filter(w => !w.isDestroyed())[0].send(event, ...args)
} }
enableTray () { enableTray (): void {
if (this.tray) { if (this.tray) {
return return
} }
@@ -74,7 +106,7 @@ export class Application {
this.tray = new Tray(`${app.getAppPath()}/assets/tray.png`) this.tray = new Tray(`${app.getAppPath()}/assets/tray.png`)
} }
this.tray.on('click', () => setTimeout(() => this.focus())); this.tray.on('click', () => setTimeout(() => this.focus()))
const contextMenu = Menu.buildFromTemplate([{ const contextMenu = Menu.buildFromTemplate([{
label: 'Show', label: 'Show',
@@ -88,18 +120,18 @@ export class Application {
this.tray.setToolTip(`Terminus ${app.getVersion()}`) this.tray.setToolTip(`Terminus ${app.getVersion()}`)
} }
disableTray () { disableTray (): void {
if (this.tray) { if (this.tray) {
this.tray.destroy() this.tray.destroy()
this.tray = null this.tray = null
} }
} }
hasWindows () { hasWindows (): boolean {
return !!this.windows.length return !!this.windows.length
} }
focus () { focus (): void {
for (let window of this.windows) { for (let window of this.windows) {
window.show() window.show()
} }
@@ -185,7 +217,7 @@ export class Application {
}, },
}, },
], ],
} },
] ]
Menu.setApplicationMenu(Menu.buildFromTemplate(template)) Menu.setApplicationMenu(Menu.buildFromTemplate(template))

View File

@@ -1,6 +1,6 @@
import { app } from 'electron' import { app } from 'electron'
export function parseArgs (argv, cwd) { export function parseArgs (argv: string[], cwd: string): any {
if (argv[0].includes('node')) { if (argv[0].includes('node')) {
argv = argv.slice(1) argv = argv.slice(1)
} }
@@ -20,25 +20,25 @@ export function parseArgs (argv, cwd) {
return yargs.option('escape', { return yargs.option('escape', {
alias: 'e', alias: 'e',
type: 'boolean', type: 'boolean',
describe: 'Perform shell escaping' describe: 'Perform shell escaping',
}).positional('text', { }).positional('text', {
type: 'string' type: 'string',
}) })
}) })
.version('version', '', app.getVersion()) .version('version', '', app.getVersion())
.option('debug', { .option('debug', {
alias: 'd', alias: 'd',
describe: 'Show DevTools on start', describe: 'Show DevTools on start',
type: 'boolean' type: 'boolean',
}) })
.option('hidden', { .option('hidden', {
describe: 'Start minimized', describe: 'Start minimized',
type: 'boolean' type: 'boolean',
}) })
.option('version', { .option('version', {
alias: 'v', alias: 'v',
describe: 'Show version and exit', describe: 'Show version and exit',
type: 'boolean' type: 'boolean',
}) })
.help('help') .help('help')
.parse(argv.slice(1)) .parse(argv.slice(1))

View File

@@ -1,3 +1,4 @@
import './portable'
import './sentry' import './sentry'
import './lru' import './lru'
import { app, ipcMain, Menu } from 'electron' import { app, ipcMain, Menu } from 'electron'
@@ -33,6 +34,7 @@ process.on('uncaughtException' as any, err => {
}) })
app.on('second-instance', (_event, argv, cwd) => { app.on('second-instance', (_event, argv, cwd) => {
application.presentAllWindows()
application.send('host:second-instance', parseArgs(argv, cwd), cwd) application.send('host:second-instance', parseArgs(argv, cwd), cwd)
}) })
@@ -58,8 +60,8 @@ app.on('ready', () => {
label: 'New window', label: 'New window',
click () { click () {
this.app.newWindow() this.app.newWindow()
} },
} },
])) ]))
} }
application.init() application.init()

View File

@@ -1,13 +1,15 @@
let lru = require('lru-cache')({ max: 256, maxAge: 250 }) import * as createLRU from 'lru-cache'
import * as fs from 'fs'
let fs = require('fs') const lru = createLRU({ max: 256, maxAge: 250 })
let origLstat = fs.realpathSync.bind(fs) const origLstat = fs.realpathSync.bind(fs)
// NB: The biggest offender of thrashing realpathSync is the node module system // NB: The biggest offender of thrashing realpathSync is the node module system
// itself, which we can't get into via any sane means. // itself, which we can't get into via any sane means.
require('fs').realpathSync = function (p) { require('fs').realpathSync = function (p) {
let r = lru.get(p) let r = lru.get(p)
if (r) return r if (r) {
return r
}
r = origLstat(p) r = origLstat(p)
lru.set(p, r) lru.set(p, r)

24
app/lib/portable.ts Executable file
View File

@@ -0,0 +1,24 @@
import * as path from 'path'
import * as fs from 'fs'
let appPath: string | null = null
try {
appPath = path.dirname(require('electron').app.getPath('exe'))
} catch {
appPath = path.dirname(require('electron').remote.app.getPath('exe'))
}
if (null != appPath) {
if(fs.existsSync(path.join(appPath, 'terminus-data'))) {
fs.renameSync(path.join(appPath, 'terminus-data'), path.join(appPath, 'data'))
}
const portableData = path.join(appPath, 'data')
if (fs.existsSync(portableData)) {
console.log('reset user data to ' + portableData)
try {
require('electron').app.setPath('userData', portableData)
} catch {
require('electron').remote.app.setPath('userData', portableData)
}
}
}

17
app/lib/sentry.ts Normal file → Executable file
View File

@@ -1,4 +1,5 @@
const { init } = process.type === 'main' ? require('@sentry/electron/dist/main') : require('@sentry/electron/dist/renderer') const { init } = process.type === 'main' ? require('@sentry/electron/dist/main') : require('@sentry/electron/dist/renderer')
import * as isDev from 'electron-is-dev'
const SENTRY_DSN = 'https://4717a0a7ee0b4429bd3a0f06c3d7eec3@sentry.io/181876' const SENTRY_DSN = 'https://4717a0a7ee0b4429bd3a0f06c3d7eec3@sentry.io/181876'
@@ -9,10 +10,12 @@ try {
release = require('electron').remote.app.getVersion() release = require('electron').remote.app.getVersion()
} }
init({ if (!isDev) {
dsn: SENTRY_DSN, init({
release, dsn: SENTRY_DSN,
integrations (integrations) { release,
return integrations.filter(integration => integration.name !== 'Breadcrumbs') integrations (integrations) {
}, return integrations.filter(integration => integration.name !== 'Breadcrumbs')
}) },
})
}

View File

@@ -1,6 +1,6 @@
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'
@@ -23,15 +23,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 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 || {}
@@ -48,6 +53,7 @@ export class Window {
webPreferences: { webPreferences: {
nodeIntegration: true, nodeIntegration: true,
preload: path.join(__dirname, 'sentry.js'), preload: path.join(__dirname, 'sentry.js'),
backgroundThrottling: false,
}, },
frame: false, frame: false,
show: false, show: false,
@@ -56,18 +62,18 @@ export class Window {
if (this.windowBounds) { if (this.windowBounds) {
Object.assign(bwOptions, this.windowBounds) Object.assign(bwOptions, this.windowBounds)
const closestDisplay = screen.getDisplayNearestPoint( {x: this.windowBounds.x, y: this.windowBounds.y} ) const closestDisplay = screen.getDisplayNearestPoint( { x: this.windowBounds.x, y: this.windowBounds.y } )
const [left1, top1, right1, bottom1] = [this.windowBounds.x, this.windowBounds.y, this.windowBounds.x + this.windowBounds.width, this.windowBounds.y + this.windowBounds.height]; const [left1, top1, right1, bottom1] = [this.windowBounds.x, this.windowBounds.y, this.windowBounds.x + this.windowBounds.width, this.windowBounds.y + this.windowBounds.height]
const [left2, top2, right2, bottom2] = [closestDisplay.bounds.x, closestDisplay.bounds.y, closestDisplay.bounds.x + closestDisplay.bounds.width, closestDisplay.bounds.y + closestDisplay.bounds.height]; const [left2, top2, right2, bottom2] = [closestDisplay.bounds.x, closestDisplay.bounds.y, closestDisplay.bounds.x + closestDisplay.bounds.width, closestDisplay.bounds.y + closestDisplay.bounds.height]
if ((left2 > right1 || right2 < left1 || top2 > bottom1 || bottom2 < top1) && !maximized) { if ((left2 > right1 || right2 < left1 || top2 > bottom1 || bottom2 < top1) && !maximized) {
bwOptions.x = closestDisplay.bounds.width / 2 - bwOptions.width / 2; bwOptions.x = closestDisplay.bounds.width / 2 - bwOptions.width / 2
bwOptions.y = closestDisplay.bounds.height / 2 - bwOptions.height / 2; bwOptions.y = closestDisplay.bounds.height / 2 - bwOptions.height / 2
} }
} }
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') {
@@ -83,7 +89,7 @@ export class Window {
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)
} }
@@ -116,12 +122,13 @@ export class Window {
}) })
} }
setVibrancy (enabled: boolean, type?: string) { setVibrancy (enabled: boolean, type?: string): void {
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 let attribValue = AccentState.ACCENT_DISABLED
if (enabled) { if (enabled) {
if (parseInt(os.release().split('.')[2]) >= 17063 && type === 'fluent') { if (type === 'fluent') {
attribValue = AccentState.ACCENT_ENABLE_ACRYLICBLURBEHIND attribValue = AccentState.ACCENT_ENABLE_ACRYLICBLURBEHIND
} else { } else {
attribValue = AccentState.ACCENT_ENABLE_BLURBEHIND attribValue = AccentState.ACCENT_ENABLE_BLURBEHIND
@@ -131,26 +138,65 @@ export class Window {
} else { } else {
DwmEnableBlurBehindWindow(this.window, enabled) DwmEnableBlurBehindWindow(this.window, enabled)
} }
} else {
this.window.setVibrancy(enabled ? 'dark' : null as any) // electron issue 20269
} }
} }
show () { show (): void {
this.window.show() this.window.show()
} }
focus () { focus (): void {
this.window.focus() this.window.focus()
} }
send (event, ...args) { send (event: string, ...args): void {
if (!this.window) { if (!this.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 () { 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 {
// docked, visible
this.window.hide()
}
}
} }
private setupWindowManagement () { private setupWindowManagement () {
@@ -202,6 +248,10 @@ export class Window {
} }
}) })
this.window.on('focus', () => {
this.send('host:window-focused')
})
ipcMain.on('window-focus', event => { ipcMain.on('window-focus', event => {
if (!this.window || event.sender !== this.window.webContents) { if (!this.window || event.sender !== this.window.webContents) {
return return
@@ -289,10 +339,35 @@ export class Window {
}) })
this.window.webContents.on('new-window', event => event.preventDefault()) this.window.webContents.on('new-window', event => event.preventDefault())
ipcMain.on('window-set-disable-vibrancy-while-dragging', (_event, value) => {
this.disableVibrancyWhileDragging = value
})
this.window.on('will-move', () => {
if (!this.lastVibrancy?.enabled || !this.disableVibrancyWhileDragging) {
return
}
let timeout: number|null = null
const oldVibrancy = this.lastVibrancy
this.setVibrancy(false)
const onMove = () => {
if (timeout) {
clearTimeout(timeout)
}
timeout = setTimeout(() => {
this.window.off('move', onMove)
this.setVibrancy(oldVibrancy.enabled, oldVibrancy.type)
}, 500)
}
this.window.on('move', onMove)
})
} }
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,34 +13,35 @@
"watch": "webpack --progress --color --watch" "watch": "webpack --progress --color --watch"
}, },
"dependencies": { "dependencies": {
"@angular/animations": "7.2.8", "@angular/animations": "9.1.0",
"@angular/common": "7.2.8", "@angular/common": "9.1.2",
"@angular/compiler": "7.2.8", "@angular/compiler": "9.1.2",
"@angular/core": "7.2.8", "@angular/core": "9.1.2",
"@angular/forms": "7.2.8", "@angular/forms": "9.1.1",
"@angular/platform-browser": "7.2.8", "@angular/platform-browser": "9.1.1",
"@angular/platform-browser-dynamic": "7.2.8", "@angular/platform-browser-dynamic": "9.1.2",
"@ng-bootstrap/ng-bootstrap": "^4.2.2", "@ng-bootstrap/ng-bootstrap": "^6.0.2",
"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.0", "electron-updater": "^4.3.0",
"fontmanager-redux": "0.4.0", "fontmanager-redux": "0.4.0",
"js-yaml": "3.13.1", "js-yaml": "3.13.1",
"keytar": "^5.0.0", "keytar": "^5.5.0",
"mz": "^2.7.0", "mz": "^2.7.0",
"ngx-toastr": "^10.2.0", "ngx-toastr": "^12.0.1",
"node-pty": "^0.10.0-beta2", "node-pty": "^0.10.0-beta8",
"npm": "6.9.0", "npm": "6.9.0",
"path": "0.12.7", "path": "0.12.7",
"rxjs": "^6.5.3", "rxjs": "^6.5.5",
"rxjs-compat": "^6.5.3", "rxjs-compat": "^6.5.5",
"yargs": "^15.0.2", "yargs": "^15.3.1",
"zone.js": "^0.8.29" "zone.js": "^0.10.3"
}, },
"optionalDependencies": { "optionalDependencies": {
"macos-native-processlist": "^1.0.2", "macos-native-processlist": "^1.0.2",
"serialport": "^8.0.7",
"windows-blurbehind": "^1.0.1", "windows-blurbehind": "^1.0.1",
"windows-native-registry": "^1.0.17", "windows-native-registry": "^1.0.17",
"windows-process-tree": "^0.2.4", "windows-process-tree": "^0.2.4",
@@ -49,6 +50,6 @@
"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.13.0" "node-abi": "^2.15.0"
} }
} }

View File

@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { NgModule } from '@angular/core' import { NgModule } from '@angular/core'
import { BrowserModule } from '@angular/platform-browser' import { BrowserModule } from '@angular/platform-browser'
import { NgbModule } from '@ng-bootstrap/ng-bootstrap' import { NgbModule } from '@ng-bootstrap/ng-bootstrap'
@@ -7,7 +8,7 @@ export function getRootModule (plugins: any[]) {
const imports = [ const imports = [
BrowserModule, BrowserModule,
...plugins, ...plugins,
NgbModule.forRoot(), NgbModule,
ToastrModule.forRoot({ ToastrModule.forRoot({
positionClass: 'toast-bottom-center', positionClass: 'toast-bottom-center',
toastClass: 'toast', toastClass: 'toast',

View File

@@ -7,7 +7,8 @@ import * as isDev from 'electron-is-dev'
import './global.scss' import './global.scss'
import './toastr.scss' import './toastr.scss'
import { enableProdMode, NgModuleRef } from '@angular/core' import { enableProdMode, NgModuleRef, ApplicationRef } from '@angular/core'
import { enableDebugTools } from '@angular/platform-browser'
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic' import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'
import { getRootModule } from './app.module' import { getRootModule } from './app.module'
@@ -37,7 +38,14 @@ async function bootstrap (plugins: PluginInfo[], safeMode = false): Promise<NgMo
}) })
const module = getRootModule(pluginsModules) const module = getRootModule(pluginsModules)
window['rootModule'] = module window['rootModule'] = module
return platformBrowserDynamic().bootstrapModule(module) return platformBrowserDynamic().bootstrapModule(module).then(moduleRef => {
if (isDev) {
const applicationRef = moduleRef.injector.get(ApplicationRef)
const componentRef = applicationRef.components[0]
enableDebugTools(componentRef)
}
return moduleRef
})
} }
findPlugins().then(async plugins => { findPlugins().then(async plugins => {

View File

@@ -21,8 +21,7 @@ if (process.env.TERMINUS_DEV) {
const builtinPluginsPath = process.env.TERMINUS_DEV ? path.dirname(require('electron').remote.app.getAppPath()) : path.join((process as any).resourcesPath, 'builtin-plugins') const builtinPluginsPath = process.env.TERMINUS_DEV ? path.dirname(require('electron').remote.app.getAppPath()) : path.join((process as any).resourcesPath, 'builtin-plugins')
const userPluginsPath = path.join( const userPluginsPath = path.join(
require('electron').remote.app.getPath('appData'), require('electron').remote.app.getPath('userData'),
'terminus',
'plugins', 'plugins',
) )

View File

@@ -2,61 +2,111 @@
# yarn lockfile v1 # yarn lockfile v1
"@angular/animations@7.2.8": "@angular/animations@9.1.0":
version "7.2.8" version "9.1.0"
resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-7.2.8.tgz#0285364c839c660a934ab0f753ec21424bfb292e" resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-9.1.0.tgz#3030e290683c0e2d63fa61060d36f659511d3b2c"
integrity sha512-dJn9koYukyz15TouBc+z5z9fdThDk+bKgdlij25eYSu5Mpmtk04gB4eIMQA97K0UDh1d4YukgSJ5w3ZIk0m8DQ== integrity sha512-o7X3HM+eocoryw3VrDUtG6Wci2KwtzyBFo3KBJXjQ16X6fwdkjTG+hLb7pp2CBFBEJW4tPYEy7cSBmEfMRTqag==
dependencies:
tslib "^1.9.0"
"@angular/common@7.2.8": "@angular/common@9.1.2":
version "7.2.8" version "9.1.2"
resolved "https://registry.yarnpkg.com/@angular/common/-/common-7.2.8.tgz#660c816b6f08cd2919a6efb7465397e4ff14d265" resolved "https://registry.yarnpkg.com/@angular/common/-/common-9.1.2.tgz#cec9fbfc572bbcf715e994523b04ac48700c1b2c"
integrity sha512-LgOhf68+LPndGZhtnUlGFd2goReXYmHzaFZW8gCEi9aC+H+Io8bjYh0gkH3xDreevEOe3f0z6coXNFLIxSmTuA== integrity sha512-MAQW0DGq2NhvJSETLTwuImdzwI+wboG+5Uzgc0L8C/hX7SrEE65Hmz4nIjmGi2CPGLpodfWEcCPlV0R0dHun4A==
dependencies:
tslib "^1.9.0"
"@angular/compiler@7.2.8": "@angular/compiler@9.1.2":
version "7.2.8" version "9.1.2"
resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-7.2.8.tgz#9d9c1515e99914399e6915c1c90484b1d255560b" resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-9.1.2.tgz#52b22120ca3c7d27dccf4239c849158ad64fb435"
integrity sha512-PrU97cTsOdofpaDkxK0rWUA/CGd0u6ESOI6XvFVm5xH9zJInsdY8ShSHklnr1JJnss70e1dGKZbZq32OChxWMw== integrity sha512-82DitvlZA5DoE++qiiJdgx6HE71h96sfLHCjjvYJHApoOcnX+zBZFBrflpbXK9W4YdvydU4Lc1Ql1eleQPeT/g==
dependencies:
tslib "^1.9.0"
"@angular/core@7.2.8": "@angular/core@9.1.2":
version "7.2.8" version "9.1.2"
resolved "https://registry.yarnpkg.com/@angular/core/-/core-7.2.8.tgz#6586d9b6c6321c80119b3f3e2bd0edbb32d0b649" resolved "https://registry.yarnpkg.com/@angular/core/-/core-9.1.2.tgz#30970d49dc3b53c0dc68cd75dbc2c96afc7fee62"
integrity sha512-QKwug2kWJC00zm2rvmD9mCJzsOkMVhSu8vqPWf83poWTh8+F9aIVWcy29W0VoGpBkSchOnK8hf9DnKVv28j9nw== integrity sha512-nAqRl+5drAnZlBT7AgSo2JJubmPNrGCvhZ83dosPEUqJoLr69/lYipnF/iqKzYn5xo4MM1O27WIhSNDtDjBmzQ==
dependencies:
tslib "^1.9.0"
"@angular/forms@7.2.8": "@angular/forms@9.1.1":
version "7.2.8" version "9.1.1"
resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-7.2.8.tgz#adf194088495822d55dcf3e5bf69196dcf19465d" resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-9.1.1.tgz#3090829dd2989207fd9a4dbc5b44b3ff9b2fe948"
integrity sha512-lbSX4IHFHz/c4e2RHiPpL8MJlzDkCuQEHnqsujDaV2X9o9fApS6+C1X4x7Z2XDKqonmeX+aHQwv9+SLejX6OyQ== integrity sha512-NX+LuK8JFisiq3uHCOK6YoN/yIb2R9Ye5mwiOPkuZA3lZLKCnUXqCHZbM8VHy/WdjIxxeUaFMJc38yV8RVoabg==
dependencies:
tslib "^1.9.0"
"@angular/platform-browser-dynamic@7.2.8": "@angular/platform-browser-dynamic@9.1.2":
version "7.2.8" version "9.1.2"
resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.8.tgz#e82768900cedfa75bf453263f931a9f90f7aaab2" resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.2.tgz#5587d536184e1c92498d9000475dd8998df1b110"
integrity sha512-nOJt28A5pRn4mdL8y98V7bA6OOdMRjsQAcWCr/isGYF0l1yDC0ijUGWkHuRtj3z1/9tmERN0BLXx+xs1h4JhCQ== integrity sha512-BWHxy8S71z+NmUQmtR+/Dkohlj3LQIXltOqeVdCSpjV9cultBNN3bE1w0Rjp3BmCRGCIDH7qFlr4U5woHa7ldw==
dependencies:
tslib "^1.9.0"
"@angular/platform-browser@7.2.8": "@angular/platform-browser@9.1.1":
version "7.2.8" version "9.1.1"
resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-7.2.8.tgz#11096727b99bf3d7fd82a00a3a468b933c9713bd" resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-9.1.1.tgz#bb5a98a3a33a307436684c4c7e2c448c786ae466"
integrity sha512-SizCRMc7Or27g2CugcqWnaAikRPfgLgRvb9GFFGpcgoq8CRfOVwkyR5dFZuqN39H+uwtwuTMP5OUYhZcrFNKug== integrity sha512-tjALKhdAWPErj0euIIdvx/31AHEZ7is7ADsMu+nYn2NY2gcPUuiqq3RCUJVxBYJ2Cclq1nlF0i2rEDKh7TrBKg==
dependencies:
tslib "^1.9.0"
"@ng-bootstrap/ng-bootstrap@^4.2.2": "@ng-bootstrap/ng-bootstrap@^6.0.2":
version "4.2.2" version "6.0.2"
resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-4.2.2.tgz#a1c3a9576656cb4f793bbc3df56dfbdeb098f2fb" resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-6.0.2.tgz#ed8d4e04f21885fb18dc2523c4f2111f50ee99b2"
integrity sha512-v8QmC17bv9he5Ep6zutaI9aQ2w/2NqySP0fejOKe7cacKpGUqsLIakpyd2FD7mfZu7pSCCtHYpRWR+h6yq+Ngg== integrity sha512-8+Dz8GN15zneIA4+mQ7b1j5O+oHsFdhTYQVDGk6eAazHeqrFD0+o8N+pLZL2PZlf98WcHFmXIOqKXrBD8iLl1g==
"@serialport/binding-abstract@^8.0.6":
version "8.0.6"
resolved "https://registry.yarnpkg.com/@serialport/binding-abstract/-/binding-abstract-8.0.6.tgz#78e6d7995a95c46d480445303e6f32ca4d53edcd"
integrity sha512-1swwUVoRyQ9ubxrkJ8JPppykohUpTAP4jkGr36e9NjbVocSPfqeX6tFZFwl/IdUlwJwxGdbKDqq7FvXniCQUMw==
dependencies: dependencies:
tslib "^1.9.0" debug "^4.1.1"
"@serialport/binding-mock@^8.0.6":
version "8.0.6"
resolved "https://registry.yarnpkg.com/@serialport/binding-mock/-/binding-mock-8.0.6.tgz#41a8f827269c6a0e58546513a274e12023134155"
integrity sha512-BIbY5/PsDDo0QWDNCCxDgpowAdks+aZR8BOsEtK2GoASTTcJCy1fBwPIfH870o7rnbH901wY3C+yuTfdOvSO9A==
dependencies:
"@serialport/binding-abstract" "^8.0.6"
debug "^4.1.1"
"@serialport/bindings@^8.0.7":
version "8.0.7"
resolved "https://registry.yarnpkg.com/@serialport/bindings/-/bindings-8.0.7.tgz#2a58f60f1e24ee4549be6f9e0e37b3359d038a1c"
integrity sha512-IqudDL8ne2Y2S0W5fKA6wdgHCIA2e2OIaPVYhGy6duE6legNHFY+05CLicHAyAeTocXmHU7rVNxzVQrOG5tM4g==
dependencies:
"@serialport/binding-abstract" "^8.0.6"
"@serialport/parser-readline" "^8.0.6"
bindings "^1.5.0"
debug "^4.1.1"
nan "^2.14.0"
prebuild-install "^5.3.0"
"@serialport/parser-byte-length@^8.0.6":
version "8.0.6"
resolved "https://registry.yarnpkg.com/@serialport/parser-byte-length/-/parser-byte-length-8.0.6.tgz#efb6195692b1088e6c095fd43bae196fc30674d0"
integrity sha512-92mrFxFEvq3gRvSM7ANK/jfbmHslz91a5oYJy/nbSn4H/MCRXjxR2YOkQgVXuN+zLt+iyDoW3pcOP4Sc1nWdqQ==
"@serialport/parser-cctalk@^8.0.6":
version "8.0.6"
resolved "https://registry.yarnpkg.com/@serialport/parser-cctalk/-/parser-cctalk-8.0.6.tgz#4134a3c479d465df3b152a21e16b8ecf1bc818c3"
integrity sha512-pqtCYQPgxnxHygiXUPCfgX7sEx+fdR/ObjpscidynEULUq2fFrC5kBkrxRbTfHRtTaU2ii9DyjFq0JVRCbhI0Q==
"@serialport/parser-delimiter@^8.0.6":
version "8.0.6"
resolved "https://registry.yarnpkg.com/@serialport/parser-delimiter/-/parser-delimiter-8.0.6.tgz#0e467cb07a40bd3006835c48e488666bd7de22cc"
integrity sha512-ogKOcPisPMlVtirkuDu3SFTF0+xT0ijxoH7XjpZiYL41EVi367MwuCnEmXG+dEKKnF0j9EPqOyD2LGSJxaFmhQ==
"@serialport/parser-readline@^8.0.6":
version "8.0.6"
resolved "https://registry.yarnpkg.com/@serialport/parser-readline/-/parser-readline-8.0.6.tgz#8a6a296a1bec08a4855bf7a62bc6335d52972e4a"
integrity sha512-OYBT2mpczh9QUI3MTw8j0A0tIlPVjpVipvuVnjRkYwxrxPeq04RaLFhaDpuRzua5rTKMt89c1y3btYeoDXMjAA==
dependencies:
"@serialport/parser-delimiter" "^8.0.6"
"@serialport/parser-ready@^8.0.6":
version "8.0.6"
resolved "https://registry.yarnpkg.com/@serialport/parser-ready/-/parser-ready-8.0.6.tgz#d6e95e53ee70d298ae0b4147995007f4ba62651c"
integrity sha512-xcEqv4rc119WR5JzAuu8UeJOlAwET2PTdNb6aIrrLlmTxhvuBbuRFcsnF3BpH9jUL30Kh7a6QiNXIwVG+WR/1Q==
"@serialport/parser-regex@^8.0.6":
version "8.0.6"
resolved "https://registry.yarnpkg.com/@serialport/parser-regex/-/parser-regex-8.0.6.tgz#70aa1abe31899d1b986f44cfb6777a76e26755bf"
integrity sha512-J8KY75Azz5ZyExmyM5YfUxbXOWBkZCytKgCCmZ966ttwZS0bUZOuoCaZj2Zp4VILJAiLuxHoqc0foi67Fri5+g==
"@serialport/stream@^8.0.6":
version "8.0.6"
resolved "https://registry.yarnpkg.com/@serialport/stream/-/stream-8.0.6.tgz#3395dbac788c00797c2435c61c2ecb4e99fbf41d"
integrity sha512-ym1PwM0rwLrj90vRBB66I1hwMXbuMw9wGTxqns75U3N/tuNFOH85mxXaYVF2TpI66aM849NoI1jMm50fl9equg==
dependencies:
debug "^4.1.1"
"@types/color-name@^1.1.1": "@types/color-name@^1.1.1":
version "1.1.1" version "1.1.1"
@@ -80,10 +130,12 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67"
integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ== integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==
"@types/semver@^6.0.2": "@types/semver@^7.1.0":
version "6.2.0" version "7.1.0"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.2.0.tgz#d688d574400d96c5b0114968705366f431831e1a" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.1.0.tgz#c8c630d4c18cd326beff77404887596f96408408"
integrity sha512-1OzrNb4RuAzIT7wHSsgZRlMBlNsJl+do6UblR7JMW4oB7bbR+uBEYtUh7gEc/jM84GGilh68lSOokyM/zNUlBA== 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"
@@ -238,6 +290,11 @@ asynckit@^0.4.0:
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
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==
aws-sign2@~0.7.0: aws-sign2@~0.7.0:
version "0.7.0" version "0.7.0"
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
@@ -271,6 +328,13 @@ bin-links@^1.1.2:
graceful-fs "^4.1.11" graceful-fs "^4.1.11"
write-file-atomic "^2.3.0" write-file-atomic "^2.3.0"
bindings@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
dependencies:
file-uri-to-path "1.0.0"
bl@^3.0.0: bl@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.0.tgz#3611ec00579fd18561754360b21e9f784500ff88" resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.0.tgz#3611ec00579fd18561754360b21e9f784500ff88"
@@ -316,10 +380,10 @@ 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.4.0: builder-util-runtime@8.6.1:
version "8.4.0" version "8.6.1"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.4.0.tgz#3163fffc078e6b8f3dd5b6eb12a8345573590682" resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.6.1.tgz#cf9a268fa51704de24f3c085aa8d1d1b3767d9ea"
integrity sha512-CJB/eKfPf2vHrkmirF5eicVnbDCkMBbwd5tRYlTlgud16zFeqD7QmrVUAOEXdnsrcNkiLg9dbuUsQKtl/AwsYQ== integrity sha512-gwIUtMaICmc+e2EC3u3byXcwCyfhtG40LJRNnGfs8AYqacKl4ZLP50ab+uDttn7QAXe0LfMAuKz9v8bCODV0yg==
dependencies: dependencies:
debug "^4.1.1" debug "^4.1.1"
sax "^1.2.4" sax "^1.2.4"
@@ -798,19 +862,18 @@ 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.0: electron-updater@^4.3.0:
version "4.2.0" version "4.3.0"
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.2.0.tgz#f9ecfc657f65ead737d42b9efecf628d3756b550" resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.3.0.tgz#f66c253b25431d9aeb04fbd33c79062f33943d44"
integrity sha512-GuS3g7HDh17x/SaFjxjswlWUaKHczksYkV2Xc5CKj/bZH0YCvTSHtOmnBAdAmCk99u/71p3zP8f0jIqDfGcjww== integrity sha512-5K3vPgeiBGQaaCcZzQP00QYhGsh0l/q0mwzGWVZq1BHJ5akA+BpsY+EPiI9JzBhNVIdNlUvSKr5azUdbMwZeig==
dependencies: dependencies:
"@types/semver" "^6.0.2" "@types/semver" "^7.1.0"
builder-util-runtime "8.4.0" builder-util-runtime "8.6.1"
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.10" semver "^7.1.3"
semver "^6.3.0"
emoji-regex@^8.0.0: emoji-regex@^8.0.0:
version "8.0.0" version "8.0.0"
@@ -925,6 +988,11 @@ figgy-pudding@^3.4.1, figgy-pudding@^3.5.1:
resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790"
integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==
file-uri-to-path@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
find-npm-prefix@^1.0.2: find-npm-prefix@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz#8d8ce2c78b3b4b9e66c8acc6a37c231eb841cfdf" resolved "https://registry.yarnpkg.com/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz#8d8ce2c78b3b4b9e66c8acc6a37c231eb841cfdf"
@@ -1000,14 +1068,15 @@ 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: 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"
fs-minipass@^1.2.5: fs-minipass@^1.2.5:
version "1.2.6" version "1.2.6"
@@ -1453,10 +1522,12 @@ 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: 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"
@@ -1485,10 +1556,10 @@ 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.0.0: keytar@^5.5.0:
version "5.0.0" version "5.5.0"
resolved "https://registry.yarnpkg.com/keytar/-/keytar-5.0.0.tgz#c89b6b7a4608fd7af633d9f8474b1a7eb97cbe6f" resolved "https://registry.yarnpkg.com/keytar/-/keytar-5.5.0.tgz#971de0fd5f480f9d397f4e4debf96e5ed886f12e"
integrity sha512-a5UheK59YOlJf9i+2Osaj/kkH6mK0RCHVMtJ84u6ZfbfRIbOJ/H4b5VlOF/LgNHF6s78dRSBzZnvIuPiBKv6wg== integrity sha512-1d/F2qAL/qijpm25wNq8eez4mE+/J4eBvqyLfspIYIeCEHn3nttFwplowIZfbdNCjFGWh68MzGZOd2vS61Ffew==
dependencies: dependencies:
nan "2.14.0" nan "2.14.0"
prebuild-install "5.3.3" prebuild-install "5.3.3"
@@ -1918,17 +1989,15 @@ napi-build-utils@^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.13.0, node-abi@^2.7.0: node-abi@^2.15.0, node-abi@^2.7.0:
version "2.13.0" version "2.15.0"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.13.0.tgz#e2f2ec444d0aca3ea1b3874b6de41d1665828f63" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.15.0.tgz#51d55cc711bd9e4a24a572ace13b9231945ccb10"
integrity sha512-9HrZGFVTR5SOu3PZAnAY2hLO36aW1wmA+FDsVkr85BTST32TLCA1H/AEcatVRAsWLyXS3bqUDYCAjq5/QGuSTA== integrity sha512-FeLpTS0F39U7hHZU1srAK4Vx+5AHNVOTP+hxBNQknR/54laTHSFIJkDWDqiquY1LeLUgTfPN7sLPhMubx0PLAg==
dependencies: dependencies:
semver "^5.4.1" semver "^5.4.1"
@@ -1976,10 +2045,10 @@ node-gyp@^4.0.0:
tar "^4.4.8" tar "^4.4.8"
which "1" which "1"
node-pty@^0.10.0-beta2: node-pty@^0.10.0-beta8:
version "0.10.0-beta3" version "0.10.0-beta8"
resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.10.0-beta3.tgz#a33c9fc67c9e4d4f124111e1da2a72b0783008e7" resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.10.0-beta8.tgz#f4aa56c71a794f4580373a3030dfebd25240c6db"
integrity sha512-j7MoJ3K999jrT9gAVs7JvM/skAQXQITrZK/PhL9B4W4GAPkANKwdu9uEtNvYionQ9dV8gRGte7lg9D2cRDdAiA== integrity sha512-Ul/hLsadC0SvvShxpne+kq2ebSMcitewlNhrwoXXBvFdCqxJt7Ai1AgMhH7AKBUp06uBeYXThJ2ihTszrkdnYw==
dependencies: dependencies:
nan "^2.14.0" nan "^2.14.0"
@@ -2395,11 +2464,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.10:
version "1.0.10"
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732"
integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==
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"
@@ -2464,7 +2528,7 @@ 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.3, prebuild-install@^5.3.0:
version "5.3.3" version "5.3.3"
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.3.tgz#ef4052baac60d465f5ba6bf003c9c1de79b9da8e"
integrity sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g== integrity sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==
@@ -2801,15 +2865,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.3: rxjs-compat@^6.5.5:
version "6.5.3" version "6.5.5"
resolved "https://registry.yarnpkg.com/rxjs-compat/-/rxjs-compat-6.5.3.tgz#18440949b2678bf87a78a754009676b2c49183dc" resolved "https://registry.yarnpkg.com/rxjs-compat/-/rxjs-compat-6.5.5.tgz#073c40510f29c45a2a5fc02dde87f8c3ad75f2c2"
integrity sha512-BIJX2yovz3TBpjJoAZyls2QYuU6ZiCaZ+U96SmxQpuSP/qDUfiXPKOVLbThBB2WZijNHkdTTJXKRwvv5Y48H7g== integrity sha512-F42sssVbUyWH4vJswEo6m+Eh02xHv3q93n8S7nUJO58R7sbc3CvJIOts605zdaBhWa1xMB9aVSyqPqhQ5q3eXg==
rxjs@^6.5.3: rxjs@^6.5.5:
version "6.5.3" version "6.5.5"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec"
integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==
dependencies: dependencies:
tslib "^1.9.0" tslib "^1.9.0"
@@ -2840,16 +2904,32 @@ 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@^6.3.0: semver@^7.1.3:
version "6.3.0" version "7.1.3"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.3.tgz#e4345ce73071c53f336445cfc19efb1c311df2a6"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 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:
version "8.0.7"
resolved "https://registry.yarnpkg.com/serialport/-/serialport-8.0.7.tgz#9f28b1b7c47333a0962f5505a1c3feb1d90f89a9"
integrity sha512-R9bfNebs2dblYf5sD/Aaa7j8+siP4X7TGT02lqHM9DF5fyjlrPGXmsLw9+LKOz1AvjGjkxf2NzBVnDpqRX7clQ==
dependencies:
"@serialport/binding-mock" "^8.0.6"
"@serialport/bindings" "^8.0.7"
"@serialport/parser-byte-length" "^8.0.6"
"@serialport/parser-cctalk" "^8.0.6"
"@serialport/parser-delimiter" "^8.0.6"
"@serialport/parser-readline" "^8.0.6"
"@serialport/parser-ready" "^8.0.6"
"@serialport/parser-regex" "^8.0.6"
"@serialport/stream" "^8.0.6"
debug "^4.1.1"
set-blocking@^2.0.0, set-blocking@~2.0.0: set-blocking@^2.0.0, set-blocking@~2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
@@ -3263,10 +3343,10 @@ unique-string@^1.0.0:
dependencies: dependencies:
crypto-random-string "^1.0.0" crypto-random-string "^1.0.0"
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==
unpipe@~1.0.0: unpipe@~1.0.0:
version "1.0.0" version "1.0.0"
@@ -3486,10 +3566,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.1:
version "16.1.0" version "18.1.1"
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.1.tgz#bf7407b915427fc760fcbbccc6c82b4f0ffcbd37"
integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg== integrity sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA==
dependencies: dependencies:
camelcase "^5.0.0" camelcase "^5.0.0"
decamelize "^1.2.0" decamelize "^1.2.0"
@@ -3519,10 +3599,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.0.2: yargs@^15.3.1:
version "15.0.2" version "15.3.1"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.0.2.tgz#4248bf218ef050385c4f7e14ebdf425653d13bd3" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b"
integrity sha512-GH/X/hYt+x5hOat4LMnCqMd8r5Cv78heOMIJn1hr7QPPBqfeC6p89Y78+WB9yGDvfpCvgasfmWLzNzEioOUD9Q== integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==
dependencies: dependencies:
cliui "^6.0.0" cliui "^6.0.0"
decamelize "^1.2.0" decamelize "^1.2.0"
@@ -3534,9 +3614,9 @@ yargs@^15.0.2:
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.1"
zone.js@^0.8.29: zone.js@^0.10.3:
version "0.8.29" version "0.10.3"
resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.29.tgz#8dce92aa0dd553b50bc5bfbb90af9986ad845a12" resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.10.3.tgz#3e5e4da03c607c9dcd92e37dd35687a14a140c16"
integrity sha512-mla2acNCMkWXBD+c+yeUrBUrzOxYMNFdQ6FGfigGGtEVBPJx07BQeJekjt9DmH1FtZek4E9rE1eRR9qQpxACOQ== integrity sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==

View File

@@ -1,4 +1,7 @@
#!/bin/bash #!/bin/bash
cat > '/usr/bin/${executable}' << END
#!/bin/sh
'/opt/${productFilename}/${executable}' --no-sandbox $@
END
# Link to the binary chmod +x '/usr/bin/${executable}'
ln -sf '/opt/${productFilename}/${executable}' '/usr/bin/${executable}'

60
electron-builder.yml Normal file
View File

@@ -0,0 +1,60 @@
---
appId: org.terminus
productName: Terminus
compression: normal
afterSign: "./build/mac/afterSignHook.js"
files:
- "**/*"
- dist
extraResources:
- builtin-plugins
- extras
publish:
- provider: github
win:
icon: "./build/windows/icon.ico"
artifactName: terminus-${version}-portable.${ext}
rfc3161TimeStampServer: http://sha256timestamp.ws.symantec.com/sha256/timestamp
nsis:
oneClick: false
artifactName: terminus-${version}-setup.${ext}
installerIcon: "./build/windows/icon.ico"
mac:
category: public.app-category.video
icon: "./build/mac/icon.icns"
artifactName: terminus-${version}-macos.${ext}
hardenedRuntime: true
entitlements: "./build/mac/entitlements.plist"
entitlementsInherit: "./build/mac/entitlements.plist"
extendInfo:
NSRequiresAquaSystemAppearance: false
pkg:
artifactName: terminus-${version}-macos.pkg
linux:
category: Utilities
icon: "./build/icons"
artifactName: terminus-${version}-linux.${ext}
executableArgs:
- "--no-sandbox"
snap:
plugs:
- default
- system-files
- system-observe
deb:
depends:
- gconf2
- gconf-service
- libnotify4
- libsecret-1-0
- libappindicator1
- libxtst6
- libnss3
afterInstall: build/linux/after-install.tpl
rpm:
depends:
- screen
- gnome-python2-gnomekeyring

Binary file not shown.

Binary file not shown.

View File

@@ -1,34 +1,34 @@
{ {
"devDependencies": { "devDependencies": {
"@fortawesome/fontawesome-free": "^5.11.2", "@fortawesome/fontawesome-free": "^5.13.0",
"@sentry/cli": "^1.49.0", "@sentry/cli": "^1.52.1",
"@sentry/electron": "^1.0.0", "@sentry/electron": "^1.2.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.3",
"@types/node": "12.7.12", "@types/node": "12.7.12",
"@types/webpack-env": "1.14.1", "@types/webpack-env": "1.15.0",
"@typescript-eslint/eslint-plugin": "^2.13.0", "@typescript-eslint/eslint-plugin": "^2.26.0",
"@typescript-eslint/parser": "^2.13.0", "@typescript-eslint/parser": "^2.27.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.1", "core-js": "^3.6.5",
"cross-env": "6.0.3", "cross-env": "7.0.2",
"css-loader": "3.4.0", "css-loader": "3.4.2",
"electron": "^7.1.7", "electron": "^8.2.3",
"electron-builder": "22.1.0", "electron-builder": "22.5.1",
"electron-download": "^4.1.1", "electron-download": "^4.1.1",
"electron-installer-snap": "^4.1.0", "electron-installer-snap": "^5.0.0",
"electron-notarize": "^0.1.1", "electron-notarize": "^0.1.1",
"electron-rebuild": "^1.8.5", "electron-rebuild": "^1.10.1",
"eslint": "^6.8.0", "eslint": "^6.8.0",
"eslint-plugin-import": "^2.19.1", "eslint-plugin-import": "^2.20.2",
"file-loader": "^5.0.2", "file-loader": "^5.0.2",
"graceful-fs": "^4.2.2", "graceful-fs": "^4.2.2",
"html-loader": "0.5.5", "html-loader": "0.5.5",
"json-loader": "0.5.7", "json-loader": "0.5.7",
"node-abi": "^2.12.0", "node-abi": "^2.15.0",
"node-gyp": "^6.0.1", "node-gyp": "^6.1.0",
"node-sass": "^4.13.0", "node-sass": "^4.13.0",
"npmlog": "4.1.2", "npmlog": "4.1.2",
"npx": "^10.2.0", "npx": "^10.2.0",
@@ -37,104 +37,37 @@
"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.3",
"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.0.1", "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.10.0", "tslib": "^1.11.1",
"typedoc": "^0.15.6", "typedoc": "^0.17.4",
"typescript": "^3.7.3", "typescript": "^3.8.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.11", "webpack": "^5.0.0-beta.14",
"webpack-cli": "^3.3.10", "webpack-cli": "^3.3.10",
"yaml-loader": "0.5.0" "yaml-loader": "0.6.0"
}, },
"resolutions": { "resolutions": {
"*/node-abi": "^2.8.0" "*/node-abi": "^2.14.0"
},
"build": {
"appId": "org.terminus",
"productName": "Terminus",
"compression": "normal",
"afterSign": "./build/mac/afterSignHook.js",
"files": [
"**/*",
"dist"
],
"extraResources": [
"builtin-plugins",
"extras"
],
"win": {
"icon": "./build/windows/icon.ico",
"artifactName": "terminus-${version}-setup.exe",
"rfc3161TimeStampServer": "http://sha256timestamp.ws.symantec.com/sha256/timestamp"
},
"nsis": {
"oneClick": false,
"artifactName": "terminus-${version}-setup.${ext}",
"installerIcon": "./build/windows/icon.ico"
},
"publish": [
{
"provider": "github"
}
],
"portable": {
"artifactName": "terminus-${version}-portable.exe"
},
"mac": {
"category": "public.app-category.video",
"icon": "./build/mac/icon.icns",
"artifactName": "terminus-${version}-macos.${ext}",
"hardenedRuntime": true,
"entitlements": "./build/mac/entitlements.plist",
"entitlementsInherit": "./build/mac/entitlements.plist",
"extendInfo": {
"NSRequiresAquaSystemAppearance": false
}
},
"pkg": {
"artifactName": "terminus-${version}-macos.pkg"
},
"linux": {
"category": "Utilities",
"icon": "./build/icons",
"artifactName": "terminus-${version}-linux.${ext}"
},
"deb": {
"depends": [
"gconf2",
"gconf-service",
"libnotify4",
"libsecret-1-0",
"libappindicator1",
"libxtst6",
"libnss3"
],
"afterInstall": "build/linux/after-install.tpl"
},
"rpm": {
"depends": [
"screen",
"gnome-python2-gnomekeyring"
]
}
}, },
"scripts": { "scripts": {
"build": "npm run build:typings && webpack --color --config app/webpack.main.config.js && webpack --color --config app/webpack.config.js && webpack --color --config terminus-core/webpack.config.js && webpack --color --config terminus-settings/webpack.config.js && webpack --color --config terminus-terminal/webpack.config.js && webpack --color --config terminus-plugin-manager/webpack.config.js && webpack --color --config terminus-community-color-schemes/webpack.config.js && webpack --color --config terminus-ssh/webpack.config.js", "build": "npm run build:typings && webpack --color --config app/webpack.main.config.js && webpack --color --config app/webpack.config.js && webpack --color --config terminus-core/webpack.config.js && webpack --color --config terminus-settings/webpack.config.js && webpack --color --config terminus-terminal/webpack.config.js && webpack --color --config terminus-plugin-manager/webpack.config.js && webpack --color --config terminus-community-color-schemes/webpack.config.js && webpack --color --config terminus-ssh/webpack.config.js && webpack --color --config terminus-serial/webpack.config.js",
"build:typings": "tsc --project terminus-core/tsconfig.typings.json && tsc --project terminus-settings/tsconfig.typings.json && tsc --project terminus-terminal/tsconfig.typings.json && tsc --project terminus-plugin-manager/tsconfig.typings.json && tsc --project terminus-ssh/tsconfig.typings.json", "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",
"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", "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"
} }

9
scripts/build-typings.js Executable file
View File

@@ -0,0 +1,9 @@
#!/usr/bin/env node
const sh = require('shelljs')
const vars = require('./vars')
const log = require('npmlog')
vars.builtinPlugins.forEach(plugin => {
log.info('typings', plugin)
sh.exec(`npx tsc --project ${plugin}/tsconfig.typings.json`)
})

View File

@@ -7,7 +7,7 @@ const isCI = !!process.env.GITHUB_REF
builder({ builder({
dir: true, dir: true,
win: ['nsis', 'portable'], win: ['nsis', 'zip'],
config: { config: {
extraMetadata: { extraMetadata: {
version: vars.version, version: vars.version,

View File

@@ -21,6 +21,7 @@ exports.builtinPlugins = [
'terminus-community-color-schemes', 'terminus-community-color-schemes',
'terminus-plugin-manager', 'terminus-plugin-manager',
'terminus-ssh', 'terminus-ssh',
'terminus-serial',
] ]
exports.bundledModules = [ exports.bundledModules = [
'@angular', '@angular',

View File

@@ -1,6 +1,6 @@
{ {
"name": "terminus-community-color-schemes", "name": "terminus-community-color-schemes",
"version": "1.0.98-nightly.0", "version": "1.0.104-nightly.0",
"description": "Community color schemes for Terminus", "description": "Community color schemes for Terminus",
"keywords": [ "keywords": [
"terminus-builtin-plugin" "terminus-builtin-plugin"

View File

@@ -0,0 +1,14 @@
{
"extends": "../tsconfig.json",
"exclude": ["node_modules", "dist", "typings"],
"compilerOptions": {
"baseUrl": "src",
"emitDeclarationOnly": true,
"declaration": true,
"declarationDir": "./typings",
"paths": {
"terminus-*": ["../../terminus-*"],
"*": ["../../app/node_modules/*"]
}
}
}

View File

@@ -1,6 +1,6 @@
{ {
"name": "terminus-core", "name": "terminus-core",
"version": "1.0.98-nightly.0", "version": "1.0.104-nightly.0",
"description": "Terminus core", "description": "Terminus core",
"keywords": [ "keywords": [
"terminus-builtin-plugin" "terminus-builtin-plugin"
@@ -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": "^3.3.2", "uuid": "^7.0.1",
"winston": "^3.2.1" "winston": "^3.2.1"
}, },
"peerDependencies": { "peerDependencies": {

View File

@@ -1,11 +1,13 @@
export { BaseTabComponent, BaseTabProcess } from '../components/baseTab.component' export { BaseTabComponent, BaseTabProcess } from '../components/baseTab.component'
export { TabHeaderComponent } from '../components/tabHeader.component'
export { SplitTabComponent, SplitContainer } from '../components/splitTab.component' export { SplitTabComponent, SplitContainer } from '../components/splitTab.component'
export { TabRecoveryProvider, RecoveredTab } from './tabRecovery' export { TabRecoveryProvider, RecoveredTab, RecoveryToken } from './tabRecovery'
export { ToolbarButtonProvider, ToolbarButton } from './toolbarButtonProvider' export { ToolbarButtonProvider, ToolbarButton } from './toolbarButtonProvider'
export { ConfigProvider } from './configProvider' export { ConfigProvider } from './configProvider'
export { HotkeyProvider, HotkeyDescription } from './hotkeyProvider' export { HotkeyProvider, HotkeyDescription } from './hotkeyProvider'
export { Theme } from './theme' export { Theme } from './theme'
export { TabContextMenuItemProvider } from './tabContextMenuProvider' export { TabContextMenuItemProvider } from './tabContextMenuProvider'
export { SelectorOption } from './selector'
export { AppService } from '../services/app.service' export { AppService } from '../services/app.service'
export { ConfigService } from '../services/config.service' export { ConfigService } from '../services/config.service'
@@ -18,3 +20,4 @@ export { HostAppService, Platform } from '../services/hostApp.service'
export { ShellIntegrationService } from '../services/shellIntegration.service' export { ShellIntegrationService } from '../services/shellIntegration.service'
export { ThemesService } from '../services/themes.service' export { ThemesService } from '../services/themes.service'
export { TabsService } from '../services/tabs.service' export { TabsService } from '../services/tabs.service'
export * from '../utils'

View File

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

View File

@@ -12,6 +12,12 @@ export interface RecoveredTab {
options?: any options?: any
} }
export interface RecoveryToken {
[_: string]: any
type: string
tabColor?: string|null
}
/** /**
* Extend to enable recovery for your custom tab. * Extend to enable recovery for your custom tab.
* This works in conjunction with [[getRecoveryToken()]] * This works in conjunction with [[getRecoveryToken()]]
@@ -34,5 +40,5 @@ export abstract class TabRecoveryProvider {
* @returns [[RecoveredTab]] descriptor containing tab type and component inputs * @returns [[RecoveredTab]] descriptor containing tab type and component inputs
* or `null` if this token is from a different tab type or is not supported * or `null` if this token is from a different tab type or is not supported
*/ */
abstract async recover (recoveryToken: any): Promise<RecoveredTab|null> abstract async recover (recoveryToken: RecoveryToken): Promise<RecoveredTab|null>
} }

View File

@@ -38,7 +38,7 @@ title-bar(
button.btn.btn-secondary.btn-tab-bar( button.btn.btn-secondary.btn-tab-bar(
[title]='button.title', [title]='button.title',
(click)='button.click && button.click()', (click)='button.click && button.click()',
[innerHTML]='sanitizeIcon(button.icon)', [fastHtmlBind]='button.icon',
ngbDropdownToggle, ngbDropdownToggle,
) )
div(*ngIf='button.submenu', ngbDropdownMenu) div(*ngIf='button.submenu', ngbDropdownMenu)
@@ -49,7 +49,7 @@ title-bar(
) )
.icon-wrapper( .icon-wrapper(
*ngIf='hasIcons(button.submenuItems)', *ngIf='hasIcons(button.submenuItems)',
[innerHTML]='sanitizeIcon(item.icon)' [fastHtmlBind]='item.icon'
) )
div([class.ml-3]='hasIcons(button.submenuItems)') {{item.title}} div([class.ml-3]='hasIcons(button.submenuItems)') {{item.title}}
@@ -64,7 +64,7 @@ title-bar(
button.btn.btn-secondary.btn-tab-bar( button.btn.btn-secondary.btn-tab-bar(
[title]='button.title', [title]='button.title',
(click)='button.click && button.click()', (click)='button.click && button.click()',
[innerHTML]='sanitizeIcon(button.icon)', [fastHtmlBind]='button.icon',
ngbDropdownToggle, ngbDropdownToggle,
) )
div(*ngIf='button.submenu', ngbDropdownMenu) div(*ngIf='button.submenu', ngbDropdownMenu)
@@ -75,7 +75,7 @@ title-bar(
) )
.icon-wrapper( .icon-wrapper(
*ngIf='hasIcons(button.submenuItems)', *ngIf='hasIcons(button.submenuItems)',
[innerHTML]='sanitizeIcon(item.icon)' [fastHtmlBind]='item.icon'
) )
div([class.ml-3]='hasIcons(button.submenuItems)') {{item.title}} div([class.ml-3]='hasIcons(button.submenuItems)') {{item.title}}
@@ -83,7 +83,7 @@ title-bar(
*ngIf='updatesAvailable', *ngIf='updatesAvailable',
title='Update available - Click to install', title='Update available - Click to install',
(click)='updateApp()', (click)='updateApp()',
[innerHTML]='sanitizeIcon(updateIcon)' [fastHtmlBind]='updateIcon'
) )
window-controls.background( window-controls.background(

View File

@@ -64,6 +64,7 @@ $tab-border-radius: 4px;
&>.drag-space { &>.drag-space {
min-width: 1px; min-width: 1px;
flex: 1 0 1%; flex: 1 0 1%;
margin-top: 2px; // for window resizing
-webkit-app-region: drag; -webkit-app-region: drag;
&.persistent { &.persistent {

View File

@@ -1,6 +1,6 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Component, Inject, Input, HostListener, HostBinding } from '@angular/core' import { Component, Inject, Input, HostListener, HostBinding } from '@angular/core'
import { trigger, style, animate, transition, state } from '@angular/animations' import { trigger, style, animate, transition, state } from '@angular/animations'
import { DomSanitizer } from '@angular/platform-browser'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { ElectronService } from '../services/electron.service' import { ElectronService } from '../services/electron.service'
@@ -75,7 +75,6 @@ export class AppRootComponent {
public hostApp: HostAppService, public hostApp: HostAppService,
public config: ConfigService, public config: ConfigService,
public app: AppService, public app: AppService,
private domSanitizer: DomSanitizer,
@Inject(ToolbarButtonProvider) private toolbarButtonProviders: ToolbarButtonProvider[], @Inject(ToolbarButtonProvider) private toolbarButtonProviders: ToolbarButtonProvider[],
log: LogService, log: LogService,
ngbModal: NgbModal, ngbModal: NgbModal,
@@ -109,6 +108,15 @@ export class AppRootComponent {
if (hotkey === 'previous-tab') { if (hotkey === 'previous-tab') {
this.app.previousTab() this.app.previousTab()
} }
if (hotkey === 'move-tab-left') {
this.app.moveSelectedTabLeft()
}
if (hotkey === 'move-tab-right') {
this.app.moveSelectedTabRight()
}
if (hotkey === 'reopen-tab') {
this.app.reopenLastTab()
}
} }
if (hotkey === 'toggle-fullscreen') { if (hotkey === 'toggle-fullscreen') {
this.hostApp.toggleFullscreen() this.hostApp.toggleFullscreen()
@@ -120,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']) {
@@ -169,40 +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().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
@@ -254,10 +219,6 @@ export class AppRootComponent {
return submenuItems.some(x => !!x.icon) return submenuItems.some(x => !!x.icon)
} }
sanitizeIcon (icon: string): any {
return this.domSanitizer.bypassSecurityTrustHtml(icon || '')
}
private getToolbarButtons (aboveZero: boolean): ToolbarButton[] { private getToolbarButtons (aboveZero: boolean): ToolbarButton[] {
let buttons: ToolbarButton[] = [] let buttons: ToolbarButton[] = []
this.config.enabledServices(this.toolbarButtonProviders).forEach(provider => { this.config.enabledServices(this.toolbarButtonProviders).forEach(provider => {

View File

@@ -1,5 +1,6 @@
import { Observable, Subject } from 'rxjs' import { Observable, Subject } from 'rxjs'
import { ViewRef } from '@angular/core' import { ViewRef } from '@angular/core'
import { RecoveryToken } from '../api/tabRecovery'
/** /**
* Represents an active "process" inside a tab, * Represents an active "process" inside a tab,
@@ -38,7 +39,7 @@ export abstract class BaseTabComponent {
*/ */
color: string|null = null color: string|null = null
protected hasFocus = false hasFocus = false
/** /**
* Ping this if your recovery state has been changed and you want * Ping this if your recovery state has been changed and you want
@@ -62,7 +63,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
}) })
@@ -71,7 +72,7 @@ export abstract class BaseTabComponent {
}) })
} }
setTitle (title: string) { setTitle (title: string): void {
this.title = title this.title = title
if (!this.customTitle) { if (!this.customTitle) {
this.titleChange.next(title) this.titleChange.next(title)
@@ -83,7 +84,7 @@ export abstract class BaseTabComponent {
* *
* @param {type} progress: value between 0 and 1, or `null` to remove * @param {type} progress: value between 0 and 1, or `null` to remove
*/ */
setProgress (progress: number|null) { setProgress (progress: number|null): void {
this.progress.next(progress) this.progress.next(progress)
if (progress) { if (progress) {
if (this.progressClearTimeout) { if (this.progressClearTimeout) {
@@ -118,7 +119,7 @@ export abstract class BaseTabComponent {
* @return JSON serializable tab state representation * @return JSON serializable tab state representation
* for your [[TabRecoveryProvider]] to parse * for your [[TabRecoveryProvider]] to parse
*/ */
async getRecoveryToken (): Promise<any> { async getRecoveryToken (): Promise<RecoveryToken|null> {
return null return null
} }
@@ -136,11 +137,11 @@ export abstract class BaseTabComponent {
return true return true
} }
emitFocused () { emitFocused (): void {
this.focused.next() this.focused.next()
} }
emitBlurred () { emitBlurred (): void {
this.blurred.next() this.blurred.next()
} }

View File

@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { NgZone, Component, Input, HostBinding, HostListener } from '@angular/core' import { NgZone, Component, Input, HostBinding, HostListener } from '@angular/core'
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms' import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'

View File

@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Component, Input, ElementRef, ViewChild } from '@angular/core' import { Component, Input, ElementRef, ViewChild } from '@angular/core'
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'

View File

@@ -14,7 +14,7 @@ export class SafeModeModalComponent {
this.error = window['safeModeReason'] this.error = window['safeModeReason']
} }
close () { close (): void {
this.modalInstance.dismiss() this.modalInstance.dismiss()
} }
} }

View File

@@ -0,0 +1,26 @@
.modal-body
input.form-control(
type='text',
[(ngModel)]='filter',
autofocus,
[placeholder]='name',
(ngModelChange)='onFilterChange()'
)
.list-group.mt-3(*ngIf='filteredOptions.length')
a.list-group-item.list-group-item-action.d-flex.align-items-center(
#item,
(click)='selectOption(option)',
[class.active]='selectedIndex == i',
*ngFor='let option of filteredOptions; let i = index'
)
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}}

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

@@ -0,0 +1,78 @@
import { Component, Input, HostListener, ViewChildren, QueryList, ElementRef } from '@angular/core'
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
import { SelectorOption } from '../api/selector'
/** @hidden */
@Component({
template: require('./selectorModal.component.pug'),
styles: [require('./selectorModal.component.scss')],
})
export class SelectorModalComponent<T> {
@Input() options: SelectorOption<T>[]
@Input() filteredOptions: SelectorOption<T>[]
@Input() filter = ''
@Input() name: string
@Input() selectedIndex = 0
@ViewChildren('item') itemChildren: QueryList<ElementRef>
constructor (
public modalInstance: NgbActiveModal,
) { }
ngOnInit (): void {
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 {
const f = this.filter.trim().toLowerCase()
if (!f) {
this.filteredOptions = this.options.filter(x => !x.freeInputPattern)
} else {
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
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)
}
getOptionText (option: SelectorOption<T>): string {
if (option.freeInputPattern) {
return option.freeInputPattern.replace('%s', this.filter)
}
return option.name
}
selectOption (option: SelectorOption<T>): void {
option.callback?.(this.filter)
this.modalInstance.close(option.result)
}
close (): void {
this.modalInstance.dismiss()
}
iconIsSVG (icon: string): boolean {
return icon?.startsWith('<')
}
}

View File

@@ -3,3 +3,24 @@
position: relative; position: relative;
flex: auto; flex: auto;
} }
::ng-deep split-tab > .child {
position: absolute;
transition: 0.125s all;
opacity: .75;
&.focused {
opacity: 1;
}
&.minimized {
opacity: .1;
}
&.maximized {
z-index: 2;
box-shadow: rgba(0, 0, 0, 0.25) 0px 0px 30px;
backdrop-filter: blur(10px);
border-radius: 10px;
}
}

View File

@@ -1,7 +1,7 @@
import { Observable, Subject, Subscription } from 'rxjs' import { Observable, Subject, Subscription } from 'rxjs'
import { Component, Injectable, ViewChild, ViewContainerRef, EmbeddedViewRef, OnInit, OnDestroy } from '@angular/core' import { Component, Injectable, ViewChild, ViewContainerRef, EmbeddedViewRef, AfterViewInit, OnDestroy } from '@angular/core'
import { BaseTabComponent, BaseTabProcess } from './baseTab.component' import { BaseTabComponent, BaseTabProcess } from './baseTab.component'
import { TabRecoveryProvider, RecoveredTab } from '../api/tabRecovery' import { TabRecoveryProvider, RecoveredTab, RecoveryToken } from '../api/tabRecovery'
import { TabsService } from '../services/tabs.service' import { TabsService } from '../services/tabs.service'
import { HotkeysService } from '../services/hotkeys.service' import { HotkeysService } from '../services/hotkeys.service'
import { TabRecoveryService } from '../services/tabRecovery.service' import { TabRecoveryService } from '../services/tabRecovery.service'
@@ -48,7 +48,7 @@ export class SplitContainer {
/** /**
* Remove unnecessarily nested child containers and renormalizes [[ratios]] * Remove unnecessarily nested child containers and renormalizes [[ratios]]
*/ */
normalize () { normalize (): void {
for (let i = 0; i < this.children.length; i++) { for (let i = 0; i < this.children.length; i++) {
const child = this.children[i] const child = this.children[i]
@@ -93,7 +93,7 @@ export class SplitContainer {
return s return s
} }
async serialize () { async serialize (): Promise<RecoveryToken> {
const children: any[] = [] const children: any[] = []
for (const child of this.children) { for (const child of this.children) {
if (child instanceof SplitContainer) { if (child instanceof SplitContainer) {
@@ -140,7 +140,9 @@ export interface SplitSpannerInfo {
`, `,
styles: [require('./splitTab.component.scss')], styles: [require('./splitTab.component.scss')],
}) })
export class SplitTabComponent extends BaseTabComponent implements OnInit, OnDestroy { export class SplitTabComponent extends BaseTabComponent implements AfterViewInit, OnDestroy {
static DIRECTIONS: SplitDirection[] = ['t', 'r', 'b', 'l']
/** @hidden */ /** @hidden */
@ViewChild('vc', { read: ViewContainerRef }) viewContainer: ViewContainerRef @ViewChild('vc', { read: ViewContainerRef }) viewContainer: ViewContainerRef
@@ -156,6 +158,7 @@ export class SplitTabComponent extends BaseTabComponent implements OnInit, OnDes
_spanners: SplitSpannerInfo[] = [] _spanners: SplitSpannerInfo[] = []
private focusedTab: BaseTabComponent private focusedTab: BaseTabComponent
private maximizedTab: BaseTabComponent|null = null
private hotkeysSubscription: Subscription private hotkeysSubscription: Subscription
private viewRefs: Map<BaseTabComponent, EmbeddedViewRef<any>> = new Map() private viewRefs: Map<BaseTabComponent, EmbeddedViewRef<any>> = new Map()
@@ -163,6 +166,7 @@ export class SplitTabComponent extends BaseTabComponent implements OnInit, OnDes
private tabRemoved = new Subject<BaseTabComponent>() private tabRemoved = new Subject<BaseTabComponent>()
private splitAdjusted = new Subject<SplitSpannerInfo>() private splitAdjusted = new Subject<SplitSpannerInfo>()
private focusChanged = new Subject<BaseTabComponent>() private focusChanged = new Subject<BaseTabComponent>()
private initialized = new Subject<void>()
get tabAdded$ (): Observable<BaseTabComponent> { return this.tabAdded } get tabAdded$ (): Observable<BaseTabComponent> { return this.tabAdded }
get tabRemoved$ (): Observable<BaseTabComponent> { return this.tabRemoved } get tabRemoved$ (): Observable<BaseTabComponent> { return this.tabRemoved }
@@ -177,6 +181,11 @@ export class SplitTabComponent extends BaseTabComponent implements OnInit, OnDes
*/ */
get focusChanged$ (): Observable<BaseTabComponent> { return this.focusChanged } get focusChanged$ (): Observable<BaseTabComponent> { return this.focusChanged }
/**
* Fired once tab layout is created and child tabs can be added
*/
get initialized$ (): Observable<void> { return this.initialized }
/** @hidden */ /** @hidden */
constructor ( constructor (
private hotkeys: HotkeysService, private hotkeys: HotkeysService,
@@ -226,6 +235,13 @@ export class SplitTabComponent extends BaseTabComponent implements OnInit, OnDes
case 'pane-nav-down': case 'pane-nav-down':
this.navigate('b') this.navigate('b')
break break
case 'pane-maximize':
if (this.maximizedTab) {
this.maximize(null)
} else if (this.getAllTabs().length > 1) {
this.maximize(this.focusedTab)
}
break
case 'close-pane': case 'close-pane':
this.removeTab(this.focusedTab) this.removeTab(this.focusedTab)
break break
@@ -234,7 +250,7 @@ export class SplitTabComponent extends BaseTabComponent implements OnInit, OnDes
} }
/** @hidden */ /** @hidden */
async ngOnInit () { async ngAfterViewInit (): Promise<void> {
if (this._recoveredState) { if (this._recoveredState) {
await this.recoverContainer(this.root, this._recoveredState) await this.recoverContainer(this.root, this._recoveredState)
this.layout() this.layout()
@@ -245,15 +261,17 @@ export class SplitTabComponent extends BaseTabComponent implements OnInit, OnDes
} }
}) })
} }
this.initialized.next()
this.initialized.complete()
} }
/** @hidden */ /** @hidden */
ngOnDestroy () { ngOnDestroy (): void {
this.hotkeysSubscription.unsubscribe() this.hotkeysSubscription.unsubscribe()
} }
/** @returns Flat list of all sub-tabs */ /** @returns Flat list of all sub-tabs */
getAllTabs () { getAllTabs (): BaseTabComponent[] {
return this.root.getAllTabs() return this.root.getAllTabs()
} }
@@ -261,7 +279,11 @@ export class SplitTabComponent extends BaseTabComponent implements OnInit, OnDes
return this.focusedTab return this.focusedTab
} }
focus (tab: BaseTabComponent) { getMaximizedTab (): BaseTabComponent|null {
return this.maximizedTab
}
focus (tab: BaseTabComponent): void {
this.focusedTab = tab this.focusedTab = tab
for (const x of this.getAllTabs()) { for (const x of this.getAllTabs()) {
if (x !== tab) { if (x !== tab) {
@@ -272,13 +294,22 @@ export class SplitTabComponent extends BaseTabComponent implements OnInit, OnDes
tab.emitFocused() tab.emitFocused()
this.focusChanged.next(tab) this.focusChanged.next(tab)
} }
if (this.maximizedTab !== tab) {
this.maximizedTab = null
}
this.layout()
}
maximize (tab: BaseTabComponent|null): void {
this.maximizedTab = tab
this.layout() this.layout()
} }
/** /**
* Focuses the first available tab inside the given [[SplitContainer]] * Focuses the first available tab inside the given [[SplitContainer]]
*/ */
focusAnyIn (parent: BaseTabComponent | SplitContainer) { focusAnyIn (parent: BaseTabComponent | SplitContainer): void {
if (!parent) { if (!parent) {
return return
} }
@@ -292,7 +323,9 @@ export class SplitTabComponent extends BaseTabComponent implements OnInit, OnDes
/** /**
* Inserts a new `tab` to the `side` of the `relative` tab * Inserts a new `tab` to the `side` of the `relative` tab
*/ */
addTab (tab: BaseTabComponent, relative: BaseTabComponent|null, side: SplitDirection) { async addTab (tab: BaseTabComponent, relative: BaseTabComponent|null, side: SplitDirection): Promise<void> {
await this.initialized$.toPromise()
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
@@ -331,7 +364,7 @@ export class SplitTabComponent extends BaseTabComponent implements OnInit, OnDes
}) })
} }
removeTab (tab: BaseTabComponent) { removeTab (tab: BaseTabComponent): void {
const parent = this.getParentOf(tab) const parent = this.getParentOf(tab)
if (!parent) { if (!parent) {
return return
@@ -356,7 +389,7 @@ export class SplitTabComponent extends BaseTabComponent implements OnInit, OnDes
/** /**
* Moves focus in the given direction * Moves focus in the given direction
*/ */
navigate (dir: SplitDirection) { navigate (dir: SplitDirection): void {
let rel: BaseTabComponent | SplitContainer = this.focusedTab let rel: BaseTabComponent | SplitContainer = this.focusedTab
let parent = this.getParentOf(rel) let parent = this.getParentOf(rel)
if (!parent) { if (!parent) {
@@ -389,11 +422,12 @@ export class SplitTabComponent extends BaseTabComponent implements OnInit, OnDes
} }
} }
async splitTab (tab: BaseTabComponent, dir: SplitDirection) { async splitTab (tab: BaseTabComponent, dir: SplitDirection): Promise<BaseTabComponent|null> {
const newTab = await this.tabsService.duplicate(tab) const newTab = await this.tabsService.duplicate(tab)
if (newTab) { if (newTab) {
this.addTab(newTab, tab, dir) this.addTab(newTab, tab, dir)
} }
return newTab
} }
/** /**
@@ -431,11 +465,18 @@ export class SplitTabComponent extends BaseTabComponent implements OnInit, OnDes
} }
/** @hidden */ /** @hidden */
onSpannerAdjusted (spanner: SplitSpannerInfo) { onSpannerAdjusted (spanner: SplitSpannerInfo): void {
this.layout() this.layout()
this.splitAdjusted.next(spanner) this.splitAdjusted.next(spanner)
} }
destroy (): void {
super.destroy()
for (const x of this.getAllTabs()) {
x.destroy()
}
}
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)
@@ -486,13 +527,21 @@ export class SplitTabComponent extends BaseTabComponent implements OnInit, OnDes
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 element = this.viewRefs.get(child)!.rootNodes[0]
element.style.position = 'absolute' element.classList.toggle('child', true)
element.classList.toggle('maximized', child === this.maximizedTab)
element.classList.toggle('minimized', this.maximizedTab && child !== this.maximizedTab)
element.classList.toggle('focused', 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}%`
element.style.height = `${childH}%` element.style.height = `${childH}%`
element.style.opacity = child === this.focusedTab ? 1 : 0.75 if (child === this.maximizedTab) {
element.style.left = '5%'
element.style.top = '5%'
element.style.width = '90%'
element.style.height = '90%'
}
} }
offset += sizes[i] offset += sizes[i]
@@ -526,13 +575,17 @@ export class SplitTabComponent extends BaseTabComponent implements OnInit, OnDes
} }
} }
} }
while (root.ratios.length < root.children.length) {
root.ratios.push(1)
}
root.normalize()
} }
} }
/** @hidden */ /** @hidden */
@Injectable() @Injectable()
export class SplitTabRecoveryProvider extends TabRecoveryProvider { export class SplitTabRecoveryProvider extends TabRecoveryProvider {
async recover (recoveryToken: any): Promise<RecoveredTab|null> { async recover (recoveryToken: RecoveryToken): Promise<RecoveredTab|null> {
if (recoveryToken && recoveryToken.type === 'app:split-tab') { if (recoveryToken && recoveryToken.type === 'app:split-tab') {
return { return {
type: SplitTabComponent, type: SplitTabComponent,

View File

@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Component, Input, HostBinding, ElementRef, Output, EventEmitter } from '@angular/core' import { Component, Input, HostBinding, ElementRef, Output, EventEmitter } from '@angular/core'
import { SplitContainer } from './splitTab.component' import { SplitContainer } from './splitTab.component'
@@ -16,13 +17,17 @@ export class SplitTabSpannerComponent {
@HostBinding('class.v') isVertical = true @HostBinding('class.v') isVertical = true
@HostBinding('style.left') cssLeft: string @HostBinding('style.left') cssLeft: string
@HostBinding('style.top') cssTop: string @HostBinding('style.top') cssTop: string
@HostBinding('style.width') cssWidth: string @HostBinding('style.width') cssWidth: string | null
@HostBinding('style.height') cssHeight: string @HostBinding('style.height') cssHeight: string | null
private marginOffset = -5 private marginOffset = -5
constructor (private element: ElementRef) { } constructor (private element: ElementRef) { }
ngAfterViewInit () { ngAfterViewInit () {
this.element.nativeElement.addEventListener('dblclick', () => {
this.reset()
})
this.element.nativeElement.addEventListener('mousedown', (e: MouseEvent) => { this.element.nativeElement.addEventListener('mousedown', (e: MouseEvent) => {
this.isActive = true this.isActive = true
const start = this.isVertical ? e.pageY : e.pageX const start = this.isVertical ? e.pageY : e.pageX
@@ -49,14 +54,16 @@ export class SplitTabSpannerComponent {
diff = Math.max(diff, -this.container.ratios[this.index - 1] + 0.1) diff = Math.max(diff, -this.container.ratios[this.index - 1] + 0.1)
diff = Math.min(diff, this.container.ratios[this.index] - 0.1) diff = Math.min(diff, this.container.ratios[this.index] - 0.1)
this.container.ratios[this.index - 1] += diff if (diff) {
this.container.ratios[this.index] -= diff this.container.ratios[this.index - 1] += diff
this.change.emit() this.container.ratios[this.index] -= diff
this.change.emit()
}
} }
document.addEventListener('mouseup', offHandler) document.addEventListener('mouseup', offHandler, { passive: true })
this.element.nativeElement.parentElement.addEventListener('mousemove', dragHandler) this.element.nativeElement.parentElement.addEventListener('mousemove', dragHandler)
}) }, { passive: true })
} }
ngOnChanges () { ngOnChanges () {
@@ -79,10 +86,17 @@ export class SplitTabSpannerComponent {
} }
} }
reset () {
const ratio = (this.container.ratios[this.index - 1] + this.container.ratios[this.index]) / 2
this.container.ratios[this.index - 1] = ratio
this.container.ratios[this.index] = ratio
this.change.emit()
}
private setDimensions (x: number, y: number, w: number, h: number) { private setDimensions (x: number, y: number, w: number, h: number) {
this.cssLeft = `${x}%` this.cssLeft = `${x}%`
this.cssTop = `${y}%` this.cssTop = `${y}%`
this.cssWidth = w ? `${w}%` : 'initial' this.cssWidth = w ? `${w}%` : null
this.cssHeight = h ? `${h}%` : 'initial' this.cssHeight = h ? `${h}%` : null
} }
} }

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,3 +1,4 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Component, Input, ViewChild, HostBinding, ViewContainerRef, OnChanges } from '@angular/core' import { Component, Input, ViewChild, HostBinding, ViewContainerRef, OnChanges } from '@angular/core'
import { BaseTabComponent } from '../components/baseTab.component' import { BaseTabComponent } from '../components/baseTab.component'

View File

@@ -20,7 +20,7 @@ $tabs-height: 38px;
cursor: -webkit-grab; cursor: -webkit-grab;
margin-left: 10px; margin-left: 10px;
width: 20px; width: 22px;
border-radius: 10px; border-radius: 10px;
text-align: center; text-align: center;
transition: 0.25s all; transition: 0.25s all;

View File

@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Component, Input, Optional, Inject, HostBinding, HostListener, ViewChild, ElementRef } from '@angular/core' import { Component, Input, Optional, Inject, HostBinding, HostListener, ViewChild, ElementRef } from '@angular/core'
import { SortableComponent } from 'ng2-dnd' import { SortableComponent } from 'ng2-dnd'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
@@ -48,14 +49,17 @@ export class TabHeaderComponent {
} }
ngOnInit () { ngOnInit () {
if (this.hostApp.platform === Platform.macOS) {
this.parentDraggable.setDragHandle(this.handle.nativeElement)
}
this.tab.progress$.subscribe(progress => { this.tab.progress$.subscribe(progress => {
this.progress = progress this.progress = progress
}) })
} }
ngAfterViewInit () {
if (this.hostApp.platform === Platform.macOS) {
this.parentDraggable.setDragHandle(this.handle.nativeElement)
}
}
showRenameTabModal (): void { showRenameTabModal (): void {
const modal = this.ngbModal.open(RenameTabModalComponent) const modal = this.ngbModal.open(RenameTabModalComponent)
modal.componentInstance.value = this.tab.customTitle || this.tab.title modal.componentInstance.value = this.tab.customTitle || this.tab.title

View File

@@ -1,19 +1,29 @@
.mb-4 .container.mt-5.mb-5
.terminus-logo .mb-4
h1.terminus-title Terminus .terminus-logo
sup α h1.terminus-title Terminus
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 us track the number of Terminus installs across the world!
toggle( toggle([(ngModel)]='config.store.enableAnalytics')
[(ngModel)]='config.store.enableAnalytics',
(ngModelChange)='config.save(); config.requestRestart()', .form-line
) .header
.title Enable SSH plugin
.description Adds an SSH connection manager UI to Terminus
toggle([(ngModel)]='enableSSH')
.form-line
.header
.title Enable Serial plugin
.description Allows attaching Terminus to serial ports
toggle([(ngModel)]='enableSerial')
.text-center.mt-5 .text-center.mt-5
button.btn.btn-primary((click)='closeAndDisable()') Close and never show again button.btn.btn-primary((click)='closeAndDisable()') Close and never show again

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

@@ -1,7 +1,8 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Component } from '@angular/core' import { Component } from '@angular/core'
import { BaseTabComponent } from './baseTab.component' import { BaseTabComponent } from './baseTab.component'
import { ConfigService } from '../services/config.service' import { ConfigService } from '../services/config.service'
import { AppService } from '../services/app.service' import { HostAppService } from '../services/hostApp.service'
/** @hidden */ /** @hidden */
@Component({ @Component({
@@ -10,17 +11,29 @@ import { AppService } from '../services/app.service'
styles: [require('./welcomeTab.component.scss')], styles: [require('./welcomeTab.component.scss')],
}) })
export class WelcomeTabComponent extends BaseTabComponent { export class WelcomeTabComponent extends BaseTabComponent {
enableSSH = false
enableSerial = false
constructor ( constructor (
private app: AppService, private hostApp: HostAppService,
public config: ConfigService, public config: ConfigService,
) { ) {
super() super()
this.setTitle('Welcome') this.setTitle('Welcome')
this.enableSSH = !config.store.pluginBlacklist.includes('ssh')
this.enableSerial = !config.store.pluginBlacklist.includes('serial')
} }
closeAndDisable () { closeAndDisable () {
this.config.store.enableWelcomeTab = false this.config.store.enableWelcomeTab = false
this.config.store.pluginBlacklist = []
if (!this.enableSSH) {
this.config.store.pluginBlacklist.push('ssh')
}
if (!this.enableSerial) {
this.config.store.pluginBlacklist.push('serial')
}
this.config.save() this.config.save()
this.app.closeTab(this) this.hostApp.getWindow().reload()
} }
} }

View File

@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Component } from '@angular/core' import { Component } from '@angular/core'
import { HostAppService } from '../services/hostApp.service' import { HostAppService } from '../services/hostApp.service'
import { AppService } from '../services/app.service' import { AppService } from '../services/app.service'
@@ -9,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'
@@ -16,6 +18,10 @@ hotkeys:
previous-tab: previous-tab:
- 'Ctrl-Shift-Left' - 'Ctrl-Shift-Left'
- 'Ctrl-Shift-Tab' - 'Ctrl-Shift-Tab'
move-tab-left:
- 'Ctrl-Shift-PageUp'
move-tab-right:
- 'Ctrl-Shift-PageDown'
tab-1: tab-1:
- 'Alt-1' - 'Alt-1'
tab-2: tab-2:
@@ -50,5 +56,7 @@ hotkeys:
- 'Ctrl-Alt-Up' - 'Ctrl-Alt-Up'
pane-nav-left: pane-nav-left:
- 'Ctrl-Alt-Left' - 'Ctrl-Alt-Left'
pane-maximize:
- 'Ctrl-Alt-Enter'
close-pane: [] close-pane: []
pluginBlacklist: ['ssh'] pluginBlacklist: ['ssh']

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'
@@ -14,6 +16,10 @@ hotkeys:
- 'Ctrl-Tab' - 'Ctrl-Tab'
previous-tab: previous-tab:
- 'Ctrl-Shift-Tab' - 'Ctrl-Shift-Tab'
move-tab-left:
- '⌘-Shift-Left'
move-tab-right:
- '⌘-Shift-Right'
tab-1: tab-1:
- '⌘-1' - '⌘-1'
tab-2: tab-2:
@@ -48,6 +54,8 @@ hotkeys:
- '⌘-⌥-Up' - '⌘-⌥-Up'
pane-nav-left: pane-nav-left:
- '⌘-⌥-Left' - '⌘-⌥-Left'
pane-maximize:
- '⌘-⌥-Enter'
close-pane: close-pane:
- '⌘-Shift-W' - '⌘-Shift-W'
pluginBlacklist: ['ssh'] pluginBlacklist: ['ssh']

View File

@@ -5,8 +5,11 @@ hotkeys:
- 'Ctrl+Space' - 'Ctrl+Space'
toggle-fullscreen: toggle-fullscreen:
- 'F11' - 'F11'
- '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'
@@ -16,6 +19,10 @@ hotkeys:
previous-tab: previous-tab:
- 'Ctrl-Shift-Left' - 'Ctrl-Shift-Left'
- 'Ctrl-Shift-Tab' - 'Ctrl-Shift-Tab'
move-tab-left:
- 'Ctrl-Shift-PageUp'
move-tab-right:
- 'Ctrl-Shift-PageDown'
tab-1: tab-1:
- 'Alt-1' - 'Alt-1'
tab-2: tab-2:
@@ -50,5 +57,7 @@ hotkeys:
- 'Ctrl-Alt-Up' - 'Ctrl-Alt-Up'
pane-nav-left: pane-nav-left:
- 'Ctrl-Alt-Left' - 'Ctrl-Alt-Left'
pane-maximize:
- 'Ctrl-Alt-Enter'
close-pane: [] close-pane: []
pluginBlacklist: [] pluginBlacklist: []

View File

@@ -8,7 +8,7 @@ appearance:
frame: thin frame: thin
css: '/* * { color: blue !important; } */' css: '/* * { color: blue !important; } */'
opacity: 1.0 opacity: 1.0
vibrancy: false vibrancy: true
vibrancyType: 'blur' vibrancyType: 'blur'
enableAnalytics: true enableAnalytics: true
enableWelcomeTab: true enableWelcomeTab: true

View File

@@ -7,7 +7,7 @@ import { Directive, AfterViewInit, ElementRef } from '@angular/core'
export class AutofocusDirective implements AfterViewInit { export class AutofocusDirective implements AfterViewInit {
constructor (private el: ElementRef) { } constructor (private el: ElementRef) { }
ngAfterViewInit () { ngAfterViewInit (): void {
this.el.nativeElement.blur() this.el.nativeElement.blur()
setTimeout(() => { setTimeout(() => {
this.el.nativeElement.focus() this.el.nativeElement.focus()

View File

@@ -0,0 +1,14 @@
import { Directive, Input, ElementRef, OnChanges } from '@angular/core'
/** @hidden */
@Directive({
selector: '[fastHtmlBind]',
})
export class FastHtmlBindDirective implements OnChanges {
@Input() fastHtmlBind: string
constructor (private el: ElementRef) { }
ngOnChanges (): void {
this.el.nativeElement.innerHTML = this.fastHtmlBind || ''
}
}

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',
@@ -37,6 +41,14 @@ export class AppHotkeyProvider extends HotkeyProvider {
id: 'previous-tab', id: 'previous-tab',
name: 'Previous tab', name: 'Previous tab',
}, },
{
id: 'move-tab-left',
name: 'Move tab to the left',
},
{
id: 'move-tab-right',
name: 'Move tab to the right',
},
{ {
id: 'tab-1', id: 'tab-1',
name: 'Tab 1', name: 'Tab 1',
@@ -93,6 +105,10 @@ export class AppHotkeyProvider extends HotkeyProvider {
id: 'split-top', id: 'split-top',
name: 'Split to the top', name: 'Split to the top',
}, },
{
id: 'pane-maximize',
name: 'Maximize the active pane',
},
{ {
id: 'pane-nav-up', id: 'pane-nav-up',
name: 'Focus the pane above', name: 'Focus the pane above',

View File

@@ -16,11 +16,13 @@ import { TitleBarComponent } from './components/titleBar.component'
import { ToggleComponent } from './components/toggle.component' import { ToggleComponent } from './components/toggle.component'
import { WindowControlsComponent } from './components/windowControls.component' import { WindowControlsComponent } from './components/windowControls.component'
import { RenameTabModalComponent } from './components/renameTabModal.component' import { RenameTabModalComponent } from './components/renameTabModal.component'
import { SelectorModalComponent } from './components/selectorModal.component'
import { SplitTabComponent, SplitTabRecoveryProvider } from './components/splitTab.component' import { SplitTabComponent, SplitTabRecoveryProvider } from './components/splitTab.component'
import { SplitTabSpannerComponent } from './components/splitTabSpanner.component' import { SplitTabSpannerComponent } from './components/splitTabSpanner.component'
import { WelcomeTabComponent } from './components/welcomeTab.component' import { WelcomeTabComponent } from './components/welcomeTab.component'
import { AutofocusDirective } from './directives/autofocus.directive' import { AutofocusDirective } from './directives/autofocus.directive'
import { FastHtmlBindDirective } from './directives/fastHtmlBind.directive'
import { HotkeyProvider } from './api/hotkeyProvider' import { HotkeyProvider } from './api/hotkeyProvider'
import { ConfigProvider } from './api/configProvider' import { ConfigProvider } from './api/configProvider'
@@ -64,7 +66,7 @@ const PROVIDERS = [
BrowserModule, BrowserModule,
BrowserAnimationsModule, BrowserAnimationsModule,
FormsModule, FormsModule,
NgbModule.forRoot(), NgbModule,
PerfectScrollbarModule, PerfectScrollbarModule,
DndModule.forRoot(), DndModule.forRoot(),
], ],
@@ -80,6 +82,8 @@ const PROVIDERS = [
RenameTabModalComponent, RenameTabModalComponent,
SafeModeModalComponent, SafeModeModalComponent,
AutofocusDirective, AutofocusDirective,
FastHtmlBindDirective,
SelectorModalComponent,
SplitTabComponent, SplitTabComponent,
SplitTabSpannerComponent, SplitTabSpannerComponent,
WelcomeTabComponent, WelcomeTabComponent,
@@ -87,6 +91,7 @@ const PROVIDERS = [
entryComponents: [ entryComponents: [
RenameTabModalComponent, RenameTabModalComponent,
SafeModeModalComponent, SafeModeModalComponent,
SelectorModalComponent,
SplitTabComponent, SplitTabComponent,
WelcomeTabComponent, WelcomeTabComponent,
], ],

View File

@@ -2,9 +2,13 @@
import { Observable, Subject, AsyncSubject } from 'rxjs' import { Observable, Subject, AsyncSubject } from 'rxjs'
import { takeUntil } from 'rxjs/operators' import { takeUntil } from 'rxjs/operators'
import { Injectable } from '@angular/core' import { Injectable } from '@angular/core'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { BaseTabComponent } from '../components/baseTab.component' 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 { 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'
@@ -46,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>()
@@ -64,38 +69,53 @@ 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,
) { ) {
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()
}
}
}
startTabStorage () {
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) { addTabRaw (tab: BaseTabComponent, index: number|null = null): void {
this.tabs.push(tab) if (index !== null) {
this.tabs.splice(index, 0, tab)
} else {
this.tabs.push(tab)
}
this.selectTab(tab) this.selectTab(tab)
this.tabsChanged.next() this.tabsChanged.next()
this.tabOpened.next(tab) this.tabOpened.next(tab)
@@ -121,13 +141,18 @@ export class AppService {
this.tabsChanged.next() this.tabsChanged.next()
this.tabClosed.next(tab) this.tabClosed.next(tab)
}) })
if (tab instanceof SplitTabComponent) {
tab.tabAdded$.subscribe(() => this.emitTabsChanged())
tab.tabRemoved$.subscribe(() => this.emitTabsChanged())
}
} }
/** /**
* Adds a new tab **without** wrapping it in a SplitTabComponent * Adds a new tab **without** wrapping it in a SplitTabComponent
* @param inputs Properties to be assigned on the new tab component instance * @param inputs Properties to be assigned on the new tab component instance
*/ */
openNewTabRaw (type: TabComponentType, inputs?: any): BaseTabComponent { openNewTabRaw (type: TabComponentType, inputs?: Record<string, any>): BaseTabComponent {
const tab = this.tabsService.create(type, inputs) const tab = this.tabsService.create(type, inputs)
this.addTabRaw(tab) this.addTabRaw(tab)
return tab return tab
@@ -137,7 +162,7 @@ export class AppService {
* Adds a new tab while wrapping it in a SplitTabComponent * Adds a new tab while wrapping it in a SplitTabComponent
* @param inputs Properties to be assigned on the new tab component instance * @param inputs Properties to be assigned on the new tab component instance
*/ */
openNewTab (type: TabComponentType, inputs?: any): BaseTabComponent { openNewTab (type: TabComponentType, inputs?: Record<string, any>): BaseTabComponent {
const splitTab = this.tabsService.create(SplitTabComponent) as SplitTabComponent const splitTab = this.tabsService.create(SplitTabComponent) as SplitTabComponent
const tab = this.tabsService.create(type, inputs) const tab = this.tabsService.create(type, inputs)
splitTab.addTab(tab, null, 'r') splitTab.addTab(tab, null, 'r')
@@ -145,7 +170,24 @@ export class AppService {
return tab return tab
} }
selectTab (tab: BaseTabComponent) { 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 {
if (this._activeTab === tab) { if (this._activeTab === tab) {
this._activeTab.emitFocused() this._activeTab.emitFocused()
return return
@@ -169,15 +211,26 @@ export class AppService {
} }
} }
getParentTab (tab: BaseTabComponent): SplitTabComponent|null {
for (const topLevelTab of this.tabs) {
if (topLevelTab instanceof SplitTabComponent) {
if (topLevelTab.getAllTabs().includes(tab)) {
return topLevelTab
}
}
}
return null
}
/** Switches between the current tab and the previously active one */ /** Switches between the current tab and the previously active one */
toggleLastTab () { toggleLastTab (): void {
if (!this.lastTabIndex || this.lastTabIndex >= this.tabs.length) { if (!this.lastTabIndex || this.lastTabIndex >= this.tabs.length) {
this.lastTabIndex = 0 this.lastTabIndex = 0
} }
this.selectTab(this.tabs[this.lastTabIndex]) this.selectTab(this.tabs[this.lastTabIndex])
} }
nextTab () { nextTab (): void {
if (this.tabs.length > 1) { if (this.tabs.length > 1) {
const tabIndex = this.tabs.indexOf(this._activeTab) const tabIndex = this.tabs.indexOf(this._activeTab)
if (tabIndex < this.tabs.length - 1) { if (tabIndex < this.tabs.length - 1) {
@@ -188,7 +241,7 @@ export class AppService {
} }
} }
previousTab () { previousTab (): void {
if (this.tabs.length > 1) { if (this.tabs.length > 1) {
const tabIndex = this.tabs.indexOf(this._activeTab) const tabIndex = this.tabs.indexOf(this._activeTab)
if (tabIndex > 0) { if (tabIndex > 0) {
@@ -199,8 +252,37 @@ export class AppService {
} }
} }
moveSelectedTabLeft (): void {
if (this.tabs.length > 1) {
const tabIndex = this.tabs.indexOf(this._activeTab)
if (tabIndex > 0) {
this.swapTabs(this._activeTab, this.tabs[tabIndex - 1])
} else if (this.config.store.appearance.cycleTabs) {
this.swapTabs(this._activeTab, this.tabs[this.tabs.length - 1])
}
}
}
moveSelectedTabRight (): void {
if (this.tabs.length > 1) {
const tabIndex = this.tabs.indexOf(this._activeTab)
if (tabIndex < this.tabs.length - 1) {
this.swapTabs(this._activeTab, this.tabs[tabIndex + 1])
} else if (this.config.store.appearance.cycleTabs) {
this.swapTabs(this._activeTab, this.tabs[0])
}
}
}
swapTabs (a: BaseTabComponent, b: BaseTabComponent): void {
const i1 = this.tabs.indexOf(a)
const i2 = this.tabs.indexOf(b)
this.tabs[i1] = b
this.tabs[i2] = a
}
/** @hidden */ /** @hidden */
emitTabsChanged () { emitTabsChanged (): void {
this.tabsChanged.next() this.tabsChanged.next()
} }
@@ -214,11 +296,12 @@ export class AppService {
tab.destroy() tab.destroy()
} }
async duplicateTab (tab: BaseTabComponent) { async duplicateTab (tab: BaseTabComponent): Promise<BaseTabComponent|null> {
const dup = await this.tabsService.duplicate(tab) const dup = await this.tabsService.duplicate(tab)
if (dup) { if (dup) {
this.addTabRaw(dup) this.addTabRaw(dup, this.tabs.indexOf(tab) + 1)
} }
return dup
} }
/** /**
@@ -236,8 +319,18 @@ 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 () { emitReady (): void {
this.ready.next() this.ready.next()
this.ready.complete() this.ready.complete()
this.hostApp.emitReady() this.hostApp.emitReady()
@@ -258,7 +351,15 @@ export class AppService {
return this.completionObservers.get(tab)!.done$ return this.completionObservers.get(tab)!.done$
} }
stopObservingTabCompletion (tab: BaseTabComponent) { stopObservingTabCompletion (tab: BaseTabComponent): void {
this.completionObservers.delete(tab) this.completionObservers.delete(tab)
} }
showSelector <T> (name: string, options: SelectorOption<T>[]): Promise<T> {
const modal = this.ngbModal.open(SelectorModalComponent)
const instance: SelectorModalComponent<T> = modal.componentInstance
instance.name = name
instance.options = options
return modal.result as Promise<T>
}
} }

View File

@@ -20,7 +20,7 @@ function isNonStructuralObjectMember (v): boolean {
/** @hidden */ /** @hidden */
export class ConfigProxy { export class ConfigProxy {
constructor (real: any, defaults: any) { constructor (real: Record<string, any>, defaults: Record<string, any>) {
for (const key in defaults) { for (const key in defaults) {
if (isStructuralMember(defaults[key])) { if (isStructuralMember(defaults[key])) {
if (!real[key]) { if (!real[key]) {
@@ -71,8 +71,10 @@ export class ConfigProxy {
} }
} }
getValue (_key: string): any { } // eslint-disable-line @typescript-eslint/no-empty-function // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-empty-function
setValue (_key: string, _value: any) { } // eslint-disable-line @typescript-eslint/no-empty-function getValue (_key: string): any { }
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-empty-function
setValue (_key: string, _value: any) { }
} }
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
@@ -100,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[],
@@ -124,8 +126,23 @@ export class ConfigService {
}) })
} }
getDefaults () { getDefaults (): Record<string, any> {
return this.defaults const cleanup = o => {
if (o instanceof Array) {
return o.map(cleanup)
} else if (o instanceof Object) {
const r = {}
for (const k of Object.keys(o)) {
if (k !== '__nonStructural') {
r[k] = cleanup(o[k])
}
}
return r
} else {
return o
}
}
return cleanup(this.defaults)
} }
load (): void { load (): void {
@@ -138,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)
} }
/** /**
@@ -173,11 +192,11 @@ export class ConfigService {
enabledServices<T extends object> (services: T[]): T[] { enabledServices<T extends object> (services: T[]): T[] {
if (!this.servicesCache) { if (!this.servicesCache) {
this.servicesCache = {} this.servicesCache = {}
const ngModule = window['rootModule'].ngInjectorDef const ngModule = window['rootModule'].ɵinj
for (const imp of ngModule.imports) { for (const imp of ngModule.imports) {
const module = imp['ngModule'] || imp const module = imp['ngModule'] || imp
if (module.ngInjectorDef && module.ngInjectorDef.providers) { if (module.ɵinj?.providers) {
this.servicesCache[module['pluginName']] = module.ngInjectorDef.providers.map(provider => { this.servicesCache[module['pluginName']] = module.ɵinj.providers.map(provider => {
return provider['useClass'] || provider return provider['useClass'] || provider
}) })
} }

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,
@@ -15,7 +15,7 @@ export class DockingService {
electron.screen.on('display-metrics-changed', () => this.repositionWindow()) electron.screen.on('display-metrics-changed', () => this.repositionWindow())
} }
dock () { dock (): void {
const dockSide = this.config.store.appearance.dock const dockSide = this.config.store.appearance.dock
if (dockSide === 'off') { if (dockSide === 'off') {
@@ -59,16 +59,17 @@ export class DockingService {
}) })
} }
getCurrentScreen () { getCurrentScreen (): Electron.Display {
return this.electron.screen.getDisplayNearestPoint(this.electron.screen.getCursorScreenPoint()) return this.electron.screen.getDisplayNearestPoint(this.electron.screen.getCursorScreenPoint())
} }
getScreens () { getScreens (): Electron.Display[] {
const primaryDisplayID = this.electron.screen.getPrimaryDisplay().id const primaryDisplayID = this.electron.screen.getPrimaryDisplay().id
return this.electron.screen.getAllDisplays().sort((a, b) => return this.electron.screen.getAllDisplays().sort((a, b) =>
a.bounds.x === b.bounds.x ? a.bounds.y - b.bounds.y : a.bounds.x - b.bounds.x a.bounds.x === b.bounds.x ? a.bounds.y - b.bounds.y : a.bounds.x - b.bounds.x
).map((display,index) => { ).map((display, index) => {
return { return {
...display,
id: display.id, id: display.id,
name: display.id === primaryDisplayID ? 'Primary Display' : `Display ${index +1}`, name: display.id === primaryDisplayID ? 'Primary Display' : `Display ${index +1}`,
} }

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 () {
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

@@ -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,
) { ) {
@@ -22,24 +22,29 @@ export class HomeBaseService {
} }
} }
openGitHub () { openGitHub (): void {
this.electron.shell.openExternal('https://github.com/eugeny/terminus') this.electron.shell.openExternal('https://github.com/eugeny/terminus')
} }
reportBug () { reportBug (): void {
let body = `Version: ${this.appVersion}\n` let body = `Version: ${this.appVersion}\n`
body += `Platform: ${os.platform()} ${os.release()}\n` body += `Platform: ${os.platform()} ${os.release()}\n`
const label = { const label = {
aix: 'OS: IBM AIX',
android: 'OS: Android',
darwin: 'OS: macOS', darwin: 'OS: macOS',
windows: 'OS: Windows', freebsd: 'OS: FreeBSD',
linux: 'OS: Linux', linux: 'OS: Linux',
openbsd: 'OS: OpenBSD',
sunos: 'OS: Solaris',
win32: 'OS: Windows',
}[os.platform()] }[os.platform()]
const plugins = (window as any).installedPlugins.filter(x => !x.isBuiltin).map(x => x.name) const plugins = (window as any).installedPlugins.filter(x => !x.isBuiltin).map(x => x.name)
body += `Plugins: ${plugins.join(', ') || 'none'}\n\n` body += `Plugins: ${plugins.join(', ') || 'none'}\n\n`
this.electron.shell.openExternal(`https://github.com/eugeny/terminus/issues/new?body=${encodeURIComponent(body)}&labels=${label}`) this.electron.shell.openExternal(`https://github.com/eugeny/terminus/issues/new?body=${encodeURIComponent(body)}&labels=${label}`)
} }
enableAnalytics () { enableAnalytics (): void {
if (!window.localStorage.analyticsUserID) { if (!window.localStorage.analyticsUserID) {
window.localStorage.analyticsUserID = uuidv4() window.localStorage.analyticsUserID = uuidv4()
} }
@@ -51,7 +56,7 @@ export class HomeBaseService {
this.mixpanel.track('launch', this.getAnalyticsProperties()) this.mixpanel.track('launch', this.getAnalyticsProperties())
} }
getAnalyticsProperties () { getAnalyticsProperties (): Record<string, string> {
return { return {
distinct_id: window.localStorage.analyticsUserID, // eslint-disable-line @typescript-eslint/camelcase distinct_id: window.localStorage.analyticsUserID, // eslint-disable-line @typescript-eslint/camelcase
platform: process.platform, platform: process.platform,

View File

@@ -4,6 +4,7 @@ import { Observable, Subject } from 'rxjs'
import { Injectable, NgZone, EventEmitter } from '@angular/core' import { Injectable, NgZone, EventEmitter } from '@angular/core'
import { ElectronService } from './electron.service' import { ElectronService } from './electron.service'
import { Logger, LogService } from './log.service' import { Logger, LogService } from './log.service'
import { isWindowsBuild, WIN_BUILD_FLUENT_BG_MOVE_BUG_FIXED, WIN_BUILD_FLUENT_BG_SUPPORTED } from '../utils'
export enum Platform { export enum Platform {
Linux, macOS, Windows, Linux, macOS, Windows,
@@ -39,6 +40,7 @@ export class HostAppService {
private configChangeBroadcast = new Subject<void>() private configChangeBroadcast = new Subject<void>()
private windowCloseRequest = new Subject<void>() private windowCloseRequest = new Subject<void>()
private windowMoved = new Subject<void>() private windowMoved = new Subject<void>()
private windowFocused = new Subject<void>()
private displayMetricsChanged = new Subject<void>() private displayMetricsChanged = new Subject<void>()
private logger: Logger private logger: Logger
private windowId: number private windowId: number
@@ -85,6 +87,8 @@ export class HostAppService {
get windowMoved$ (): Observable<void> { return this.windowMoved } get windowMoved$ (): Observable<void> { return this.windowMoved }
get windowFocused$ (): Observable<void> { return this.windowFocused }
get displayMetricsChanged$ (): Observable<void> { return this.displayMetricsChanged } get displayMetricsChanged$ (): Observable<void> { return this.displayMetricsChanged }
private constructor ( private constructor (
@@ -128,6 +132,10 @@ export class HostAppService {
this.zone.run(() => this.windowMoved.next()) this.zone.run(() => this.windowMoved.next())
}) })
electron.ipcRenderer.on('host:window-focused', () => {
this.zone.run(() => this.windowFocused.next())
})
electron.ipcRenderer.on('host:display-metrics-changed', () => { electron.ipcRenderer.on('host:display-metrics-changed', () => {
this.zone.run(() => this.displayMetricsChanged.next()) this.zone.run(() => this.displayMetricsChanged.next())
}) })
@@ -157,53 +165,60 @@ export class HostAppService {
electron.ipcRenderer.on('host:config-change', () => this.zone.run(() => { electron.ipcRenderer.on('host:config-change', () => this.zone.run(() => {
this.configChangeBroadcast.next() this.configChangeBroadcast.next()
})) }))
if (
isWindowsBuild(WIN_BUILD_FLUENT_BG_SUPPORTED) &&
!isWindowsBuild(WIN_BUILD_FLUENT_BG_MOVE_BUG_FIXED)
) {
electron.ipcRenderer.send('window-set-disable-vibrancy-while-dragging', true)
}
} }
/** /**
* Returns the current remote [[BrowserWindow]] * Returns the current remote [[BrowserWindow]]
*/ */
getWindow () { getWindow (): Electron.BrowserWindow {
return this.electron.BrowserWindow.fromId(this.windowId) return this.electron.BrowserWindow.fromId(this.windowId)
} }
newWindow () { newWindow (): void {
this.electron.ipcRenderer.send('app:new-window') this.electron.ipcRenderer.send('app:new-window')
} }
toggleFullscreen () { toggleFullscreen (): void {
const window = this.getWindow() const window = this.getWindow()
window.setFullScreen(!this.isFullScreen) window.setFullScreen(!this.isFullScreen)
} }
openDevTools () { openDevTools (): void {
this.getWindow().webContents.openDevTools({ mode: 'undocked' }) this.getWindow().webContents.openDevTools({ mode: 'undocked' })
} }
focusWindow () { focusWindow (): void {
this.electron.ipcRenderer.send('window-focus') this.electron.ipcRenderer.send('window-focus')
} }
minimize () { minimize (): void {
this.electron.ipcRenderer.send('window-minimize') this.electron.ipcRenderer.send('window-minimize')
} }
maximize () { maximize (): void {
this.electron.ipcRenderer.send('window-maximize') this.electron.ipcRenderer.send('window-maximize')
} }
unmaximize () { unmaximize (): void {
this.electron.ipcRenderer.send('window-unmaximize') this.electron.ipcRenderer.send('window-unmaximize')
} }
toggleMaximize () { toggleMaximize (): void {
this.electron.ipcRenderer.send('window-toggle-maximize') this.electron.ipcRenderer.send('window-toggle-maximize')
} }
setBounds (bounds: Bounds) { setBounds (bounds: Bounds): void {
this.electron.ipcRenderer.send('window-set-bounds', bounds) this.electron.ipcRenderer.send('window-set-bounds', bounds)
} }
setAlwaysOnTop (flag: boolean) { setAlwaysOnTop (flag: boolean): void {
this.electron.ipcRenderer.send('window-set-always-on-top', flag) this.electron.ipcRenderer.send('window-set-always-on-top', flag)
} }
@@ -212,48 +227,50 @@ export class HostAppService {
* *
* @param type `null`, or `fluent` when supported (Windowd only) * @param type `null`, or `fluent` when supported (Windowd only)
*/ */
setVibrancy (enable: boolean, type: string) { setVibrancy (enable: boolean, type: string|null): void {
if (!isWindowsBuild(WIN_BUILD_FLUENT_BG_SUPPORTED)) {
type = null
}
document.body.classList.toggle('vibrant', enable) document.body.classList.toggle('vibrant', enable)
if (this.platform === Platform.macOS) { this.electron.ipcRenderer.send('window-set-vibrancy', enable, type)
this.getWindow().setVibrancy(enable ? 'dark' : null as any) // electron issue 20269
}
if (this.platform === Platform.Windows) {
this.electron.ipcRenderer.send('window-set-vibrancy', enable, type)
}
} }
setTitle (title: string) { setTitle (title: string): void {
this.electron.ipcRenderer.send('window-set-title', title) this.electron.ipcRenderer.send('window-set-title', title)
} }
setTouchBar (touchBar: Electron.TouchBar) { setTouchBar (touchBar: Electron.TouchBar): void {
this.getWindow().setTouchBar(touchBar) this.getWindow().setTouchBar(touchBar)
} }
popupContextMenu (menuDefinition: Electron.MenuItemConstructorOptions[]) { popupContextMenu (menuDefinition: Electron.MenuItemConstructorOptions[]): void {
this.electron.Menu.buildFromTemplate(menuDefinition).popup({}) this.electron.Menu.buildFromTemplate(menuDefinition).popup({})
} }
/** /**
* Notifies other windows of config file changes * Notifies other windows of config file changes
*/ */
broadcastConfigChange () { broadcastConfigChange (configStore: {[k: string]: any}): void {
this.electron.ipcRenderer.send('app:config-change') this.electron.ipcRenderer.send('app:config-change', configStore)
} }
emitReady () { emitReady (): void {
this.electron.ipcRenderer.send('app:ready') this.electron.ipcRenderer.send('app:ready')
} }
bringToFront () { bringToFront (): void {
this.electron.ipcRenderer.send('window-bring-to-front') this.electron.ipcRenderer.send('window-bring-to-front')
} }
closeWindow () { closeWindow (): void {
this.electron.ipcRenderer.send('window-close') this.electron.ipcRenderer.send('window-close')
} }
relaunch () { registerGlobalHotkey (specs: string[]): void {
this.electron.ipcRenderer.send('app:register-global-hotkey', specs)
}
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 })
} else { } else {
@@ -262,7 +279,7 @@ export class HostAppService {
this.electron.app.exit() this.electron.app.exit()
} }
quit () { quit (): void {
this.logger.info('Quitting') this.logger.info('Quitting')
this.electron.app.quit() this.electron.app.quit()
} }

View File

@@ -1,8 +1,10 @@
import { Injectable, Inject, NgZone, EventEmitter } from '@angular/core' import { Injectable, Inject, NgZone, EventEmitter } from '@angular/core'
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
@@ -20,14 +22,23 @@ interface EventBufferEntry {
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class HotkeysService { export class HotkeysService {
key = new EventEmitter<KeyboardEvent>() key = new EventEmitter<KeyboardEvent>()
/** @hidden */
matchedHotkey = new EventEmitter<string>() matchedHotkey = new EventEmitter<string>()
globalHotkey = new EventEmitter<void>()
/**
* Fired for each recognized hotkey
*/
get hotkey$ (): Observable<string> { return this._hotkey }
private _hotkey = new Subject<string>()
private currentKeystrokes: EventBufferEntry[] = [] private currentKeystrokes: EventBufferEntry[] = []
private disabledLevel = 0 private disabledLevel = 0
private hotkeyDescriptions: HotkeyDescription[] = [] private hotkeyDescriptions: HotkeyDescription[] = []
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[],
@@ -49,6 +60,9 @@ export class HotkeysService {
this.getHotkeyDescriptions().then(hotkeys => { this.getHotkeyDescriptions().then(hotkeys => {
this.hotkeyDescriptions = hotkeys this.hotkeyDescriptions = hotkeys
}) })
// deprecated
this.hotkey$.subscribe(h => this.matchedHotkey.emit(h))
} }
/** /**
@@ -57,7 +71,7 @@ export class HotkeysService {
* @param name DOM event name * @param name DOM event name
* @param nativeEvent event object * @param nativeEvent event object
*/ */
pushKeystroke (name: string, nativeEvent: KeyboardEvent) { pushKeystroke (name: string, nativeEvent: KeyboardEvent): void {
(nativeEvent as any).event = name (nativeEvent as any).event = name
this.currentKeystrokes.push({ event: nativeEvent, time: performance.now() }) this.currentKeystrokes.push({ event: nativeEvent, time: performance.now() })
} }
@@ -65,26 +79,26 @@ export class HotkeysService {
/** /**
* Check the buffer for new complete keystrokes * Check the buffer for new complete keystrokes
*/ */
processKeystrokes () { processKeystrokes (): void {
if (this.isEnabled()) { if (this.isEnabled()) {
this.zone.run(() => { this.zone.run(() => {
const matched = this.getCurrentFullyMatchedHotkey() const matched = this.getCurrentFullyMatchedHotkey()
if (matched) { if (matched) {
console.log('Matched hotkey', matched) console.log('Matched hotkey', matched)
this.matchedHotkey.emit(matched) this._hotkey.next(matched)
this.clearCurrentKeystrokes() this.clearCurrentKeystrokes()
} }
}) })
} }
} }
emitKeyEvent (nativeEvent: KeyboardEvent) { emitKeyEvent (nativeEvent: KeyboardEvent): void {
this.zone.run(() => { this.zone.run(() => {
this.key.emit(nativeEvent) this.key.emit(nativeEvent)
}) })
} }
clearCurrentKeystrokes () { clearCurrentKeystrokes (): void {
this.currentKeystrokes = [] this.currentKeystrokes = []
} }
@@ -142,15 +156,15 @@ export class HotkeysService {
return this.hotkeyDescriptions.filter((x) => x.id === id)[0] return this.hotkeyDescriptions.filter((x) => x.id === id)[0]
} }
enable () { enable (): void {
this.disabledLevel-- this.disabledLevel--
} }
disable () { disable (): void {
this.disabledLevel++ this.disabledLevel++
} }
isEnabled () { isEnabled (): boolean {
return this.disabledLevel === 0 return this.disabledLevel === 0
} }
@@ -169,6 +183,7 @@ 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
@@ -177,13 +192,13 @@ export class HotkeysService {
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 () {
@@ -203,6 +218,9 @@ export class HotkeysService {
if (typeof value === 'string') { if (typeof value === 'string') {
value = [value] value = [value]
} }
if (!(value instanceof Array)) {
continue
}
if (value) { if (value) {
value = value.map((item: string | string[]) => typeof item === 'string' ? [item] : item) value = value.map((item: string | string[]) => typeof item === 'string' ? [item] : item)
keys[key] = value keys[key] = value

View File

@@ -32,27 +32,27 @@ export class Logger {
private name: string, private name: string,
) {} ) {}
debug (...args: any[]) { debug (...args: any[]): void {
this.doLog('debug', ...args) this.doLog('debug', ...args)
} }
info (...args: any[]) { info (...args: any[]): void {
this.doLog('info', ...args) this.doLog('info', ...args)
} }
warn (...args: any[]) { warn (...args: any[]): void {
this.doLog('warn', ...args) this.doLog('warn', ...args)
} }
error (...args: any[]) { error (...args: any[]): void {
this.doLog('error', ...args) this.doLog('error', ...args)
} }
log (...args: any[]) { log (...args: any[]): void {
this.doLog('log', ...args) this.doLog('log', ...args)
} }
private doLog (level: string, ...args: any[]) { private doLog (level: string, ...args: any[]): void {
console[level](`%c[${this.name}]`, 'color: #aaa', ...args) console[level](`%c[${this.name}]`, 'color: #aaa', ...args)
if (this.winstonLogger) { if (this.winstonLogger) {
this.winstonLogger[level](...args) this.winstonLogger[level](...args)
@@ -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

@@ -8,7 +8,7 @@ import { HostAppService, Platform } from './hostApp.service'
/* eslint-disable block-scoped-var */ /* eslint-disable block-scoped-var */
try { try {
var wnr = require('windows-native-registry') // eslint-disable-line @typescript-eslint/no-var-requires var wnr = require('windows-native-registry') // eslint-disable-line @typescript-eslint/no-var-requires, no-var
} catch (_) { } } catch (_) { }
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
@@ -18,15 +18,22 @@ export class ShellIntegrationService {
private automatorWorkflowsDestination: string private automatorWorkflowsDestination: string
private registryKeys = [ private registryKeys = [
{ {
path: 'Software\\Classes\\Directory\\Background\\shell\\Open Terminus here', path: 'Software\\Classes\\Directory\\Background\\shell\\Terminus',
value: 'Open Terminus here',
command: 'open "%V"', command: 'open "%V"',
}, },
{ {
path: 'Software\\Classes\\*\\shell\\Paste path into Terminus', path: 'SOFTWARE\\Classes\\Directory\\shell\\Terminus',
value: 'Open Terminus here',
command: 'open "%V"',
},
{
path: 'Software\\Classes\\*\\shell\\Terminus',
value: 'Paste path into Terminus',
command: 'paste "%V"', command: 'paste "%V"',
}, },
] ]
constructor ( private constructor (
private electron: ElectronService, private electron: ElectronService,
private hostApp: HostAppService, private hostApp: HostAppService,
) { ) {
@@ -51,7 +58,7 @@ export class ShellIntegrationService {
return true return true
} }
async install () { async install (): Promise<void> {
const exe: string = process.env.PORTABLE_EXECUTABLE_FILE || this.electron.app.getPath('exe') const exe: string = process.env.PORTABLE_EXECUTABLE_FILE || this.electron.app.getPath('exe')
if (this.hostApp.platform === Platform.macOS) { if (this.hostApp.platform === Platform.macOS) {
for (const wf of this.automatorWorkflows) { for (const wf of this.automatorWorkflows) {
@@ -61,13 +68,21 @@ export class ShellIntegrationService {
for (const registryKey of this.registryKeys) { for (const registryKey of this.registryKeys) {
wnr.createRegistryKey(wnr.HK.CU, registryKey.path) wnr.createRegistryKey(wnr.HK.CU, registryKey.path)
wnr.createRegistryKey(wnr.HK.CU, registryKey.path + '\\command') wnr.createRegistryKey(wnr.HK.CU, registryKey.path + '\\command')
wnr.setRegistryValue(wnr.HK.CU, registryKey.path, '', wnr.REG.SZ, registryKey.value)
wnr.setRegistryValue(wnr.HK.CU, registryKey.path, 'Icon', wnr.REG.SZ, exe) wnr.setRegistryValue(wnr.HK.CU, registryKey.path, 'Icon', wnr.REG.SZ, exe)
wnr.setRegistryValue(wnr.HK.CU, registryKey.path + '\\command', '', wnr.REG.SZ, exe + ' ' + registryKey.command) wnr.setRegistryValue(wnr.HK.CU, registryKey.path + '\\command', '', wnr.REG.SZ, exe + ' ' + registryKey.command)
} }
if(wnr.getRegistryKey(wnr.HK.CU, 'Software\\Classes\\Directory\\Background\\shell\\Open Terminus here')) {
wnr.deleteRegistryKey(wnr.HK.CU, 'Software\\Classes\\Directory\\Background\\shell\\Open Terminus here')
}
if(wnr.getRegistryKey(wnr.HK.CU, 'Software\\Classes\\*\\shell\\Paste path into Terminus')) {
wnr.deleteRegistryKey(wnr.HK.CU, 'Software\\Classes\\*\\shell\\Paste path into Terminus')
}
} }
} }
async remove () { async remove (): Promise<void> {
if (this.hostApp.platform === Platform.macOS) { if (this.hostApp.platform === Platform.macOS) {
for (const wf of this.automatorWorkflows) { for (const wf of this.automatorWorkflows) {
await exec(`rm -rf "${this.automatorWorkflowsDestination}/${wf}"`) await exec(`rm -rf "${this.automatorWorkflowsDestination}/${wf}"`)

View File

@@ -1,5 +1,5 @@
import { Injectable, Inject } from '@angular/core' import { Injectable, Inject } from '@angular/core'
import { TabRecoveryProvider, RecoveredTab } from '../api/tabRecovery' import { TabRecoveryProvider, RecoveredTab, RecoveryToken } from '../api/tabRecovery'
import { BaseTabComponent } from '../components/baseTab.component' import { BaseTabComponent } from '../components/baseTab.component'
import { Logger, LogService } from '../services/log.service' import { Logger, LogService } from '../services/log.service'
import { ConfigService } from '../services/config.service' import { ConfigService } from '../services/config.service'
@@ -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
@@ -17,21 +18,41 @@ export class TabRecoveryService {
this.logger = log.create('tabRecovery') this.logger = log.create('tabRecovery')
} }
async saveTabs (tabs: BaseTabComponent[]) { 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
.map(tab => tab.getRecoveryToken()) .map(tab => {
let token = tab.getRecoveryToken()
if (token) {
token = token.then(r => {
if (r) {
r.tabTitle = tab.title
if (tab.color) {
r.tabColor = tab.color
}
}
return r
})
}
return token
})
.filter(token => !!token) .filter(token => !!token)
) )
) )
} }
async recoverTab (token: any): Promise<RecoveredTab|null> { async recoverTab (token: RecoveryToken): Promise<RecoveredTab|null> {
for (const provider of this.config.enabledServices(this.tabRecoveryProviders)) { for (const provider of this.config.enabledServices(this.tabRecoveryProviders)) {
try { try {
const tab = await provider.recover(token) const tab = await provider.recover(token)
if (tab) { if (tab !== null) {
tab.options = tab.options || {}
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,
@@ -17,7 +17,7 @@ export class TabsService {
/** /**
* Instantiates a tab component and assigns given inputs * Instantiates a tab component and assigns given inputs
*/ */
create (type: TabComponentType, inputs?: any): BaseTabComponent { create (type: TabComponentType, inputs?: Record<string, any>): BaseTabComponent {
const componentFactory = this.componentFactoryResolver.resolveComponentFactory(type) const componentFactory = this.componentFactoryResolver.resolveComponentFactory(type)
const componentRef = componentFactory.create(this.injector) const componentRef = componentFactory.create(this.injector)
const tab = componentRef.instance const tab = componentRef.instance

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[],
@@ -48,7 +48,7 @@ export class TouchbarService {
}) })
} }
updateTabs () { updateTabs (): void {
this.tabSegments = this.app.tabs.map(tab => ({ this.tabSegments = this.app.tabs.map(tab => ({
label: this.shortenTitle(tab.title), label: this.shortenTitle(tab.title),
})) }))
@@ -56,7 +56,7 @@ export class TouchbarService {
this.tabsSegmentedControl.selectedIndex = this.app.tabs.indexOf(this.app.activeTab) this.tabsSegmentedControl.selectedIndex = this.app.tabs.indexOf(this.app.activeTab)
} }
update () { update (): void {
if (this.hostApp.platform !== Platform.macOS) { if (this.hostApp.platform !== Platform.macOS) {
return return
} }

View File

@@ -8,6 +8,7 @@ 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'
@@ -18,21 +19,27 @@ 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 private autoUpdater: AppUpdater
constructor ( private constructor (
log: LogService, log: LogService,
private electron: ElectronService, private electron: ElectronService,
config: ConfigService, private config: ConfigService,
) { ) {
this.logger = log.create('updater') this.logger = log.create('updater')
if (process.platform === 'linux') {
this.electronUpdaterAvailable = false
return
}
this.autoUpdater = electron.remote.require('electron-updater').autoUpdater this.autoUpdater = electron.remote.require('electron-updater').autoUpdater
this.autoUpdater.autoInstallOnAppQuit = !!config.store.enableAutomaticUpdates this.autoUpdater.autoInstallOnAppQuit = !!config.store.enableAutomaticUpdates
this.autoUpdater.on('update-available', () => { this.autoUpdater.on('update-available', () => {
this.logger.info('Update available') this.logger.info('Update available')
this.autoUpdater.downloadUpdate()
}) })
this.autoUpdater.once('update-not-available', () => { this.autoUpdater.once('update-not-available', () => {
this.logger.info('No updates') this.logger.info('No updates')
@@ -42,9 +49,8 @@ export class UpdaterService {
this.autoUpdater.once('update-downloaded', () => resolve(true)) this.autoUpdater.once('update-downloaded', () => resolve(true))
}) })
this.logger.debug('Checking for updates') if (config.store.enableAutomaticUpdates && this.electronUpdaterAvailable && !process.env.TERMINUS_DEV) {
this.logger.debug('Checking for updates')
if (this.electronUpdaterAvailable && !process.env.TERMINUS_DEV) {
try { try {
this.autoUpdater.checkForUpdates() this.autoUpdater.checkForUpdates()
} catch (e) { } catch (e) {
@@ -55,6 +61,9 @@ export class UpdaterService {
} }
async check (): Promise<boolean> { async check (): Promise<boolean> {
if (!this.config.store.enableAutomaticUpdates) {
return false
}
if (!this.electronUpdaterAvailable) { if (!this.electronUpdaterAvailable) {
this.logger.debug('Checking for updates through fallback method.') this.logger.debug('Checking for updates through fallback method.')
const response = await axios.get(UPDATES_URL) const response = await axios.get(UPDATES_URL)
@@ -71,7 +80,7 @@ export class UpdaterService {
return this.downloaded return this.downloaded
} }
async update () { async update (): Promise<void> {
if (!this.electronUpdaterAvailable) { if (!this.electronUpdaterAvailable) {
this.electron.shell.openExternal(this.updateURL) this.electron.shell.openExternal(this.updateURL)
} else { } else {

View File

@@ -1,4 +1,6 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Injectable, NgZone } from '@angular/core' import { Injectable, NgZone } from '@angular/core'
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'
@@ -16,39 +18,49 @@ export class CloseContextMenu extends TabContextMenuItemProvider {
super() super()
} }
async getItems (tab: BaseTabComponent): Promise<Electron.MenuItemConstructorOptions[]> { async getItems (tab: BaseTabComponent, tabHeader?: TabHeaderComponent): Promise<Electron.MenuItemConstructorOptions[]> {
return [ let items = [
{ {
label: 'Close', label: 'Close',
click: () => this.zone.run(() => { click: () => this.zone.run(() => {
this.app.closeTab(tab, true) if (this.app.tabs.includes(tab)) {
}), this.app.closeTab(tab, true)
}, } else {
{ tab.destroy()
label: 'Close other tabs',
click: () => this.zone.run(() => {
for (const t of this.app.tabs.filter(x => x !== tab)) {
this.app.closeTab(t, true)
}
}),
},
{
label: 'Close tabs to the right',
click: () => this.zone.run(() => {
for (const t of this.app.tabs.slice(this.app.tabs.indexOf(tab) + 1)) {
this.app.closeTab(t, true)
}
}),
},
{
label: 'Close tabs to the left',
click: () => this.zone.run(() => {
for (const t of this.app.tabs.slice(0, this.app.tabs.indexOf(tab))) {
this.app.closeTab(t, true)
} }
}), }),
}, },
] ]
if (tabHeader) {
items = [
...items,
{
label: 'Close other tabs',
click: () => this.zone.run(() => {
for (const t of this.app.tabs.filter(x => x !== tab)) {
this.app.closeTab(t, true)
}
}),
},
{
label: 'Close tabs to the right',
click: () => this.zone.run(() => {
for (const t of this.app.tabs.slice(this.app.tabs.indexOf(tab) + 1)) {
this.app.closeTab(t, true)
}
}),
},
{
label: 'Close tabs to the left',
click: () => this.zone.run(() => {
for (const t of this.app.tabs.slice(0, this.app.tabs.indexOf(tab))) {
this.app.closeTab(t, true)
}
}),
},
]
}
return items
} }
} }
@@ -75,28 +87,31 @@ export class CommonOptionsContextMenu extends TabContextMenuItemProvider {
} }
async getItems (tab: BaseTabComponent, tabHeader?: TabHeaderComponent): Promise<Electron.MenuItemConstructorOptions[]> { async getItems (tab: BaseTabComponent, tabHeader?: TabHeaderComponent): Promise<Electron.MenuItemConstructorOptions[]> {
return [ if (tabHeader) {
{ return [
label: 'Rename', {
click: () => this.zone.run(() => tabHeader?.showRenameTabModal()), label: 'Rename',
}, click: () => this.zone.run(() => tabHeader?.showRenameTabModal()),
{ },
label: 'Duplicate', {
click: () => this.zone.run(() => this.app.duplicateTab(tab)), label: 'Duplicate',
}, click: () => this.zone.run(() => this.app.duplicateTab(tab)),
{ },
label: 'Color', {
sublabel: COLORS.find(x => x.value === tab.color)!.name, label: 'Color',
submenu: COLORS.map(color => ({ sublabel: COLORS.find(x => x.value === tab.color)!.name,
label: color.name, submenu: COLORS.map(color => ({
type: 'radio', label: color.name,
checked: tab.color === color.value, type: 'radio',
click: () => this.zone.run(() => { checked: tab.color === color.value,
tab.color = color.value click: () => this.zone.run(() => {
}), tab.color = color.value
})) as Electron.MenuItemConstructorOptions[], }),
}, })) as Electron.MenuItemConstructorOptions[],
] },
]
}
return []
} }
} }
@@ -112,36 +127,61 @@ export class TaskCompletionContextMenu extends TabContextMenuItemProvider {
async getItems (tab: BaseTabComponent): Promise<Electron.MenuItemConstructorOptions[]> { async getItems (tab: BaseTabComponent): Promise<Electron.MenuItemConstructorOptions[]> {
const process = await tab.getCurrentProcess() const process = await tab.getCurrentProcess()
if (process) { let items: Electron.MenuItemConstructorOptions[] = []
return [
{
id: 'process-name',
enabled: false,
label: 'Current process: ' + process.name,
},
{
label: 'Notify when done',
type: 'checkbox',
checked: (tab as any).__completionNotificationEnabled,
click: () => this.zone.run(() => {
(tab as any).__completionNotificationEnabled = !(tab as any).__completionNotificationEnabled
if ((tab as any).__completionNotificationEnabled) { const extTab: (BaseTabComponent & { __completionNotificationEnabled?: boolean, __outputNotificationSubscription?: Subscription|null }) = tab
this.app.observeTabCompletion(tab).subscribe(() => {
new Notification('Process completed', { if (process) {
body: process.name, items.push({
}).addEventListener('click', () => { id: 'process-name',
this.app.selectTab(tab) enabled: false,
}) label: 'Current process: ' + process.name,
;(tab as any).__completionNotificationEnabled = false })
items.push({
label: 'Notify when done',
type: 'checkbox',
checked: extTab.__completionNotificationEnabled,
click: () => this.zone.run(() => {
extTab.__completionNotificationEnabled = !extTab.__completionNotificationEnabled
if (extTab.__completionNotificationEnabled) {
this.app.observeTabCompletion(tab).subscribe(() => {
new Notification('Process completed', {
body: process.name,
}).addEventListener('click', () => {
this.app.selectTab(tab)
}) })
} else { extTab.__completionNotificationEnabled = false
this.app.stopObservingTabCompletion(tab) })
} } else {
}), this.app.stopObservingTabCompletion(tab)
}, }
] }),
})
} }
return [] items.push({
label: 'Notify on activity',
type: 'checkbox',
checked: !!extTab.__outputNotificationSubscription,
click: () => this.zone.run(() => {
if (extTab.__outputNotificationSubscription) {
extTab.__outputNotificationSubscription.unsubscribe()
extTab.__outputNotificationSubscription = null
} else {
extTab.__outputNotificationSubscription = tab.activity$.subscribe(active => {
if (extTab.__outputNotificationSubscription && active) {
extTab.__outputNotificationSubscription.unsubscribe()
extTab.__outputNotificationSubscription = null
new Notification('Tab activity', {
body: tab.title,
}).addEventListener('click', () => {
this.app.selectTab(tab)
})
}
})
}
}),
})
return items
} }
} }

View File

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

View File

@@ -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

@@ -142,7 +142,7 @@ $nav-tabs-link-active-border-color: #eee;
$navbar-padding-y: 0; $navbar-padding-y: 0;
$navbar-padding-x: 0; $navbar-padding-x: 0;
$dropdown-bg: $table-bg; $dropdown-bg: $content-bg-solid;
$dropdown-color: $body-color; $dropdown-color: $body-color;
$dropdown-border-width: 1px; $dropdown-border-width: 1px;
$dropdown-box-shadow: 0 .5rem 1rem rgba($black,.175); $dropdown-box-shadow: 0 .5rem 1rem rgba($black,.175);

View File

@@ -3,11 +3,14 @@ import * as os from 'os'
export const WIN_BUILD_CONPTY_SUPPORTED = 17692 export const WIN_BUILD_CONPTY_SUPPORTED = 17692
export const WIN_BUILD_CONPTY_STABLE = 18309 export const WIN_BUILD_CONPTY_STABLE = 18309
export const WIN_BUILD_WSL_EXE_DISTRO_FLAG = 17763 export const WIN_BUILD_WSL_EXE_DISTRO_FLAG = 17763
export const WIN_BUILD_FLUENT_BG_SUPPORTED = 17063
export const WIN_BUILD_FLUENT_BG_MOVE_BUG_FIXED = 18917
export function isWindowsBuild (build: number): boolean { export function isWindowsBuild (build: number): boolean {
return process.platform === 'win32' && parseFloat(os.release()) >= 10 && parseInt(os.release().split('.')[2]) >= build return process.platform === 'win32' && parseFloat(os.release()) >= 10 && parseInt(os.release().split('.')[2]) >= build
} }
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export function getCSSFontFamily (config: any): string { export function getCSSFontFamily (config: any): string {
let fonts: string[] = config.terminal.font.split(',').map(x => x.trim().replace(/"/g, '')) let fonts: string[] = config.terminal.font.split(',').map(x => x.trim().replace(/"/g, ''))
if (config.terminal.fallbackFont) { if (config.terminal.fallbackFont) {

View File

@@ -3,14 +3,21 @@
"@types/js-yaml@^3.9.0": "@types/js-yaml@^3.9.0":
version "3.12.1" version "3.12.3"
resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.1.tgz#5c6f4a1eabca84792fbd916f0cb40847f123c656" resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.3.tgz#abf383c5b639d0aa8b8c4a420d6a85f703357d6c"
integrity sha512-SGGAhXLHDx+PK4YLNcNGa6goPf9XRWQNAUUbffkwVGGXIxmDKWyGGL4inzq2sPmExu431Ekb9aEMn9BkPqEYFA== integrity sha512-otRe77JNNWzoVGLKw8TCspKswRoQToys4tuL6XYVBFxjgeM0RUrx7m3jkaTdxILxeGry3zM8mGYkGXMeQ02guA==
"@types/semver@^6.0.2": "@types/node@*":
version "6.2.0" version "13.7.1"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.2.0.tgz#d688d574400d96c5b0114968705366f431831e1a" resolved "https://registry.yarnpkg.com/@types/node/-/node-13.7.1.tgz#238eb34a66431b71d2aaddeaa7db166f25971a0d"
integrity sha512-1OzrNb4RuAzIT7wHSsgZRlMBlNsJl+do6UblR7JMW4oB7bbR+uBEYtUh7gEc/jM84GGilh68lSOokyM/zNUlBA== integrity sha512-Zq8gcQGmn4txQEJeiXo/KiLpon8TzAl0kmKH4zdWctPj05nWwp1ClMdAVEloqrQKfaC48PNLdgN/aVaLqUrluA==
"@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" "*"
"@types/shell-escape@^0.2.0": "@types/shell-escape@^0.2.0":
version "0.2.0" version "0.2.0"
@@ -45,23 +52,27 @@ async@^2.6.1:
dependencies: dependencies:
lodash "^4.17.11" 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.0" version "0.19.2"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8" resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27"
integrity sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ== integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==
dependencies: dependencies:
follow-redirects "1.5.10" follow-redirects "1.5.10"
is-buffer "^2.0.2"
bootstrap@^4.1.3: bootstrap@^4.1.3:
version "4.3.1" version "4.4.1"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.3.1.tgz#280ca8f610504d99d7b6b4bfc4b68cec601704ac" resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.4.1.tgz#8582960eea0c5cd2bede84d8b0baf3789c3e8b01"
integrity sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag== integrity sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==
builder-util-runtime@8.4.0: builder-util-runtime@8.6.1:
version "8.4.0" version "8.6.1"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.4.0.tgz#3163fffc078e6b8f3dd5b6eb12a8345573590682" resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.6.1.tgz#cf9a268fa51704de24f3c085aa8d1d1b3767d9ea"
integrity sha512-CJB/eKfPf2vHrkmirF5eicVnbDCkMBbwd5tRYlTlgud16zFeqD7QmrVUAOEXdnsrcNkiLg9dbuUsQKtl/AwsYQ== integrity sha512-gwIUtMaICmc+e2EC3u3byXcwCyfhtG40LJRNnGfs8AYqacKl4ZLP50ab+uDttn7QAXe0LfMAuKz9v8bCODV0yg==
dependencies: dependencies:
debug "^4.1.1" debug "^4.1.1"
sax "^1.2.4" sax "^1.2.4"
@@ -118,9 +129,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.1" version "3.6.5"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.1.tgz#39d5e2e346258cc01eb7d44345b1c3c014ca3f05" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a"
integrity sha512-186WjSik2iTGfDjfdCZAxv2ormxtKgemjC3SI6PL31qOA0j5LhTDVjHChccoc7brwLvpvLPiMyRlcO88C4l1QQ== 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"
@@ -163,18 +174,17 @@ diagnostics@^1.1.1:
kuler "1.0.x" kuler "1.0.x"
electron-updater@^4.0.6: electron-updater@^4.0.6:
version "4.2.0" version "4.3.0"
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.2.0.tgz#f9ecfc657f65ead737d42b9efecf628d3756b550" resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.3.0.tgz#f66c253b25431d9aeb04fbd33c79062f33943d44"
integrity sha512-GuS3g7HDh17x/SaFjxjswlWUaKHczksYkV2Xc5CKj/bZH0YCvTSHtOmnBAdAmCk99u/71p3zP8f0jIqDfGcjww== integrity sha512-5K3vPgeiBGQaaCcZzQP00QYhGsh0l/q0mwzGWVZq1BHJ5akA+BpsY+EPiI9JzBhNVIdNlUvSKr5azUdbMwZeig==
dependencies: dependencies:
"@types/semver" "^6.0.2" "@types/semver" "^7.1.0"
builder-util-runtime "8.4.0" builder-util-runtime "8.6.1"
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.10" semver "^7.1.3"
semver "^6.3.0"
enabled@1.0.x: enabled@1.0.x:
version "1.0.2" version "1.0.2"
@@ -222,14 +232,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"
@@ -254,11 +265,6 @@ 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-buffer@^2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725"
integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==
is-stream@^1.1.0: is-stream@^1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
@@ -277,10 +283,12 @@ js-yaml@^3.13.1, js-yaml@^3.9.0:
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"
@@ -352,11 +360,6 @@ one-time@0.0.4:
resolved "https://registry.yarnpkg.com/one-time/-/one-time-0.0.4.tgz#f8cdf77884826fe4dff93e3a9cc37b1e4480742e" resolved "https://registry.yarnpkg.com/one-time/-/one-time-0.0.4.tgz#f8cdf77884826fe4dff93e3a9cc37b1e4480742e"
integrity sha1-+M33eISCb+Tf+T46nMN7HkSAdC4= integrity sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=
pako@^1.0.10:
version "1.0.10"
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732"
integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==
perfect-scrollbar@^1.4.0: perfect-scrollbar@^1.4.0:
version "1.4.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-1.4.0.tgz#5d014ef9775e1f43058a1dbae9ed1daf0e7091f1" resolved "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-1.4.0.tgz#5d014ef9775e1f43058a1dbae9ed1daf0e7091f1"
@@ -404,10 +407,10 @@ sax@^1.2.4:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
semver@^6.3.0: semver@^7.1.3:
version "6.3.0" version "7.1.3"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.3.tgz#e4345ce73071c53f336445cfc19efb1c311df2a6"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== integrity sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==
shell-escape@^0.2.0: shell-escape@^0.2.0:
version "0.2.0" version "0.2.0"
@@ -455,20 +458,20 @@ 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@^3.3.2: uuid@^7.0.1:
version "3.3.3" version "7.0.1"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.1.tgz#95ed6ff3d8c881cbf85f0f05cc3915ef994818ef"
integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== integrity sha512-yqjRXZzSJm9Dbl84H2VDHpM3zMjzSJQ+hn6C4zqd5ilW+7P4ZmLEEqwho9LjP+tGuZlF4xrHQXT0h9QZUS/pWA==
winston-transport@^4.3.0: winston-transport@^4.3.0:
version "4.3.0" version "4.3.0"

View File

@@ -1,6 +1,6 @@
{ {
"name": "terminus-plugin-manager", "name": "terminus-plugin-manager",
"version": "1.0.98-nightly.0", "version": "1.0.104-nightly.0",
"description": "Terminus' plugin manager", "description": "Terminus' plugin manager",
"keywords": [ "keywords": [
"terminus-builtin-plugin" "terminus-builtin-plugin"
@@ -17,7 +17,7 @@
"author": "Eugene Pankov", "author": "Eugene Pankov",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"@types/semver": "^6.0.0", "@types/semver": "^7.1.0",
"axios": "^0.19.0", "axios": "^0.19.0",
"mz": "^2.6.0", "mz": "^2.6.0",
"semver": "^7.1.1" "semver": "^7.1.1"

View File

@@ -1,6 +1,7 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { BehaviorSubject, Observable } from 'rxjs' import { BehaviorSubject, Observable } from 'rxjs'
import { debounceTime, distinctUntilChanged, first, tap, flatMap, map } from 'rxjs/operators' import { debounceTime, distinctUntilChanged, first, tap, flatMap, map } from 'rxjs/operators'
import * as semver from 'semver' import semverGt from 'semver/functions/gt'
import { Component, Input } from '@angular/core' import { Component, Input } from '@angular/core'
import { ConfigService, ElectronService } from 'terminus-core' import { ConfigService, ElectronService } from 'terminus-core'
@@ -48,7 +49,7 @@ export class PluginsSettingsTabComponent {
return plugins return plugins
})).subscribe(available => { })).subscribe(available => {
for (const plugin of this.pluginManager.installedPlugins) { for (const plugin of this.pluginManager.installedPlugins) {
this.knownUpgrades[plugin.name] = available.find(x => x.name === plugin.name && semver.gt(x.version, plugin.version)) || null this.knownUpgrades[plugin.name] = available.find(x => x.name === plugin.name && semverGt(x.version, plugin.version)) || null
} }
}) })
} }

View File

@@ -8,6 +8,10 @@ const NAME_PREFIX = 'terminus-'
const KEYWORD = 'terminus-plugin' const KEYWORD = 'terminus-plugin'
const OFFICIAL_NPM_ACCOUNT = 'eugenepankov' const OFFICIAL_NPM_ACCOUNT = 'eugenepankov'
const BLACKLIST = [
'terminus-shell-selector', // superseded by profiles
]
export interface PluginInfo { export interface PluginInfo {
name: string name: string
description: string description: string
@@ -30,13 +34,13 @@ 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')
} }
async getNPM () { async getNPM (): Promise<any> {
if (!this.npm) { if (!this.npm) {
if (!this.npmReady) { if (!this.npmReady) {
this.npmReady = new Promise(resolve => { this.npmReady = new Promise(resolve => {
@@ -75,10 +79,11 @@ export class PluginManagerService {
isOfficial: item.package.publisher.username === OFFICIAL_NPM_ACCOUNT, isOfficial: item.package.publisher.username === OFFICIAL_NPM_ACCOUNT,
}))), }))),
map(plugins => plugins.filter(x => x.packageName.startsWith(NAME_PREFIX))), map(plugins => plugins.filter(x => x.packageName.startsWith(NAME_PREFIX))),
map(plugins => plugins.filter(x => !BLACKLIST.includes(x.packageName))),
) )
} }
async installPlugin (plugin: PluginInfo) { async installPlugin (plugin: PluginInfo): Promise<void> {
(await this.getNPM()).commands.install([`${plugin.packageName}@${plugin.version}`], err => { (await this.getNPM()).commands.install([`${plugin.packageName}@${plugin.version}`], err => {
if (err) { if (err) {
this.logger.error(err) this.logger.error(err)
@@ -88,7 +93,7 @@ export class PluginManagerService {
}) })
} }
async uninstallPlugin (plugin: PluginInfo) { async uninstallPlugin (plugin: PluginInfo): Promise<void> {
(await this.getNPM()).commands.remove([plugin.packageName], err => { (await this.getNPM()).commands.remove([plugin.packageName], err => {
if (err) { if (err) {
this.logger.error(err) this.logger.error(err)

View File

@@ -2,10 +2,17 @@
# yarn lockfile v1 # yarn lockfile v1
"@types/semver@^6.0.0": "@types/node@*":
version "6.2.0" version "13.7.6"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.2.0.tgz#d688d574400d96c5b0114968705366f431831e1a" resolved "https://registry.yarnpkg.com/@types/node/-/node-13.7.6.tgz#cb734a7c191472ae6a2b3a502b4dfffcea974113"
integrity sha512-1OzrNb4RuAzIT7wHSsgZRlMBlNsJl+do6UblR7JMW4oB7bbR+uBEYtUh7gEc/jM84GGilh68lSOokyM/zNUlBA== integrity sha512-eyK7MWD0R1HqVTp+PtwRgFeIsemzuj4gBFSQxfPHY5iMjS7474e5wq+VFgTcdpyHeNxyKSaetYAjdMLJlKoWqA==
"@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" "*"
any-promise@^1.0.0: any-promise@^1.0.0:
version "1.3.0" version "1.3.0"
@@ -13,12 +20,11 @@ any-promise@^1.0.0:
integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
axios@^0.19.0: axios@^0.19.0:
version "0.19.0" version "0.19.2"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8" resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27"
integrity sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ== integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==
dependencies: dependencies:
follow-redirects "1.5.10" follow-redirects "1.5.10"
is-buffer "^2.0.2"
debug@=3.1.0: debug@=3.1.0:
version "3.1.0" version "3.1.0"
@@ -34,11 +40,6 @@ follow-redirects@1.5.10:
dependencies: dependencies:
debug "=3.1.0" debug "=3.1.0"
is-buffer@^2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725"
integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==
ms@2.0.0: ms@2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -59,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

@@ -0,0 +1,37 @@
{
"name": "terminus-serial",
"version": "1.0.104-nightly.0",
"description": "Serial connection manager for Terminus",
"keywords": [
"terminus-builtin-plugin"
],
"main": "dist/index.js",
"typings": "typings/index.d.ts",
"scripts": {
"build": "webpack --progress --color",
"watch": "webpack --progress --color --watch"
},
"files": [
"dist"
],
"author": "Eugene Pankov",
"license": "MIT",
"devDependencies": {
"@types/node": "12.7.3",
"@types/ssh2": "^0.5.35",
"ansi-colors": "^4.1.1",
"cli-spinner": "^0.2.10",
"electron-rebuild": "^1.10.0",
"terminus-terminal": "^1.0.98-nightly.0"
},
"peerDependencies": {
"@angular/common": "^7",
"@angular/core": "^7",
"@angular/forms": "^7",
"@ng-bootstrap/ng-bootstrap": "^1",
"rxjs": "^5",
"terminus-core": "*",
"terminus-settings": "*",
"terminus-terminal": "*"
}
}

156
terminus-serial/src/api.ts Normal file
View File

@@ -0,0 +1,156 @@
import { BaseSession } from 'terminus-terminal'
import { SerialPort } from 'serialport'
import { Logger } from 'terminus-core'
import { Subject, Observable } from 'rxjs'
export interface LoginScript {
expect: string
send: string
isRegex?: boolean
optional?: boolean
}
export interface SerialConnection {
name: string
port: string
baudrate: number
databits: number
stopbits: number
parity: string
rtscts: boolean
xon: boolean
xoff: boolean
xany: boolean
scripts?: LoginScript[]
color?: string
}
export const BAUD_RATES = [
110, 150, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600,
]
export interface SerialPortInfo {
name: string
description?: string
}
export class SerialSession extends BaseSession {
scripts?: LoginScript[]
serial: SerialPort
logger: Logger
get serviceMessage$ (): Observable<string> { return this.serviceMessage }
private serviceMessage = new Subject<string>()
constructor (public connection: SerialConnection) {
super()
this.scripts = connection.scripts || []
}
async start (): Promise<void> {
this.open = true
this.serial.on('data', data => {
const dataString = data.toString()
this.emitOutput(data)
if (this.scripts) {
let found = false
for (const script of this.scripts) {
let match = false
let cmd = ''
if (script.isRegex) {
const re = new RegExp(script.expect, 'g')
if (dataString.match(re)) {
cmd = dataString.replace(re, script.send)
match = true
found = true
}
} else {
if (dataString.includes(script.expect)) {
cmd = script.send
match = true
found = true
}
}
if (match) {
this.logger.info('Executing script: "' + cmd + '"')
this.serial.write(cmd + '\n')
this.scripts = this.scripts.filter(x => x !== script)
} else {
if (script.optional) {
this.logger.debug('Skip optional script: ' + script.expect)
found = true
this.scripts = this.scripts.filter(x => x !== script)
} else {
break
}
}
}
if (found) {
this.executeUnconditionalScripts()
}
}
})
this.serial.on('end', () => {
this.logger.info('Shell session ended')
if (this.open) {
this.destroy()
}
})
this.executeUnconditionalScripts()
}
write (data: Buffer): void {
if (this.serial) {
this.serial.write(data.toString())
}
}
async destroy (): Promise<void> {
this.serviceMessage.complete()
await super.destroy()
}
// eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-empty-function
resize (_, __) { }
kill (_?: string): void {
this.serial.close()
}
async getChildProcesses (): Promise<any[]> {
return []
}
async gracefullyKillProcess (): Promise<void> {
this.kill('TERM')
}
async getWorkingDirectory (): Promise<string|null> {
return null
}
private executeUnconditionalScripts () {
if (this.scripts) {
for (const script of this.scripts) {
if (!script.expect) {
console.log('Executing script:', script.send)
this.serial.write(script.send + '\n')
this.scripts = this.scripts.filter(x => x !== script)
} else {
break
}
}
}
}
}
export interface SerialConnectionGroup {
name: string
connections: SerialConnection[]
}

View File

@@ -0,0 +1,36 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Injectable, Injector } from '@angular/core'
import { HotkeysService, ToolbarButtonProvider, ToolbarButton } from 'terminus-core'
import { SerialService } from './services/serial.service'
/** @hidden */
@Injectable()
export class ButtonProvider extends ToolbarButtonProvider {
constructor (
private injector: Injector,
hotkeys: HotkeysService,
) {
super()
hotkeys.matchedHotkey.subscribe(async (hotkey: string) => {
if (hotkey === 'serial') {
this.activate()
}
})
}
activate () {
this.injector.get(SerialService).showConnectionSelector()
}
provide (): ToolbarButton[] {
return [{
icon: require('./icons/serial.svg'),
weight: 5,
title: 'Serial connections',
touchBarNSImage: 'NSTouchBarOpenInBrowserTemplate',
click: async () => {
this.activate()
},
}]
}
}

View File

@@ -0,0 +1,134 @@
.modal-body
ngb-tabset([activeId]='basic')
ngb-tab(id='basic')
ng-template(ngbTabTitle) General
ng-template(ngbTabContent)
.form-group
label Name
input.form-control(
type='text',
autofocus,
[(ngModel)]='connection.name',
)
.form-group
label Path
input.form-control(
type='text',
[(ngModel)]='connection.port',
[ngbTypeahead]='portsAutocomplete',
[resultFormatter]='portsFormatter',
)
.form-group
label Baud Rate
select.form-control(
[(ngModel)]='connection.baudrate',
)
option([value]='x', *ngFor='let x of baudRates') {{x}}
ngb-tab(id='advanced')
ng-template(ngbTabTitle) Advanced
ng-template(ngbTabContent)
.form-line
.header
.title Tab color
input.form-control(
type='text',
autofocus,
[(ngModel)]='connection.color',
placeholder='#000000'
)
.form-line
.header
.title DataBits
input.form-control(
type='number',
placeholder='8',
[(ngModel)]='connection.databits',
)
.form-line
.header
.title StopBits
input.form-control(
type='number',
placeholder='1',
[(ngModel)]='connection.stopbits',
)
.form-line
.header
.title Parity
input.form-control(
type='text',
[(ngModel)]='connection.parity',
placeholder='none'
)
.form-line
.header
.title RTSCTS
toggle([(ngModel)]='connection.rtscts')
.form-line
.header
.title Xon
toggle([(ngModel)]='connection.xon')
.form-line
.header
.title Xoff
toggle([(ngModel)]='connection.xoff')
.form-line
.header
.title Xany
toggle([(ngModel)]='connection.xany')
ngb-tab(id='scripts')
ng-template(ngbTabTitle) Login scripts
ng-template(ngbTabContent)
table(*ngIf='connection.scripts.length > 0')
tr
th String to expect
th String to be sent
th.pl-2 Regex
th.pl-2 Optional
th.pl-2 Actions
tr(*ngFor='let script of connection.scripts')
td.pr-2
input.form-control(
type='text',
[(ngModel)]='script.expect'
)
td
input.form-control(
type='text',
[(ngModel)]='script.send'
)
td.pl-2
checkbox(
[(ngModel)]='script.isRegex',
)
td.pl-2
checkbox(
[(ngModel)]='script.optional',
)
td.pl-2
.input-group.flex-nowrap
button.btn.btn-outline-info.ml-0((click)='moveScriptUp(script)')
i.fas.fa-arrow-up
button.btn.btn-outline-info.ml-0((click)='moveScriptDown(script)')
i.fas.fa-arrow-down
button.btn.btn-outline-danger.ml-0((click)='deleteScript(script)')
i.fas.fa-trash
button.btn.btn-outline-info.mt-2((click)='addScript()')
i.fas.fa-plus
span New item
.modal-footer
button.btn.btn-outline-primary((click)='save()') Save
button.btn.btn-outline-danger((click)='cancel()') Cancel

View File

@@ -0,0 +1,95 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Component } from '@angular/core'
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
import { map } from 'rxjs/operators'
import { ElectronService, HostAppService } from 'terminus-core'
import { SerialConnection, LoginScript, SerialPortInfo, BAUD_RATES } from '../api'
import { SerialService } from '../services/serial.service'
// import { PromptModalComponent } from './promptModal.component'
/** @hidden */
@Component({
template: require('./editConnectionModal.component.pug'),
})
export class EditConnectionModalComponent {
connection: SerialConnection
foundPorts: SerialPortInfo[]
baudRates = BAUD_RATES
constructor (
private modalInstance: NgbActiveModal,
private electron: ElectronService,
private hostApp: HostAppService,
private serial: SerialService,
) {
}
portsAutocomplete = text$ => text$.pipe(map(() => {
return this.foundPorts.map(x => x.name)
}))
portsFormatter = port => {
const p = this.foundPorts.find(x => x.name === port)
if (p?.description) {
return `${port} (${p.description})`
}
return port
}
async ngOnInit () {
this.connection.scripts = this.connection.scripts || []
this.foundPorts = await this.serial.listPorts()
}
save () {
this.modalInstance.close(this.connection)
}
cancel () {
this.modalInstance.dismiss()
}
moveScriptUp (script: LoginScript) {
if (!this.connection.scripts) {
this.connection.scripts = []
}
const index = this.connection.scripts.indexOf(script)
if (index > 0) {
this.connection.scripts.splice(index, 1)
this.connection.scripts.splice(index - 1, 0, script)
}
}
moveScriptDown (script: LoginScript) {
if (!this.connection.scripts) {
this.connection.scripts = []
}
const index = this.connection.scripts.indexOf(script)
if (index >= 0 && index < this.connection.scripts.length - 1) {
this.connection.scripts.splice(index, 1)
this.connection.scripts.splice(index + 1, 0, script)
}
}
async deleteScript (script: LoginScript) {
if (this.connection.scripts && (await this.electron.showMessageBox(
this.hostApp.getWindow(),
{
type: 'warning',
message: 'Delete this script?',
detail: script.expect,
buttons: ['Keep', 'Delete'],
defaultId: 1,
}
)).response === 1) {
this.connection.scripts = this.connection.scripts.filter(x => x !== script)
}
}
addScript () {
if (!this.connection.scripts) {
this.connection.scripts = []
}
this.connection.scripts.push({ expect: '', send: '' })
}
}

View File

@@ -0,0 +1,16 @@
h3 Connections
.list-group.list-group-flush.mt-3.mb-3
.list-group-item.list-group-item-action.d-flex.align-items-center(
*ngFor='let connection of connections',
(click)='editConnection(connection)'
)
.mr-auto
div {{connection.name}}
.text-muted {{connection.port}}
button.btn.btn-outline-danger.ml-1((click)='$event.stopPropagation(); deleteConnection(connection)')
i.fas.fa-trash
button.btn.btn-primary((click)='createConnection()')
i.fas.fa-fw.fa-plus
span.ml-2 Add connection

View File

@@ -0,0 +1,80 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Component } from '@angular/core'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { ConfigService, ElectronService, HostAppService } from 'terminus-core'
import { SerialConnection } from '../api'
import { EditConnectionModalComponent } from './editConnectionModal.component'
/** @hidden */
@Component({
template: require('./serialSettingsTab.component.pug'),
})
export class SerialSettingsTabComponent {
connections: SerialConnection[]
constructor (
public config: ConfigService,
private electron: ElectronService,
private hostApp: HostAppService,
private ngbModal: NgbModal,
) {
this.connections = this.config.store.serial.connections
this.refresh()
}
createConnection () {
const connection: SerialConnection = {
name: '',
port: '',
baudrate: 115200,
databits: 8,
parity: 'none',
rtscts: false,
stopbits: 1,
xany: false,
xoff: false,
xon: false,
}
const modal = this.ngbModal.open(EditConnectionModalComponent)
modal.componentInstance.connection = connection
modal.result.then(result => {
this.connections.push(result)
this.config.store.serial.connections = this.connections
this.config.save()
this.refresh()
})
}
editConnection (connection: SerialConnection) {
const modal = this.ngbModal.open(EditConnectionModalComponent, { size: 'lg' })
modal.componentInstance.connection = Object.assign({}, connection)
modal.result.then(result => {
Object.assign(connection, result)
this.config.store.serial.connections = this.connections
this.config.save()
this.refresh()
})
}
async deleteConnection (connection: SerialConnection) {
if ((await this.electron.showMessageBox(
this.hostApp.getWindow(),
{
type: 'warning',
message: `Delete "${connection.name}"?`,
buttons: ['Keep', 'Delete'],
defaultId: 1,
}
)).response === 1) {
this.connections = this.connections.filter(x => x !== connection)
this.config.store.serial.connections = this.connections
this.config.save()
this.refresh()
}
}
refresh () {
this.connections = this.config.store.serial.connections
}
}

View File

@@ -0,0 +1,16 @@
.tab-toolbar
.btn.btn-outline-secondary.reveal-button
i.fas.fa-ellipsis-h
.toolbar(*ngIf='session', [class.show]='!session.open')
i.fas.fa-circle.text-success.mr-2(*ngIf='session.open')
i.fas.fa-circle.text-danger.mr-2(*ngIf='!session.open')
strong(*ngIf='session') {{session.connection.port}} ({{session.connection.baudrate}})
.mr-auto
button.btn.btn-secondary.mr-3((click)='changeBaudRate()', *ngIf='session.open')
span Change baud rate
button.btn.btn-info((click)='reconnect()', *ngIf='!session.open')
i.fas.fa-reload
span Reconnect

View File

@@ -0,0 +1,7 @@
@import '../../../terminus-ssh/src/components/sshTab.component.scss';
:host {
select {
width: auto;
}
}

View File

@@ -0,0 +1,118 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import colors from 'ansi-colors'
import { Spinner } from 'cli-spinner'
import { Component, Injector } from '@angular/core'
import { first } from 'rxjs/operators'
import { BaseTerminalTabComponent } from 'terminus-terminal'
import { SerialService } from '../services/serial.service'
import { SerialConnection, SerialSession, BAUD_RATES } from '../api'
import { Subscription } from 'rxjs'
/** @hidden */
@Component({
selector: 'serial-tab',
template: BaseTerminalTabComponent.template + require<string>('./serialTab.component.pug'),
styles: [require('./serialTab.component.scss'), ...BaseTerminalTabComponent.styles],
animations: BaseTerminalTabComponent.animations,
})
export class SerialTabComponent extends BaseTerminalTabComponent {
connection: SerialConnection
session: SerialSession
serialPort: any
private homeEndSubscription: Subscription
// eslint-disable-next-line @typescript-eslint/no-useless-constructor
constructor (
injector: Injector,
) {
super(injector)
}
ngOnInit () {
this.logger = this.log.create('terminalTab')
this.homeEndSubscription = this.hotkeys.matchedHotkey.subscribe(hotkey => {
if (!this.hasFocus) {
return
}
switch (hotkey) {
case 'home':
this.sendInput('\x1b[H' )
break
case 'end':
this.sendInput('\x1b[F' )
break
}
})
this.frontendReady$.pipe(first()).subscribe(() => {
this.initializeSession()
})
super.ngOnInit()
setImmediate(() => {
this.setTitle(this.connection.name)
})
}
async initializeSession () {
if (!this.connection) {
this.logger.error('No Serial connection info supplied')
return
}
this.session = this.injector.get(SerialService).createSession(this.connection)
this.session.serviceMessage$.subscribe(msg => {
this.write('\r\n' + colors.black.bgWhite(' serial ') + ' ' + msg + '\r\n')
this.session.resize(this.size.columns, this.size.rows)
})
this.attachSessionHandlers()
this.write(`Connecting to `)
const spinner = new Spinner({
text: 'Connecting',
stream: {
write: x => this.write(x),
},
})
spinner.setSpinnerString(6)
spinner.start()
try {
this.serialPort = await this.injector.get(SerialService).connectSession(this.session)
spinner.stop(true)
} catch (e) {
spinner.stop(true)
this.write(colors.black.bgRed(' X ') + ' ' + colors.red(e.message) + '\r\n')
return
}
await this.session.start()
this.session.resize(this.size.columns, this.size.rows)
}
async getRecoveryToken (): Promise<any> {
return {
type: 'app:serial-tab',
connection: this.connection,
savedState: this.frontend?.saveState(),
}
}
reconnect () {
this.initializeSession()
}
async changeBaudRate () {
const rate = await this.app.showSelector('Baud rate', BAUD_RATES.map(x => ({
name: x.toString(), result: x,
})))
this.serialPort.update({ baudRate: rate })
this.connection.baudrate = rate
}
ngOnDestroy () {
this.homeEndSubscription.unsubscribe()
super.ngOnDestroy()
}
}

View File

@@ -0,0 +1,19 @@
import { ConfigProvider } from 'terminus-core'
/** @hidden */
export class SerialConfigProvider extends ConfigProvider {
defaults = {
serial: {
connections: [],
options: {
},
},
hotkeys: {
serial: [
'Alt-K',
],
},
}
platformDefaults = { }
}

View File

@@ -0,0 +1,17 @@
import { Injectable } from '@angular/core'
import { HotkeyDescription, HotkeyProvider } from 'terminus-core'
/** @hidden */
@Injectable()
export class SerialHotkeyProvider extends HotkeyProvider {
hotkeys: HotkeyDescription[] = [
{
id: 'serial',
name: 'Show Serial connections',
},
]
async provide (): Promise<HotkeyDescription[]> {
return this.hotkeys
}
}

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