Compare commits

..

302 Commits

Author SHA1 Message Date
Eugene Pankov
9408470766 workflow 2021-06-20 19:11:50 +02:00
Eugene Pankov
00d3a6826c Update electron-builder.yml 2021-06-20 19:08:56 +02:00
Eugene Pankov
1d7a3eb194 workflow 2021-06-20 18:52:11 +02:00
Eugene Pankov
2af1e6e6ac fixes 2021-06-20 17:14:31 +02:00
Eugene Pankov
552991271f error handling 2021-06-20 17:01:24 +02:00
Eugene Pankov
396d8d6122 Update linux.yml 2021-06-19 23:00:07 +02:00
Eugene Pankov
20228b5935 lint 2021-06-19 22:59:15 +02:00
Eugene Pankov
b60c36054f more web cleanup 2021-06-19 22:52:18 +02:00
Eugene Pankov
6742c77378 Update linux.yml 2021-06-19 22:27:25 +02:00
Eugene Pankov
8801574650 Update install-deps.js 2021-06-19 22:01:35 +02:00
Eugene Pankov
77d6a7886f Update linux.yml 2021-06-19 21:57:37 +02:00
Eugene Pankov
51f62c9719 allow storing private keys in the vault 2021-06-19 21:54:27 +02:00
Eugene Pankov
e41fe9f4c0 Update build-macos.js 2021-06-19 20:10:34 +02:00
Eugene Pankov
b4896b4038 Update windows.yml 2021-06-19 19:45:30 +02:00
Eugene Pankov
379fd122fc Update build-macos.js 2021-06-19 19:44:51 +02:00
Eugene Pankov
fad7858f3f more electron/web separation 2021-06-19 01:36:25 +02:00
Eugene Pankov
fa31ac65ab sftp - show size and date - fixes #4001 2021-06-18 22:25:40 +02:00
Eugene Pankov
907ebc0fd5 fixed multiple sftp uploads - fixes #4001 2021-06-18 21:58:25 +02:00
Eugene Pankov
5ef0ae6d44 Update updater.service.ts 2021-06-17 22:05:03 +02:00
Eugene Pankov
d5183b9fc5 icon tweaks 2021-06-17 22:04:50 +02:00
Eugene Pankov
c946decbca sftp improvements, fixes #3992 2021-06-17 20:38:47 +02:00
Eugene Pankov
96ce42461d moved menu zone handling into terminus-electron 2021-06-17 20:38:20 +02:00
Eugene Pankov
cdf97f3b31 fixed #3982 2021-06-16 12:30:00 +02:00
Eugene Pankov
c29659e13c added web polyfills 2021-06-15 23:43:02 +02:00
Eugene
8f80eea14b Merge pull request #3987 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-4.13.0 2021-06-14 13:14:35 +02:00
dependabot[bot]
7461a89ebd Bump xterm from 4.12.0 to 4.13.0 in /terminus-terminal
Bumps [xterm](https://github.com/xtermjs/xterm.js) from 4.12.0 to 4.13.0.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/compare/4.12.0...4.13.0)

---
updated-dependencies:
- dependency-name: xterm
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-14 04:31:10 +00:00
Eugene Pankov
3dc103c6cf build fix 2021-06-13 22:23:53 +02:00
Eugene Pankov
2b2865e5f6 lint 2021-06-13 21:38:34 +02:00
Eugene Pankov
33479a17dd lint 2021-06-13 21:11:06 +02:00
Eugene Pankov
6ce76af9be zone-ified sftp promises 2021-06-13 21:03:33 +02:00
Eugene Pankov
a2ed674b10 fixed window controls behaviour - fixes #3984 2021-06-12 23:21:17 +02:00
Eugene Pankov
11cd42e56c Update linux.yml 2021-06-12 18:11:35 +02:00
Eugene Pankov
9e17ce157d download/upload implementation for the web 2021-06-12 13:05:09 +02:00
Eugene Pankov
a397884d3c added experimental SFTP implementation - fixes #296 2021-06-12 01:18:07 +02:00
Eugene Pankov
019cba06d4 fixed #3138 2021-06-12 00:25:26 +02:00
Eugene Pankov
fb4d5dc0cb Merge remote-tracking branch 'origin/file-transfers' 2021-06-11 22:35:21 +02:00
Eugene Pankov
f2a865f301 fixed linux package name 2021-06-08 20:26:55 +02:00
Eugene Pankov
86bb73135e fixed linux package name 2021-06-08 18:36:27 +02:00
Eugene Pankov
57c7e48bea finished transfers menu 2021-06-07 01:13:53 +02:00
Eugene Pankov
49369873cc Update platform.service.ts 2021-06-06 22:37:38 +02:00
Eugene Pankov
0f2ba46d67 transfers wip 2021-06-06 22:37:19 +02:00
Eugene Pankov
be767e7480 updated clink - fixes #3951 2021-06-06 18:58:08 +02:00
Eugene
d8e7cab87e Merge pull request #3949 from Eugeny/dependabot/npm_and_yarn/app/types/node-15.12.1
Bump @types/node from 15.6.1 to 15.12.1 in /app
2021-06-06 00:38:58 +02:00
Eugene
411aad81fd Merge pull request #3955 from Eugeny/dependabot/npm_and_yarn/core-js-3.14.0 2021-06-06 00:38:35 +02:00
dependabot[bot]
535408d30d Bump core-js from 3.12.1 to 3.14.0
Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.12.1 to 3.14.0.
- [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/commits/v3.14.0/packages/core-js)

---
updated-dependencies:
- dependency-name: core-js
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-05 17:34:17 +00:00
dependabot[bot]
e52901bc1a Bump @types/node from 15.6.1 to 15.12.1 in /app
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 15.6.1 to 15.12.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-05 17:32:24 +00:00
Eugene
605094cb02 Merge pull request #3956 from Eugeny/dependabot/npm_and_yarn/electron-13.1.1 2021-06-05 19:31:20 +02:00
Eugene
5086a5f596 Merge pull request #3945 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/utils-decorators-1.8.3
Bump utils-decorators from 1.8.1 to 1.8.3 in /terminus-terminal
2021-06-05 19:31:04 +02:00
Eugene
3f667c85e4 Merge pull request #3944 from Eugeny/dependabot/npm_and_yarn/terminus-local/utils-decorators-1.8.3
Bump utils-decorators from 1.8.1 to 1.8.3 in /terminus-local
2021-06-05 19:31:00 +02:00
Eugene
c9c42c8a22 Merge pull request #3943 from Eugeny/dependabot/npm_and_yarn/terminus-settings/utils-decorators-1.8.3
Bump utils-decorators from 1.8.1 to 1.8.3 in /terminus-settings
2021-06-05 19:30:55 +02:00
Eugene Pankov
6c3099f081 Merge branch 'master' of github.com:Eugeny/terminus 2021-06-05 19:30:15 +02:00
Eugene Pankov
4056afc880 Update README.md 2021-06-05 19:30:12 +02:00
dependabot[bot]
06e815430e Bump electron from 13.0.0 to 13.1.1
Bumps [electron](https://github.com/electron/electron) from 13.0.0 to 13.1.1.
- [Release notes](https://github.com/electron/electron/releases)
- [Changelog](https://github.com/electron/electron/blob/main/docs/breaking-changes.md)
- [Commits](https://github.com/electron/electron/compare/v13.0.0...v13.1.1)

---
updated-dependencies:
- dependency-name: electron
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-05 17:23:03 +00:00
Eugene
fc2a7c49c7 Merge pull request #3937 from Eugeny/dependabot/npm_and_yarn/electron-13.1.0
Bump electron from 13.0.0 to 13.1.0
2021-06-05 19:19:46 +02:00
Eugene
a3fe87431c Merge pull request #3933 from Eugeny/dependabot/npm_and_yarn/sass-loader-12.0.0
Bump sass-loader from 11.1.1 to 12.0.0
2021-06-05 19:19:07 +02:00
Eugene
d73368b3c2 Merge pull request #3916 from Eugeny/dependabot/npm_and_yarn/node-gyp-8.1.0
Bump node-gyp from 8.0.0 to 8.1.0
2021-06-05 19:18:48 +02:00
Eugene
eada482ff7 Merge pull request #3954 from Eugeny/dependabot/npm_and_yarn/terminus-core/core-js-3.14.0
Bump core-js from 3.12.1 to 3.14.0 in /terminus-core
2021-06-05 19:18:31 +02:00
Eugene
b0a7a348ce Merge pull request #3924 from Eugeny/dependabot/npm_and_yarn/app/serialport-9.1.0 2021-06-05 19:17:54 +02:00
dependabot[bot]
3069862b25 Bump core-js from 3.12.1 to 3.14.0 in /terminus-core
Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.12.1 to 3.14.0.
- [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/commits/v3.14.0/packages/core-js)

---
updated-dependencies:
- dependency-name: core-js
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-05 17:17:47 +00:00
Eugene
b0f28a4c01 Merge pull request #3925 from Eugeny/dependabot/npm_and_yarn/core-js-3.13.1
Bump core-js from 3.12.1 to 3.13.1
2021-06-05 19:17:37 +02:00
Eugene
339d7eb996 Merge pull request #3926 from Eugeny/dependabot/npm_and_yarn/eslint-plugin-import-2.23.4 2021-06-05 19:17:33 +02:00
Eugene
83cdc96d35 Merge pull request #3930 from Eugeny/dependabot/npm_and_yarn/typescript-eslint/parser-4.26.0
Bump @typescript-eslint/parser from 4.25.0 to 4.26.0
2021-06-05 19:17:23 +02:00
Eugene
d9e0d27261 Merge pull request #3904 from Eugeny/dependabot/npm_and_yarn/app/node-abi-2.30.0 2021-06-05 19:16:57 +02:00
Eugene Pankov
cbaf40bb82 allow config encryption 2021-06-05 19:13:22 +02:00
Eugene Pankov
7f18396926 added the vault 2021-06-05 17:38:11 +02:00
Eugene Pankov
17471096f2 fixed provider duplication 2021-06-05 12:50:19 +02:00
Eugene Pankov
c2ca127574 added a winscp hotkey - fixes #2938 2021-06-05 12:32:38 +02:00
Eugene Pankov
03bf6e5302 don't recover state when splitting 2021-06-05 12:22:19 +02:00
Eugene
95adff0b13 Merge pull request #3953 from Eugeny/all-contributors/add-lambdalisue 2021-06-05 12:10:33 +02:00
allcontributors[bot]
177916c373 docs: update .all-contributorsrc [skip ci] 2021-06-05 10:10:24 +00:00
allcontributors[bot]
86d13bf056 docs: update README.md [skip ci] 2021-06-05 10:10:23 +00:00
Eugene
ac9fe4cf45 Merge pull request #3952 from lambdalisue/add-color-scheme-iceberg 2021-06-05 12:10:22 +02:00
Eugene Pankov
a9069a4a49 allow multiple private key paths - fixes #3921 2021-06-05 12:05:46 +02:00
Alisue
e91432faad Add Iceberg color scheme
https://cocopon.github.io/iceberg.vim/
2021-06-05 16:19:53 +09:00
Eugene Pankov
79a429be5d private key and agent auth cleanup 2021-06-04 23:05:20 +02:00
Eugene Pankov
779eb235f3 updated ssh2 2021-06-04 22:54:12 +02:00
Eugene Pankov
d435abd944 build fix 2021-06-04 09:01:52 +02:00
dependabot[bot]
a2dba19f94 Bump utils-decorators from 1.8.1 to 1.8.3 in /terminus-terminal
Bumps [utils-decorators](https://github.com/vlio20/utils-decorators) from 1.8.1 to 1.8.3.
- [Release notes](https://github.com/vlio20/utils-decorators/releases)
- [Commits](https://github.com/vlio20/utils-decorators/commits)

---
updated-dependencies:
- dependency-name: utils-decorators
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-04 04:28:56 +00:00
dependabot[bot]
c9821dafa5 Bump utils-decorators from 1.8.1 to 1.8.3 in /terminus-local
Bumps [utils-decorators](https://github.com/vlio20/utils-decorators) from 1.8.1 to 1.8.3.
- [Release notes](https://github.com/vlio20/utils-decorators/releases)
- [Commits](https://github.com/vlio20/utils-decorators/commits)

---
updated-dependencies:
- dependency-name: utils-decorators
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-04 04:28:38 +00:00
dependabot[bot]
c32b38c066 Bump utils-decorators from 1.8.1 to 1.8.3 in /terminus-settings
Bumps [utils-decorators](https://github.com/vlio20/utils-decorators) from 1.8.1 to 1.8.3.
- [Release notes](https://github.com/vlio20/utils-decorators/releases)
- [Commits](https://github.com/vlio20/utils-decorators/commits)

---
updated-dependencies:
- dependency-name: utils-decorators
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-04 04:26:58 +00:00
Eugene Pankov
2b4c25104f lint 2021-06-03 22:48:48 +02:00
Eugene Pankov
45c48b379b logging cleanup 2021-06-03 22:47:22 +02:00
Eugene Pankov
3d16dad0cb fixed zmodem issues - fixes #3914, fixed #3860, fixes #3509, fixes #2609, fixes #2368 2021-06-03 22:46:19 +02:00
Eugene Pankov
4a0cbff2d6 pty cleanup 2021-06-03 22:44:22 +02:00
Eugene Pankov
9a1cea29f9 removed patch-package 2021-06-03 22:42:02 +02:00
Eugene Pankov
c0bd008f40 more platform changes 2021-06-03 19:07:48 +02:00
dependabot[bot]
74a3773332 Bump electron from 13.0.0 to 13.1.0
Bumps [electron](https://github.com/electron/electron) from 13.0.0 to 13.1.0.
- [Release notes](https://github.com/electron/electron/releases)
- [Changelog](https://github.com/electron/electron/blob/main/docs/breaking-changes.md)
- [Commits](https://github.com/electron/electron/compare/v13.0.0...v13.1.0)

---
updated-dependencies:
- dependency-name: electron
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-03 04:06:47 +00:00
dependabot[bot]
fb4b39adf9 Bump sass-loader from 11.1.1 to 12.0.0
Bumps [sass-loader](https://github.com/webpack-contrib/sass-loader) from 11.1.1 to 12.0.0.
- [Release notes](https://github.com/webpack-contrib/sass-loader/releases)
- [Changelog](https://github.com/webpack-contrib/sass-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/sass-loader/compare/v11.1.1...v12.0.0)

---
updated-dependencies:
- dependency-name: sass-loader
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-02 04:01:04 +00:00
dependabot[bot]
dffee853b8 Bump @typescript-eslint/parser from 4.25.0 to 4.26.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 4.25.0 to 4.26.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/v4.26.0/packages/parser)

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-01 04:05:08 +00:00
dependabot[bot]
13950e298d Bump eslint-plugin-import from 2.23.3 to 2.23.4
Bumps [eslint-plugin-import](https://github.com/benmosher/eslint-plugin-import) from 2.23.3 to 2.23.4.
- [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.23.3...v2.23.4)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-31 04:05:30 +00:00
dependabot[bot]
4a56c24d25 Bump core-js from 3.12.1 to 3.13.1
Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.12.1 to 3.13.1.
- [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/commits/v3.13.1/packages/core-js)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-31 04:04:51 +00:00
dependabot[bot]
d0365d8f43 Bump serialport from 9.0.8 to 9.1.0 in /app
Bumps [serialport](https://github.com/serialport/node-serialport) from 9.0.8 to 9.1.0.
- [Release notes](https://github.com/serialport/node-serialport/releases)
- [Changelog](https://github.com/serialport/node-serialport/blob/master/CHANGELOG.md)
- [Commits](https://github.com/serialport/node-serialport/compare/@serialport/bindings@9.0.8...@serialport/bindings@9.1.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-31 04:02:34 +00:00
Eugene Pankov
faa9a1269c mark deb as replacing old pkg 2021-05-28 20:29:07 +02:00
Eugene Pankov
3d754090f7 Merge branch 'linux-pkg-rename' 2021-05-28 20:28:44 +02:00
dependabot[bot]
a57b7cfc84 Bump node-abi from 2.26.0 to 2.30.0 in /app
Bumps [node-abi](https://github.com/lgeiger/node-abi) from 2.26.0 to 2.30.0.
- [Release notes](https://github.com/lgeiger/node-abi/releases)
- [Commits](https://github.com/lgeiger/node-abi/compare/v2.26.0...v2.30.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-28 18:10:06 +00:00
dependabot[bot]
3fcb6b126e Bump node-gyp from 8.0.0 to 8.1.0
Bumps [node-gyp](https://github.com/nodejs/node-gyp) from 8.0.0 to 8.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/v8.0.0...v8.1.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-28 18:09:49 +00:00
Eugene Pankov
871b06c19d lint 2021-05-28 20:08:27 +02:00
Eugene Pankov
95cc29f8a7 removed gyp dependency 2021-05-28 20:01:30 +02:00
Eugene
e67efea682 Merge pull request #3917 from Eugeny/dependabot/npm_and_yarn/webpack-5.38.1 2021-05-28 19:55:04 +02:00
Eugene Pankov
4e3ba9bf2f renamed linux packages - fixes #3364, fixes #3796, fixes #3741 2021-05-28 19:51:53 +02:00
Eugene Pankov
1931b5ac7e handle buffers cut in the middle of a unicode char - fixes #3883, fixes #3882, fixes #3093, fixes #2043 2021-05-28 19:39:41 +02:00
Eugene Pankov
ae7416792a bump node-abi 2021-05-28 19:39:01 +02:00
Eugene Pankov
86083e1491 cancel broadcast on when clicking any pane 2021-05-28 19:24:42 +02:00
Eugene Pankov
d324b5e665 Merge branch 'electron13' 2021-05-28 19:18:08 +02:00
dependabot[bot]
46be8b92e0 Bump webpack from 5.37.1 to 5.38.1
Bumps [webpack](https://github.com/webpack/webpack) from 5.37.1 to 5.38.1.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.37.1...v5.38.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-28 04:06:04 +00:00
Eugene Pankov
f7b7502bfc electron 13 wip 2021-05-25 12:28:02 +02:00
Eugene
f980d540e8 Merge pull request #3897 from Eugeny/dependabot/npm_and_yarn/types/node-15.6.1
Bump @types/node from 14.14.35 to 15.6.1
2021-05-25 12:21:38 +02:00
Eugene
cc420c57c7 Merge pull request #3889 from Eugeny/dependabot/npm_and_yarn/eslint-plugin-import-2.23.3
Bump eslint-plugin-import from 2.22.1 to 2.23.3
2021-05-25 12:21:20 +02:00
Eugene
808b8cade0 Merge pull request #3896 from Eugeny/dependabot/npm_and_yarn/app/types/node-15.6.1 2021-05-25 12:21:10 +02:00
dependabot[bot]
d54ce984e3 Bump @types/node from 14.14.35 to 15.6.1
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 14.14.35 to 15.6.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-25 07:55:52 +00:00
dependabot[bot]
19576dfa92 Bump @types/node from 15.3.0 to 15.6.1 in /app
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 15.3.0 to 15.6.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-25 07:53:53 +00:00
Eugene
db16f8ceb5 Merge pull request #3898 from Eugeny/dependabot/npm_and_yarn/typescript-eslint/parser-4.25.0
Bump @typescript-eslint/parser from 4.24.0 to 4.25.0
2021-05-25 09:52:15 +02:00
dependabot[bot]
6b592f6de4 Bump eslint-plugin-import from 2.22.1 to 2.23.3
Bumps [eslint-plugin-import](https://github.com/benmosher/eslint-plugin-import) from 2.22.1 to 2.23.3.
- [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.22.1...v2.23.3)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-25 07:51:11 +00:00
Eugene
2f9e3ad41a Merge pull request #3887 from Eugeny/dependabot/npm_and_yarn/eslint-7.27.0
Bump eslint from 7.26.0 to 7.27.0
2021-05-25 09:46:39 +02:00
Eugene
c464cefa92 Merge pull request #3859 from Eugeny/dependabot/npm_and_yarn/val-loader-4.0.0 2021-05-25 09:45:54 +02:00
Eugene
2ca7a05078 Merge pull request #3892 from Eugeny/dependabot/npm_and_yarn/css-loader-5.2.6 2021-05-25 09:44:44 +02:00
Eugene
997c49660b Merge pull request #3886 from Eugeny/dependabot/npm_and_yarn/app/rxjs-7.1.0 2021-05-25 09:42:51 +02:00
dependabot[bot]
3c139eaa10 Bump @typescript-eslint/parser from 4.24.0 to 4.25.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 4.24.0 to 4.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/v4.25.0/packages/parser)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-25 04:06:10 +00:00
Eugene
3ad5aa34b2 Merge pull request #3894 from Eugeny/dependabot/npm_and_yarn/browserslist-4.16.6 2021-05-24 23:33:19 +02:00
Eugene Pankov
8d9cc8c742 Merge branch 'master' of github.com:Eugeny/terminus 2021-05-24 23:30:09 +02:00
Eugene Pankov
992b27900e fixed dependabot PR checks 2021-05-24 23:30:05 +02:00
dependabot[bot]
4ac97657f4 Bump eslint from 7.26.0 to 7.27.0
Bumps [eslint](https://github.com/eslint/eslint) from 7.26.0 to 7.27.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v7.26.0...v7.27.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-24 20:46:42 +00:00
dependabot[bot]
2ac5dcfe12 Bump val-loader from 3.1.0 to 4.0.0
Bumps [val-loader](https://github.com/webpack-contrib/val-loader) from 3.1.0 to 4.0.0.
- [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/v3.1.0...v4.0.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-24 20:46:27 +00:00
dependabot[bot]
e05ca97beb Bump css-loader from 5.2.4 to 5.2.6
Bumps [css-loader](https://github.com/webpack-contrib/css-loader) from 5.2.4 to 5.2.6.
- [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/v5.2.4...v5.2.6)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-24 20:45:56 +00:00
dependabot[bot]
6515035e04 Bump rxjs from 7.0.1 to 7.1.0 in /app
Bumps [rxjs](https://github.com/reactivex/rxjs) from 7.0.1 to 7.1.0.
- [Release notes](https://github.com/reactivex/rxjs/releases)
- [Changelog](https://github.com/ReactiveX/rxjs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/reactivex/rxjs/compare/7.0.1...7.1.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-24 20:45:27 +00:00
Eugene
9323c2f833 Merge pull request #3867 from Eugeny/dependabot/npm_and_yarn/webpack-bundle-analyzer-4.4.2
Bump webpack-bundle-analyzer from 4.4.1 to 4.4.2
2021-05-24 22:43:17 +02:00
dependabot[bot]
6ffdfa7c07 Bump webpack-bundle-analyzer from 4.4.1 to 4.4.2
Bumps [webpack-bundle-analyzer](https://github.com/webpack-contrib/webpack-bundle-analyzer) from 4.4.1 to 4.4.2.
- [Release notes](https://github.com/webpack-contrib/webpack-bundle-analyzer/releases)
- [Changelog](https://github.com/webpack-contrib/webpack-bundle-analyzer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/webpack-bundle-analyzer/compare/v4.4.1...v4.4.2)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-24 20:43:03 +00:00
Eugene
221901b344 Merge pull request #3866 from Eugeny/dependabot/npm_and_yarn/typescript-eslint/parser-4.24.0
Bump @typescript-eslint/parser from 4.23.0 to 4.24.0
2021-05-24 22:42:33 +02:00
Eugene
baf6076819 Merge pull request #3863 from Eugeny/dependabot/npm_and_yarn/app/ngx-toastr-14.0.0
Bump ngx-toastr from 13.2.1 to 14.0.0 in /app
2021-05-24 22:41:58 +02:00
Eugene
e8f383020c Merge pull request #3857 from Eugeny/dependabot/npm_and_yarn/terminus-local/slugify-1.5.3 2021-05-24 22:41:33 +02:00
Eugene
2d0b84ea3d Merge pull request #3842 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/slugify-1.5.3
Bump slugify from 1.4.7 to 1.5.3 in /terminus-terminal
2021-05-24 22:41:28 +02:00
dependabot[bot]
6f753800d4 Bump browserslist from 4.16.0 to 4.16.6
Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.16.0 to 4.16.6.
- [Release notes](https://github.com/browserslist/browserslist/releases)
- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md)
- [Commits](https://github.com/browserslist/browserslist/compare/4.16.0...4.16.6)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-24 20:40:36 +00:00
Eugene
4b39d99102 Merge pull request #3891 from Eugeny/dependabot/npm_and_yarn/app/serialport-9.0.8
Bump serialport from 9.0.7 to 9.0.8 in /app
2021-05-24 22:40:34 +02:00
Eugene
afbd221cf5 Merge pull request #3874 from Eugeny/dependabot/npm_and_yarn/electron-12.0.9
Bump electron from 12.0.7 to 12.0.9
2021-05-24 22:40:18 +02:00
Eugene
5157d317fd Merge pull request #3872 from Eugeny/dependabot/npm_and_yarn/webpack-5.37.1
Bump webpack from 5.37.0 to 5.37.1
2021-05-24 22:39:57 +02:00
Eugene Pankov
650af9fa22 build fix 2021-05-24 21:15:08 +02:00
Eugene Pankov
b9e3ef1434 build fix 2021-05-24 21:08:58 +02:00
Eugene Pankov
297b6b69b1 build fix 2021-05-24 18:34:07 +02:00
dependabot[bot]
befb8d44fd Bump webpack from 5.37.0 to 5.37.1
Bumps [webpack](https://github.com/webpack/webpack) from 5.37.0 to 5.37.1.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.37.0...v5.37.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-24 15:52:57 +00:00
dependabot[bot]
7f81199c17 Bump electron from 12.0.7 to 12.0.9
Bumps [electron](https://github.com/electron/electron) from 12.0.7 to 12.0.9.
- [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/v12.0.7...v12.0.9)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-24 15:52:43 +00:00
dependabot[bot]
33b9bc3c22 Bump serialport from 9.0.7 to 9.0.8 in /app
Bumps [serialport](https://github.com/serialport/node-serialport) from 9.0.7 to 9.0.8.
- [Release notes](https://github.com/serialport/node-serialport/releases)
- [Changelog](https://github.com/serialport/node-serialport/blob/master/CHANGELOG.md)
- [Commits](https://github.com/serialport/node-serialport/compare/@serialport/bindings@9.0.7...v9.0.8)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-24 15:50:21 +00:00
Eugene Pankov
012986dc7e started separating terminus-electron and terminus-web 2021-05-24 17:48:12 +02:00
Eugene Pankov
c19e131d8c fixed the color scheme preview not updating 2021-05-23 18:25:43 +02:00
dependabot[bot]
6407bb32db Bump @typescript-eslint/parser from 4.23.0 to 4.24.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 4.23.0 to 4.24.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/v4.24.0/packages/parser)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-18 04:07:49 +00:00
dependabot[bot]
617578bfe3 Bump ngx-toastr from 13.2.1 to 14.0.0 in /app
Bumps [ngx-toastr](https://github.com/scttcper/ngx-toastr) from 13.2.1 to 14.0.0.
- [Release notes](https://github.com/scttcper/ngx-toastr/releases)
- [Commits](https://github.com/scttcper/ngx-toastr/compare/v13.2.1...v14.0.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-18 04:02:57 +00:00
dependabot[bot]
8edde00a83 Bump slugify from 1.4.7 to 1.5.3 in /terminus-local
Bumps [slugify](https://github.com/simov/slugify) from 1.4.7 to 1.5.3.
- [Release notes](https://github.com/simov/slugify/releases)
- [Commits](https://github.com/simov/slugify/compare/v1.4.7...v1.5.3)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-17 07:36:15 +00:00
dependabot[bot]
ca7b4b1311 Bump slugify from 1.4.7 to 1.5.3 in /terminus-terminal
Bumps [slugify](https://github.com/simov/slugify) from 1.4.7 to 1.5.3.
- [Release notes](https://github.com/simov/slugify/releases)
- [Commits](https://github.com/simov/slugify/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-17 07:36:02 +00:00
Eugene Pankov
72e667d59d fixed update check interval 2021-05-16 21:52:36 +02:00
Eugene Pankov
cbcd0fea61 lint 2021-05-16 20:17:40 +02:00
Eugene Pankov
f709c9010c lint 2021-05-16 20:15:44 +02:00
Eugene Pankov
8f34c21652 lint 2021-05-16 20:10:37 +02:00
Eugene Pankov
6f11beb8c4 allow custom baud rates - fixes #2490 2021-05-16 20:00:31 +02:00
Eugene Pankov
bb9c9d8313 fixed webpack sourcemap namespaces 2021-05-16 19:41:04 +02:00
Eugene Pankov
7398d776be set Terminus as COMSPEC inside shells - fixes #3643 2021-05-16 19:40:54 +02:00
Eugene Pankov
2f865e70c5 downgrade node on appveyor 2021-05-16 19:18:22 +02:00
Eugene Pankov
2f99eeef40 truly blacklist plugins and don't load them 2021-05-16 18:59:25 +02:00
Eugene Pankov
8f2a3f1333 fixes for running without local plugin 2021-05-16 18:59:14 +02:00
Eugene Pankov
38136a5f33 downgraded ci node to stable 2021-05-16 18:58:46 +02:00
Eugene Pankov
3ef4a8aa73 split terminus-local out of terminus-terminal 2021-05-16 17:36:33 +02:00
Eugene Pankov
7506670dfb CLI options to start SSH and serial connections - fixes #2785 2021-05-16 16:06:50 +02:00
Eugene Pankov
3f40098ffb cli fixes 2021-05-16 15:57:17 +02:00
Eugene Pankov
fa07fdcb64 made cli handling extensible - fixes #3763 2021-05-16 15:44:04 +02:00
Eugene Pankov
8fb2bc1ba0 updated sourcemaps config 2021-05-16 14:59:01 +02:00
Eugene Pankov
8e7f97b5db Merge branch 'master' of github.com:Eugeny/terminus 2021-05-16 14:41:42 +02:00
Eugene Pankov
952af3f8b8 build fixes 2021-05-16 14:41:39 +02:00
Eugene
5fc852da10 Merge pull request #3808 from Eugeny/dependabot/github_actions/actions/checkout-2.3.4 2021-05-16 14:31:30 +02:00
Eugene
1a2b1f0001 Merge branch 'master' into dependabot/github_actions/actions/checkout-2.3.4 2021-05-16 14:31:25 +02:00
Eugene Pankov
3716d52700 bumped angular and ng-bootstrap 2021-05-16 13:53:13 +02:00
Eugene
e1e18bb403 Merge pull request #3830 from Eugeny/dependabot/npm_and_yarn/source-code-pro-2.38.0
Bump source-code-pro from 2.30.2 to 2.38.0
2021-05-16 13:40:49 +02:00
Eugene
08753b72f0 Merge pull request #3813 from Eugeny/dependabot/npm_and_yarn/app/yargs-17.0.1
Bump yargs from 16.2.0 to 17.0.1 in /app
2021-05-16 13:40:07 +02:00
Eugene
c450fff1b3 Merge pull request #3839 from Eugeny/dependabot/npm_and_yarn/tslib-2.2.0
Bump tslib from 2.1.0 to 2.2.0
2021-05-16 13:39:09 +02:00
Eugene
d9ea8eae4e Merge pull request #3832 from Eugeny/dependabot/npm_and_yarn/webpack-bundle-analyzer-4.4.1
Bump webpack-bundle-analyzer from 4.4.0 to 4.4.1
2021-05-16 13:39:02 +02:00
Eugene
8ae80f9dc5 Merge pull request #3829 from Eugeny/dependabot/npm_and_yarn/css-loader-5.2.4
Bump css-loader from 5.2.0 to 5.2.4
2021-05-16 13:38:51 +02:00
Eugene
2bf612ba3d Merge pull request #3855 from Eugeny/dependabot/npm_and_yarn/app/types/node-15.3.0
Bump @types/node from 14.14.35 to 15.3.0 in /app
2021-05-16 13:37:58 +02:00
Eugene Pankov
91ef01f9d6 checkout depth 2021-05-16 13:37:48 +02:00
Eugene
52343319b0 Merge pull request #3810 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/deep-equal-2.0.5
Bump deep-equal from 1.1.0 to 2.0.5 in /terminus-terminal
2021-05-16 13:35:09 +02:00
dependabot[bot]
54c2bc4797 Bump css-loader from 5.2.0 to 5.2.4
Bumps [css-loader](https://github.com/webpack-contrib/css-loader) from 5.2.0 to 5.2.4.
- [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/v5.2.0...v5.2.4)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-15 17:32:54 +00:00
dependabot[bot]
29b0ee48af Bump tslib from 2.1.0 to 2.2.0
Bumps [tslib](https://github.com/Microsoft/tslib) from 2.1.0 to 2.2.0.
- [Release notes](https://github.com/Microsoft/tslib/releases)
- [Commits](https://github.com/Microsoft/tslib/compare/2.1.0...2.2.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-15 17:32:52 +00:00
dependabot[bot]
3435f3685a Bump webpack-bundle-analyzer from 4.4.0 to 4.4.1
Bumps [webpack-bundle-analyzer](https://github.com/webpack-contrib/webpack-bundle-analyzer) from 4.4.0 to 4.4.1.
- [Release notes](https://github.com/webpack-contrib/webpack-bundle-analyzer/releases)
- [Changelog](https://github.com/webpack-contrib/webpack-bundle-analyzer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/webpack-bundle-analyzer/compare/v4.4.0...v4.4.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-15 17:31:50 +00:00
dependabot[bot]
013e3bf338 Bump source-code-pro from 2.30.2 to 2.38.0
Bumps [source-code-pro](https://github.com/adobe-fonts/source-code-pro) from 2.30.2 to 2.38.0.
- [Release notes](https://github.com/adobe-fonts/source-code-pro/releases)
- [Commits](https://github.com/adobe-fonts/source-code-pro/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-15 17:31:38 +00:00
dependabot[bot]
35158ebba0 Bump yargs from 16.2.0 to 17.0.1 in /app
Bumps [yargs](https://github.com/yargs/yargs) from 16.2.0 to 17.0.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/v16.2.0...v17.0.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-15 17:26:25 +00:00
Eugene
a9162f955a Update linux.yml 2021-05-15 19:25:13 +02:00
dependabot[bot]
1db9e099f6 Bump @types/node from 14.14.35 to 15.3.0 in /app
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 14.14.35 to 15.3.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-15 17:24:32 +00:00
Eugene
6f1b0e02ff Merge pull request #3817 from Eugeny/dependabot/npm_and_yarn/app/keytar-7.7.0
Bump keytar from 7.6.0 to 7.7.0 in /app
2021-05-15 19:23:05 +02:00
Eugene
3e161a73e1 Merge pull request #3827 from Eugeny/dependabot/npm_and_yarn/types/js-yaml-4.0.1
Bump @types/js-yaml from 4.0.0 to 4.0.1
2021-05-15 19:22:57 +02:00
Eugene
6f91499271 Merge pull request #3844 from Eugeny/dependabot/npm_and_yarn/terminus-plugin-manager/types/semver-7.3.6
Bump @types/semver from 7.3.4 to 7.3.6 in /terminus-plugin-manager
2021-05-15 19:22:51 +02:00
Eugene
e4d1b5995c Merge pull request #3811 from Eugeny/dependabot/npm_and_yarn/terminus-core/mixpanel-0.13.0
Bump mixpanel from 0.10.3 to 0.13.0 in /terminus-core
2021-05-15 19:22:18 +02:00
Eugene
adc6bd810c Merge pull request #3819 from Eugeny/dependabot/npm_and_yarn/node-abi-2.26.0
Bump node-abi from 2.21.0 to 2.26.0
2021-05-15 19:21:46 +02:00
Eugene
afcaaefb1b Merge pull request #3816 from Eugeny/dependabot/npm_and_yarn/node-sass-6.0.0
Bump node-sass from 5.0.0 to 6.0.0
2021-05-15 19:21:41 +02:00
Eugene
b6509cf709 Merge pull request #3812 from Eugeny/dependabot/npm_and_yarn/app/node-abi-2.26.0
Bump node-abi from 2.21.0 to 2.26.0 in /app
2021-05-15 19:21:34 +02:00
Eugene
4d932eb693 Merge pull request #3821 from Eugeny/dependabot/npm_and_yarn/sentry/electron-2.4.1
Bump @sentry/electron from 2.4.0 to 2.4.1
2021-05-15 19:21:04 +02:00
Eugene
b7f7375da3 Merge pull request #3846 from Eugeny/dependabot/npm_and_yarn/sass-loader-11.1.1
Bump sass-loader from 11.0.1 to 11.1.1
2021-05-15 19:20:50 +02:00
Eugene
618596f6a9 Merge pull request #3826 from Eugeny/dependabot/npm_and_yarn/electron-12.0.7
Bump electron from 12.0.6 to 12.0.7
2021-05-15 19:20:43 +02:00
dependabot[bot]
cb2c425063 Bump actions/checkout from 1 to 2.3.4
Bumps [actions/checkout](https://github.com/actions/checkout) from 1 to 2.3.4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v1...v2.3.4)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-15 17:20:18 +00:00
Eugene
fe08c62290 Merge pull request #3809 from Eugeny/dependabot/github_actions/actions/setup-node-2.1.5
Bump actions/setup-node from 1 to 2.1.5
2021-05-15 19:19:47 +02:00
Eugene
115c733631 Merge pull request #3828 from Eugeny/dependabot/npm_and_yarn/webpack-5.37.0
Bump webpack from 5.31.0 to 5.37.0
2021-05-15 19:19:25 +02:00
Eugene
fc03e5e8d6 Merge pull request #3825 from Eugeny/dependabot/npm_and_yarn/webpack-cli-4.7.0
Bump webpack-cli from 4.6.0 to 4.7.0
2021-05-15 19:19:03 +02:00
Eugene
f327cd8250 Merge pull request #3834 from Eugeny/dependabot/npm_and_yarn/terminus-core/electron/remote-1.1.0
Bump @electron/remote from 1.0.4 to 1.1.0 in /terminus-core
2021-05-15 19:18:13 +02:00
Eugene
80247187b2 Merge pull request #3824 from Eugeny/dependabot/npm_and_yarn/sentry/cli-1.64.2
Bump @sentry/cli from 1.63.1 to 1.64.2
2021-05-15 19:17:49 +02:00
Eugene
28ea3a88c2 Merge pull request #3848 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-webgl-0.11.1
Bump xterm-addon-webgl from 0.11.0 to 0.11.1 in /terminus-terminal
2021-05-15 19:17:19 +02:00
Eugene Pankov
c39826bd16 kill ssh session when closing tab - fixes #3207 2021-05-15 19:15:40 +02:00
Eugene Pankov
edb07e155c ppk key support 2021-05-15 18:51:53 +02:00
dependabot[bot]
1193309114 Bump xterm-addon-webgl from 0.11.0 to 0.11.1 in /terminus-terminal
Bumps [xterm-addon-webgl](https://github.com/xtermjs/xterm.js) from 0.11.0 to 0.11.1.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-14 04:10:02 +00:00
dependabot[bot]
57f79e4eb4 Bump sass-loader from 11.0.1 to 11.1.1
Bumps [sass-loader](https://github.com/webpack-contrib/sass-loader) from 11.0.1 to 11.1.1.
- [Release notes](https://github.com/webpack-contrib/sass-loader/releases)
- [Changelog](https://github.com/webpack-contrib/sass-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/sass-loader/compare/v11.0.1...v11.1.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-14 04:02:32 +00:00
dependabot[bot]
4a00c254ff Bump @types/semver from 7.3.4 to 7.3.6 in /terminus-plugin-manager
Bumps [@types/semver](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/semver) from 7.3.4 to 7.3.6.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/semver)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-14 04:00:31 +00:00
Eugene Pankov
c7bee48199 fixed zooming - fixes #3684 2021-05-13 18:36:45 +02:00
dependabot[bot]
07177b2c52 Bump deep-equal from 1.1.0 to 2.0.5 in /terminus-terminal
Bumps [deep-equal](https://github.com/inspect-js/node-deep-equal) from 1.1.0 to 2.0.5.
- [Release notes](https://github.com/inspect-js/node-deep-equal/releases)
- [Changelog](https://github.com/inspect-js/node-deep-equal/blob/master/CHANGELOG.md)
- [Commits](https://github.com/inspect-js/node-deep-equal/compare/v1.1.0...v2.0.5)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-13 16:21:05 +00:00
Eugene Pankov
1326fd7355 only hide on blur when docking is enabled - fixes #3782 2021-05-13 17:40:02 +02:00
Eugene Pankov
ee368a3716 fixed bell 2021-05-13 17:30:48 +02:00
Eugene Pankov
c9367d04c3 added missing dep 2021-05-13 17:30:37 +02:00
Eugene Pankov
2f63a1ebbb fixed layout with tabs on side 2021-05-13 17:06:16 +02:00
Eugene Pankov
c956ee1183 fixed css config field 2021-05-13 17:06:11 +02:00
Eugene Pankov
f76a5505ec style tweak 2021-05-13 17:02:43 +02:00
Eugene Pankov
4aafcf82e8 build fixes 2021-05-13 17:00:29 +02:00
Eugene Pankov
76ffef751c handle squirrel errors in updater 2021-05-13 16:54:27 +02:00
Eugene Pankov
5c22e22caa plugged memory leaks 2021-05-13 16:40:23 +02:00
dependabot[bot]
614936c44f Bump @electron/remote from 1.0.4 to 1.1.0 in /terminus-core
Bumps [@electron/remote](https://github.com/electron/remote) from 1.0.4 to 1.1.0.
- [Release notes](https://github.com/electron/remote/releases)
- [Changelog](https://github.com/electron/remote/blob/master/.releaserc.json)
- [Commits](https://github.com/electron/remote/compare/v1.0.4...v1.1.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-13 04:00:35 +00:00
dependabot[bot]
0285556431 Bump @sentry/electron from 2.4.0 to 2.4.1
Bumps [@sentry/electron](https://github.com/getsentry/sentry-electron) from 2.4.0 to 2.4.1.
- [Release notes](https://github.com/getsentry/sentry-electron/releases)
- [Changelog](https://github.com/getsentry/sentry-electron/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-electron/compare/2.4.0...2.4.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-12 08:38:02 +00:00
dependabot[bot]
7ae92fce27 Bump webpack from 5.31.0 to 5.37.0
Bumps [webpack](https://github.com/webpack/webpack) from 5.31.0 to 5.37.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.31.0...v5.37.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-12 08:37:34 +00:00
dependabot[bot]
f1cbee25be Bump @types/js-yaml from 4.0.0 to 4.0.1
Bumps [@types/js-yaml](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/js-yaml) from 4.0.0 to 4.0.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/js-yaml)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-12 08:35:01 +00:00
dependabot[bot]
cfe956b636 Bump electron from 12.0.6 to 12.0.7
Bumps [electron](https://github.com/electron/electron) from 12.0.6 to 12.0.7.
- [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/v12.0.6...v12.0.7)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-12 08:34:31 +00:00
dependabot[bot]
e79da7aa49 Bump actions/setup-node from 1 to 2.1.5
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 1 to 2.1.5.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v1...v2.1.5)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-12 08:31:08 +00:00
Eugene Pankov
c98fd2042d downgraded electron/remote 2021-05-12 10:29:56 +02:00
Eugene Pankov
ac45f24bf9 fixed docs build 2021-05-12 10:21:41 +02:00
dependabot[bot]
9a0cd27692 Bump webpack-cli from 4.6.0 to 4.7.0
Bumps [webpack-cli](https://github.com/webpack/webpack-cli) from 4.6.0 to 4.7.0.
- [Release notes](https://github.com/webpack/webpack-cli/releases)
- [Changelog](https://github.com/webpack/webpack-cli/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-cli/compare/webpack-cli@4.6.0...webpack-cli@4.7.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-12 07:47:54 +00:00
dependabot[bot]
fd93fbb926 Bump @sentry/cli from 1.63.1 to 1.64.2
Bumps [@sentry/cli](https://github.com/getsentry/sentry-cli) from 1.63.1 to 1.64.2.
- [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.63.1...1.64.2)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-12 07:47:23 +00:00
dependabot[bot]
070709f721 Bump keytar from 7.6.0 to 7.7.0 in /app
Bumps [keytar](https://github.com/atom/node-keytar) from 7.6.0 to 7.7.0.
- [Release notes](https://github.com/atom/node-keytar/releases)
- [Commits](https://github.com/atom/node-keytar/compare/v7.6.0...v7.7.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-12 07:47:21 +00:00
dependabot[bot]
5f6865d876 Bump mixpanel from 0.10.3 to 0.13.0 in /terminus-core
Bumps [mixpanel](https://github.com/mixpanel/mixpanel-node) from 0.10.3 to 0.13.0.
- [Release notes](https://github.com/mixpanel/mixpanel-node/releases)
- [Changelog](https://github.com/mixpanel/mixpanel-node/blob/master/history.md)
- [Commits](https://github.com/mixpanel/mixpanel-node/compare/v0.10.3...v0.13.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-12 07:45:44 +00:00
Eugene
60c85c49cc Merge pull request #3241 from Eugeny/dependabot/npm_and_yarn/terminus-core/readable-stream-3.6.0
Bump readable-stream from 2.3.7 to 3.6.0 in /terminus-core
2021-05-12 09:44:46 +02:00
Eugene
2a1b5d6a30 Merge pull request #3801 from Eugeny/dependabot/npm_and_yarn/sentry/cli-1.64.2
Bump @sentry/cli from 1.63.1 to 1.64.2
2021-05-12 09:44:15 +02:00
Eugene
931335ec31 Merge pull request #3691 from Eugeny/dependabot/npm_and_yarn/types/fs-extra-9.0.11
Bump @types/fs-extra from 9.0.9 to 9.0.11
2021-05-12 09:44:05 +02:00
dependabot[bot]
dea7551a38 Bump node-abi from 2.21.0 to 2.26.0
Bumps [node-abi](https://github.com/lgeiger/node-abi) from 2.21.0 to 2.26.0.
- [Release notes](https://github.com/lgeiger/node-abi/releases)
- [Commits](https://github.com/lgeiger/node-abi/compare/v2.21.0...v2.26.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-12 07:43:53 +00:00
Eugene
f3ddb54499 Merge pull request #3703 from Eugeny/dependabot/npm_and_yarn/app/js-yaml-4.1.0
Bump js-yaml from 4.0.0 to 4.1.0 in /app
2021-05-12 09:43:16 +02:00
dependabot[bot]
42f1b94149 Bump node-sass from 5.0.0 to 6.0.0
Bumps [node-sass](https://github.com/sass/node-sass) from 5.0.0 to 6.0.0.
- [Release notes](https://github.com/sass/node-sass/releases)
- [Changelog](https://github.com/sass/node-sass/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sass/node-sass/compare/v5.0.0...v6.0.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-12 07:42:58 +00:00
Eugene
275f9e5633 Merge pull request #3792 from Eugeny/dependabot/npm_and_yarn/core-js-3.12.1
Bump core-js from 3.9.1 to 3.12.1
2021-05-12 09:42:53 +02:00
Eugene
b988c36bf9 Merge pull request #3791 from Eugeny/dependabot/npm_and_yarn/terminus-core/core-js-3.12.1
Bump core-js from 3.9.1 to 3.12.1 in /terminus-core
2021-05-12 09:42:48 +02:00
Eugene
381ee6f1b2 Merge pull request #3771 from Eugeny/dependabot/npm_and_yarn/types/node-15.0.2
Bump @types/node from 14.14.35 to 15.0.2
2021-05-12 09:41:25 +02:00
Eugene Pankov
a423447532 Merge branch 'master' of github.com:Eugeny/terminus 2021-05-12 09:39:48 +02:00
Eugene Pankov
bb386f7f8a Update electron.service.ts 2021-05-12 09:39:45 +02:00
dependabot[bot]
b37a7c9999 Bump node-abi from 2.21.0 to 2.26.0 in /app
Bumps [node-abi](https://github.com/lgeiger/node-abi) from 2.21.0 to 2.26.0.
- [Release notes](https://github.com/lgeiger/node-abi/releases)
- [Commits](https://github.com/lgeiger/node-abi/compare/v2.21.0...v2.26.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-12 07:38:35 +00:00
Eugene
99a86e7ff5 Merge pull request #3739 from Eugeny/dependabot/npm_and_yarn/terminus-core/types/js-yaml-4.0.1
Bump @types/js-yaml from 4.0.0 to 4.0.1 in /terminus-core
2021-05-12 09:38:04 +02:00
Eugene
2e9d8f609e Merge pull request #3725 from Eugeny/dependabot/npm_and_yarn/terminus-ssh/strip-ansi-7.0.0
Bump strip-ansi from 6.0.0 to 7.0.0 in /terminus-ssh
2021-05-12 09:37:49 +02:00
Eugene
71e6caff0a Merge pull request #3723 from Eugeny/dependabot/npm_and_yarn/app/node-abi-2.26.0
Bump node-abi from 2.21.0 to 2.26.0 in /app
2021-05-12 09:37:19 +02:00
Eugene
235a53018e Merge pull request #3793 from Eugeny/dependabot/npm_and_yarn/eslint-7.26.0
Bump eslint from 7.22.0 to 7.26.0
2021-05-12 09:36:36 +02:00
Eugene
dd22aba099 Merge pull request #3800 from Eugeny/dependabot/npm_and_yarn/typescript-eslint/parser-4.23.0
Bump @typescript-eslint/parser from 4.18.0 to 4.23.0
2021-05-12 09:36:02 +02:00
Eugene
2db700a77f Merge pull request #3712 from Eugeny/dependabot/npm_and_yarn/app/ssri-6.0.2
[Security] Bump ssri from 6.0.1 to 6.0.2 in /app
2021-05-12 09:35:51 +02:00
Eugene Pankov
f5fdf6cf44 Merge branch 'master' of github.com:Eugeny/terminus 2021-05-12 09:35:35 +02:00
Eugene Pankov
8f02239815 Update dependabot.yml 2021-05-12 09:35:33 +02:00
Eugene
e462e207de Merge pull request #3673 from Eugeny/dependabot/npm_and_yarn/node-gyp-8.0.0
Bump node-gyp from 7.1.2 to 8.0.0
2021-05-12 09:33:53 +02:00
Eugene Pankov
24210dee38 Merge branch 'master' of github.com:Eugeny/terminus 2021-05-12 09:32:57 +02:00
Eugene Pankov
87a98288b9 bumped electron 2021-05-12 09:32:53 +02:00
Eugene
be2015a833 Merge pull request #3653 from Eugeny/dependabot/npm_and_yarn/y18n-3.2.2
[Security] Bump y18n from 3.2.1 to 3.2.2
2021-05-12 09:32:46 +02:00
Eugene
75a59769fc Merge pull request #3652 from Eugeny/dependabot/npm_and_yarn/app/y18n-3.2.2
[Security] Bump y18n from 3.2.1 to 3.2.2 in /app
2021-05-12 09:32:42 +02:00
Eugene
c28b474f24 Merge pull request #3625 from Eugeny/dependabot/npm_and_yarn/terminus-plugin-manager/semver-7.3.5
Bump semver from 7.3.4 to 7.3.5 in /terminus-plugin-manager
2021-05-12 09:32:18 +02:00
Eugene
e9ea8b0506 Merge pull request #3650 from Eugeny/dependabot/npm_and_yarn/app/rxjs-6.6.7
Bump rxjs from 6.6.6 to 6.6.7 in /app
2021-05-12 09:32:08 +02:00
Eugene
44367465cc Merge pull request #3688 from Eugeny/dependabot/npm_and_yarn/app/windows-process-tree-0.3.0
Bump windows-process-tree from 0.2.4 to 0.3.0 in /app
2021-05-12 09:31:32 +02:00
Eugene
c017c42b70 Merge pull request #3798 from Eugeny/dependabot/npm_and_yarn/postcss-8.2.15
[Security] Bump postcss from 8.2.8 to 8.2.15
2021-05-12 09:30:25 +02:00
Eugene
26117dfce0 Merge pull request #3785 from Eugeny/dependabot/npm_and_yarn/app/hosted-git-info-2.8.9
[Security] Bump hosted-git-info from 2.8.8 to 2.8.9 in /app
2021-05-12 09:30:19 +02:00
Eugene
ae809e9ee2 Merge pull request #3774 from Eugeny/dependabot/npm_and_yarn/terminus-core/ngx-perfect-scrollbar-10.1.1
Bump ngx-perfect-scrollbar from 10.1.0 to 10.1.1 in /terminus-core
2021-05-12 09:30:11 +02:00
Eugene
58516718d6 Merge pull request #3735 from Eugeny/dependabot/npm_and_yarn/typedoc-0.20.36
Bump typedoc from 0.20.32 to 0.20.36
2021-05-12 09:29:47 +02:00
dependabot-preview[bot]
9dac5cdf9d Bump js-yaml from 4.0.0 to 4.1.0 in /app
Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.0.0 to 4.1.0.
- [Release notes](https://github.com/nodeca/js-yaml/releases)
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/4.0.0...4.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-05-12 07:28:10 +00:00
dependabot-preview[bot]
dbc291ff8c Bump @types/js-yaml from 4.0.0 to 4.0.1 in /terminus-core
Bumps [@types/js-yaml](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/js-yaml) from 4.0.0 to 4.0.1.
- [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>
2021-05-12 07:28:08 +00:00
dependabot-preview[bot]
dc5f7991b8 Bump semver from 7.3.4 to 7.3.5 in /terminus-plugin-manager
Bumps [semver](https://github.com/npm/node-semver) from 7.3.4 to 7.3.5.
- [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.3.4...v7.3.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-05-12 07:27:56 +00:00
Eugene
df2e60150c Merge pull request #3757 from Eugeny/dependabot/add-v2-config-file
Upgrade to GitHub-native Dependabot
2021-05-12 09:27:53 +02:00
Eugene
516572f9d9 Merge pull request #3659 from Eugeny/dependabot/npm_and_yarn/terminus-core/electron/remote-1.1.0
Bump @electron/remote from 1.0.4 to 1.1.0 in /terminus-core
2021-05-12 09:27:12 +02:00
Eugene
b3cca4f789 Merge pull request #3803 from Eugeny/dependabot/npm_and_yarn/terminus-core/electron-updater-4.3.9
Bump electron-updater from 4.3.8 to 4.3.9 in /terminus-core
2021-05-12 09:26:41 +02:00
Eugene
e59ebb76ac Merge pull request #3658 from Eugeny/dependabot/npm_and_yarn/app/electron/remote-1.1.0
Bump @electron/remote from 1.0.4 to 1.1.0 in /app
2021-05-12 09:26:17 +02:00
Eugene
0476ef35bb Merge pull request #3807 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-ligatures-0.5.0
Bump xterm-addon-ligatures from 0.4.0 to 0.5.0 in /terminus-terminal
2021-05-12 09:16:22 +02:00
Eugene
8b3139719a Merge pull request #3806 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-addon-webgl-0.11.0
Bump xterm-addon-webgl from 0.10.0 to 0.11.0 in /terminus-terminal
2021-05-12 09:16:16 +02:00
dependabot-preview[bot]
66ebc0dd71 Bump xterm-addon-webgl from 0.10.0 to 0.11.0 in /terminus-terminal
Bumps [xterm-addon-webgl](https://github.com/xtermjs/xterm.js) from 0.10.0 to 0.11.0.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/compare/0.10...0.11)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-05-12 07:15:22 +00:00
Eugene
11328d5880 Merge pull request #3804 from Eugeny/dependabot/npm_and_yarn/terminus-terminal/xterm-4.12.0
Bump xterm from 4.11.0 to 4.12.0 in /terminus-terminal
2021-05-12 09:13:23 +02:00
Eugene Pankov
af2fd17c34 Merge branch 'master' of github.com:Eugeny/terminus 2021-05-12 09:12:10 +02:00
Eugene Pankov
d21d019b5c install bsdtar in linux workflow 2021-05-12 09:12:07 +02:00
dependabot-preview[bot]
f4a825f67b Bump xterm-addon-ligatures from 0.4.0 to 0.5.0 in /terminus-terminal
Bumps [xterm-addon-ligatures](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>
2021-05-12 04:17:53 +00:00
dependabot-preview[bot]
4ce916241a Bump xterm from 4.11.0 to 4.12.0 in /terminus-terminal
Bumps [xterm](https://github.com/xtermjs/xterm.js) from 4.11.0 to 4.12.0.
- [Release notes](https://github.com/xtermjs/xterm.js/releases)
- [Commits](https://github.com/xtermjs/xterm.js/compare/4.11.0...4.12.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-05-12 04:16:36 +00:00
dependabot-preview[bot]
4780a6b913 Bump electron-updater from 4.3.8 to 4.3.9 in /terminus-core
Bumps [electron-updater](https://github.com/electron-userland/electron-builder) from 4.3.8 to 4.3.9.
- [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>
2021-05-12 04:16:32 +00:00
dependabot-preview[bot]
58710cfdbe Bump @sentry/cli from 1.63.1 to 1.64.2
Bumps [@sentry/cli](https://github.com/getsentry/sentry-cli) from 1.63.1 to 1.64.2.
- [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.63.1...1.64.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-05-11 04:32:05 +00:00
dependabot-preview[bot]
8a6b3a6fbb Bump @typescript-eslint/parser from 4.18.0 to 4.23.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 4.18.0 to 4.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/v4.23.0/packages/parser)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-05-11 04:27:43 +00:00
dependabot-preview[bot]
40897c278b [Security] Bump postcss from 8.2.8 to 8.2.15
Bumps [postcss](https://github.com/postcss/postcss) from 8.2.8 to 8.2.15. **This update includes a security fix.**
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.2.8...8.2.15)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-05-11 04:25:17 +00:00
dependabot-preview[bot]
d54dbc3c50 Bump eslint from 7.22.0 to 7.26.0
Bumps [eslint](https://github.com/eslint/eslint) from 7.22.0 to 7.26.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v7.22.0...v7.26.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-05-10 04:34:59 +00:00
dependabot-preview[bot]
789ca2c635 Bump core-js from 3.9.1 to 3.12.1
Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.9.1 to 3.12.1.
- [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/commits/v3.12.1/packages/core-js)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-05-10 04:34:03 +00:00
dependabot-preview[bot]
eacc30bc82 Bump core-js from 3.9.1 to 3.12.1 in /terminus-core
Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.9.1 to 3.12.1.
- [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/commits/v3.12.1/packages/core-js)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-05-10 04:31:06 +00:00
dependabot-preview[bot]
dc7fc30d27 [Security] Bump hosted-git-info from 2.8.8 to 2.8.9 in /app
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9. **This update includes a security fix.**
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-05-07 18:00:47 +00:00
dependabot-preview[bot]
6de6fd8f40 Bump ngx-perfect-scrollbar from 10.1.0 to 10.1.1 in /terminus-core
Bumps [ngx-perfect-scrollbar](https://github.com/zefoy/ngx-perfect-scrollbar) from 10.1.0 to 10.1.1.
- [Release notes](https://github.com/zefoy/ngx-perfect-scrollbar/releases)
- [Commits](https://github.com/zefoy/ngx-perfect-scrollbar/compare/v10.1.0...v10.1.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-05-06 04:18:04 +00:00
dependabot-preview[bot]
fb9fb57a18 Bump @types/node from 14.14.35 to 15.0.2
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 14.14.35 to 15.0.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-05-05 04:20:09 +00:00
Eugene Pankov
e434fe5a8a linux: fixed window-app association - fixes #3720 2021-05-02 20:19:52 +02:00
Eugene Pankov
1b1127ab28 added pacman builds - fixes #3761 2021-05-02 20:02:46 +02:00
Eugene Pankov
fe8dd891b4 fixed one-off sessions not auto closing 2021-05-02 19:22:45 +02:00
dependabot-preview[bot]
e2d467046b Upgrade to GitHub-native Dependabot 2021-04-29 15:09:52 +00:00
dependabot-preview[bot]
642293dbdb Bump typedoc from 0.20.32 to 0.20.36
Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.20.32 to 0.20.36.
- [Release notes](https://github.com/TypeStrong/TypeDoc/releases)
- [Commits](https://github.com/TypeStrong/TypeDoc/compare/v0.20.32...v0.20.36)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-23 04:20:53 +00:00
dependabot-preview[bot]
99e3144ddf Bump strip-ansi from 6.0.0 to 7.0.0 in /terminus-ssh
Bumps [strip-ansi](https://github.com/chalk/strip-ansi) from 6.0.0 to 7.0.0.
- [Release notes](https://github.com/chalk/strip-ansi/releases)
- [Commits](https://github.com/chalk/strip-ansi/compare/v6.0.0...v7.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-22 16:29:17 +00:00
dependabot-preview[bot]
c38b684b56 Bump node-abi from 2.21.0 to 2.26.0 in /app
Bumps [node-abi](https://github.com/lgeiger/node-abi) from 2.21.0 to 2.26.0.
- [Release notes](https://github.com/lgeiger/node-abi/releases)
- [Commits](https://github.com/lgeiger/node-abi/compare/v2.21.0...v2.26.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-22 16:13:26 +00:00
dependabot-preview[bot]
f8871cb1c5 [Security] Bump ssri from 6.0.1 to 6.0.2 in /app
Bumps [ssri](https://github.com/npm/ssri) from 6.0.1 to 6.0.2. **This update includes a security fix.**
- [Release notes](https://github.com/npm/ssri/releases)
- [Changelog](https://github.com/npm/ssri/blob/v6.0.2/CHANGELOG.md)
- [Commits](https://github.com/npm/ssri/compare/v6.0.1...v6.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-16 21:52:56 +00:00
dependabot-preview[bot]
a647b394e5 Bump node-gyp from 7.1.2 to 8.0.0
Bumps [node-gyp](https://github.com/nodejs/node-gyp) from 7.1.2 to 8.0.0.
- [Release notes](https://github.com/nodejs/node-gyp/releases)
- [Changelog](https://github.com/nodejs/node-gyp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodejs/node-gyp/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-16 18:25:29 +00:00
dependabot-preview[bot]
4ec4620cd5 Bump rxjs from 6.6.6 to 6.6.7 in /app
Bumps [rxjs](https://github.com/reactivex/rxjs) from 6.6.6 to 6.6.7.
- [Release notes](https://github.com/reactivex/rxjs/releases)
- [Changelog](https://github.com/ReactiveX/rxjs/blob/6.6.7/CHANGELOG.md)
- [Commits](https://github.com/reactivex/rxjs/compare/6.6.6...6.6.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-16 18:24:10 +00:00
dependabot-preview[bot]
682b336784 Bump @types/fs-extra from 9.0.9 to 9.0.11
Bumps [@types/fs-extra](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/fs-extra) from 9.0.9 to 9.0.11.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/fs-extra)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-13 04:25:52 +00:00
dependabot-preview[bot]
0687e31d21 Bump windows-process-tree from 0.2.4 to 0.3.0 in /app
Bumps [windows-process-tree](https://github.com/Microsoft/vscode-windows-process-tree) from 0.2.4 to 0.3.0.
- [Release notes](https://github.com/Microsoft/vscode-windows-process-tree/releases)
- [Commits](https://github.com/Microsoft/vscode-windows-process-tree/commits/v0.3.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-12 04:26:09 +00:00
dependabot-preview[bot]
2e7de08649 Bump @electron/remote from 1.0.4 to 1.1.0 in /app
Bumps [@electron/remote](https://github.com/electron/remote) from 1.0.4 to 1.1.0.
- [Release notes](https://github.com/electron/remote/releases)
- [Changelog](https://github.com/electron/remote/blob/master/.releaserc.json)
- [Commits](https://github.com/electron/remote/compare/v1.0.4...v1.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-08 20:28:43 +00:00
dependabot-preview[bot]
88f4c7e835 Bump @electron/remote from 1.0.4 to 1.1.0 in /terminus-core
Bumps [@electron/remote](https://github.com/electron/remote) from 1.0.4 to 1.1.0.
- [Release notes](https://github.com/electron/remote/releases)
- [Changelog](https://github.com/electron/remote/blob/master/.releaserc.json)
- [Commits](https://github.com/electron/remote/compare/v1.0.4...v1.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-08 20:28:25 +00:00
dependabot-preview[bot]
de3218522e [Security] Bump y18n from 3.2.1 to 3.2.2
Bumps [y18n](https://github.com/yargs/y18n) from 3.2.1 to 3.2.2. **This update includes a security fix.**
- [Release notes](https://github.com/yargs/y18n/releases)
- [Changelog](https://github.com/yargs/y18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/yargs/y18n/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-08 20:28:20 +00:00
dependabot-preview[bot]
f7ed97b8a4 [Security] Bump y18n from 3.2.1 to 3.2.2 in /app
Bumps [y18n](https://github.com/yargs/y18n) from 3.2.1 to 3.2.2. **This update includes a security fix.**
- [Release notes](https://github.com/yargs/y18n/releases)
- [Changelog](https://github.com/yargs/y18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/yargs/y18n/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-08 20:28:18 +00:00
dependabot-preview[bot]
67190e9622 Bump readable-stream from 2.3.7 to 3.6.0 in /terminus-core
Bumps [readable-stream](https://github.com/nodejs/readable-stream) from 2.3.7 to 3.6.0.
- [Release notes](https://github.com/nodejs/readable-stream/releases)
- [Commits](https://github.com/nodejs/readable-stream/compare/v2.3.7...v3.6.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-10 19:55:59 +00:00
297 changed files with 15148 additions and 8523 deletions

View File

@@ -379,6 +379,15 @@
"contributions": [
"plugin"
]
},
{
"login": "lambdalisue",
"name": "Alisue",
"avatar_url": "https://avatars.githubusercontent.com/u/546312?v=4",
"profile": "http://hashnote.net/",
"contributions": [
"design"
]
}
],
"contributorsPerLine": 7,

View File

@@ -65,9 +65,6 @@ rules:
eqeqeq:
- error
- smart
linebreak-style:
- error
- unix
max-depth:
- 1
- 5
@@ -117,3 +114,5 @@ rules:
'@typescript-eslint/no-implicit-any-catch': off
'@typescript-eslint/member-ordering': off
'@typescript-eslint/no-var-requires': off
'@typescript-eslint/no-unsafe-argument': off
'@typescript-eslint/restrict-plus-operands': off

74
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,74 @@
version: 2
updates:
- package-ecosystem: npm
directory: "/"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/app"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/terminus-core"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/terminus-settings"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/terminus-terminal"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/terminus-local"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/terminus-community-color-schemes"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/terminus-electron"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/terminus-web"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/terminus-plugin-manager"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: npm
directory: "/terminus-ssh"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20
- package-ecosystem: github-actions
directory: "/"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 20

View File

@@ -3,15 +3,18 @@ on: push
jobs:
build:
runs-on: ubuntu-18.04
if: ${{ github.actor != 'dependabot[bot]' }}
steps:
- name: Checkout
uses: actions/checkout@v1
uses: actions/checkout@v2.3.4
with:
fetch-depth: 0
- name: Installing Node
uses: actions/setup-node@v1
uses: actions/setup-node@v2.1.5
with:
node-version: 10
node-version: 14
- name: Build
run: |

View File

@@ -6,12 +6,14 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v1
uses: actions/checkout@v2.3.4
with:
fetch-depth: 0
- name: Installing Node
uses: actions/setup-node@v1
uses: actions/setup-node@v2.1.5
with:
node-version: 15
node-version: 14
- name: Install deps
run: |

View File

@@ -2,29 +2,30 @@ name: Linux Build
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-16.04
runs-on: ubuntu-18.04
steps:
- name: Checkout
uses: actions/checkout@v1
uses: actions/checkout@v2.3.4
with:
fetch-depth: 0
- name: Install Node
uses: actions/setup-node@v1
uses: actions/setup-node@v2.1.5
with:
node-version: 15
node-version: 14
- name: Install deps
run: |
sudo apt-get update
sudo apt-get install bsdtar zsh
npm i -g yarn@1.19.1
cd app
yarn
cd ..
rm app/node_modules/.yarn-integrity
yarn
./node_modules/.bin/patch-package
cd app
../node_modules/.bin/patch-package
cd ..
npm run patch
- name: Build native deps
run: scripts/build-native.js
@@ -38,9 +39,12 @@ jobs:
- name: Build packages
run: scripts/build-linux.js
env:
DEBUG: electron-builder,electron-builder:*
GH_TOKEN: ${{ secrets.GH_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
USE_HARD_LINKS: false
# DEBUG: electron-builder,electron-builder:*
- name: Build web resources
run: zsh -c 'tar czf terminus-web.tar.gz (terminus-*|web)/dist'
- name: Upload symbols
run: |
@@ -57,31 +61,47 @@ jobs:
mv dist/*.deb artifact-deb/ || true
mkdir artifact-rpm
mv dist/*.rpm artifact-rpm/ || true
mkdir artifact-pacman
mv dist/*.pacman artifact-pacman/ || true
mkdir artifact-snap
mv dist/*.snap artifact-snap/ || true
mkdir artifact-tar.gz
mv dist/*.tar.gz artifact-tar.gz/ || true
mkdir artifact-web
mv terminus-web.tar.gz artifact-web/ || true
- uses: actions/upload-artifact@master
name: Upload DEB
with:
name: Linux .deb
name: Linux DEB
path: artifact-deb
- uses: actions/upload-artifact@master
name: Upload RPM
with:
name: Linux .rpm
name: Linux RPM
path: artifact-rpm
- uses: actions/upload-artifact@master
name: Upload Pacman Package
with:
name: Linux Pacman
path: artifact-pacman
- uses: actions/upload-artifact@master
name: Upload Snap
with:
name: Linux .snap
name: Linux Snap
path: artifact-snap
- uses: actions/upload-artifact@master
name: Upload tarball
name: Upload Linux tarball
with:
name: Linux tarball
path: artifact-tar.gz
- uses: actions/upload-artifact@master
name: Upload web tarball
with:
name: Web tarball
path: artifact-web

View File

@@ -11,12 +11,14 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v1
uses: actions/checkout@v2.3.4
with:
fetch-depth: 0
- name: Installing Node
uses: actions/setup-node@v1
uses: actions/setup-node@v2.1.5
with:
node-version: 15
node-version: 14
- name: Install deps
run: |
@@ -26,10 +28,6 @@ jobs:
cd ..
rm app/node_modules/.yarn-integrity
yarn
./node_modules/.bin/patch-package
cd app
../node_modules/.bin/patch-package
cd ..
- name: Build native deps
run: scripts/build-native.js
@@ -51,7 +49,7 @@ jobs:
if: github.repository == 'Eugeny/terminus' && github.event_name == 'push'
env:
ARCH: ${{matrix.arch}}
GH_TOKEN: ${{ secrets.GH_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
APPSTORE_USERNAME: ${{ secrets.APPSTORE_USERNAME }}

View File

@@ -6,10 +6,12 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v1
uses: actions/checkout@v2.3.4
with:
fetch-depth: 0
- name: Installing Node
uses: actions/setup-node@v1
uses: actions/setup-node@v2.1.5
with:
node-version: 14
@@ -26,9 +28,10 @@ jobs:
run: node scripts/build-windows.js
if: github.repository == 'Eugeny/terminus' && github.event_name == 'push'
env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }}
WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}
# DEBUG: electron-builder,electron-builder:*
- name: Build packages without signing
run: node scripts/build-windows.js

View File

@@ -42,9 +42,12 @@ terminus
├─ scripts # Maintenance scripts
├─ terminus-community-color-schemes # Plugin that provides color schemes
├─ terminus-core # Plugin that provides base UI and tab management
├─ terminus-electron # Plugin that provides Electron-specific functions
└─ terminus-local # Plugin that provides local shells and profiles
├─ terminus-plugin-manager # Plugin that installs other plugins
├─ terminus-settings # Plugin that provides the settings tab
└─ terminus-terminal # Plugin that provides terminal tabs
├─ terminus-web # Plugin that provides web-specific functions
```
# Plugin layout
@@ -115,6 +118,6 @@ export default class MyModule { }
```
See `terminus-core/src/api.ts`, `terminus-settings/src/api.ts` and `terminus-terminal/src/api.ts` for the available extension points.
See `terminus-core/src/api.ts`, `terminus-settings/src/api.ts`, `terminus-local/src/api.ts` and `terminus-terminal/src/api.ts` for the available extension points.
Publish your plugin on NPM with a `terminus-plugin` keyword to make it appear in the Plugin Manager.

View File

@@ -20,7 +20,7 @@
* Full Unicode support including double-width characters
* Doesn't choke on fast-flowing outputs
* Proper shell experience on Windows including tab completion (via Clink)
* Integrated encrypted container for SSH secrets and configuration
[![Buy me a coffee](https://github.com/Eugeny/terminus/raw/master/docs/kofi.png)](https://ko-fi.com/eugeny)
@@ -175,6 +175,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<td align="center"><a href="https://github.com/clarkwang"><img src="https://avatars.githubusercontent.com/u/157076?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Clark Wang</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=clarkwang" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/iamchating"><img src="https://avatars.githubusercontent.com/u/7088153?v=4?s=100" width="100px;" alt=""/><br /><sub><b>iamchating</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=iamchating" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/starxg"><img src="https://avatars.githubusercontent.com/u/34997494?v=4?s=100" width="100px;" alt=""/><br /><sub><b>starxg</b></sub></a><br /><a href="#plugin-starxg" title="Plugin/utility libraries">🔌</a></td>
<td align="center"><a href="http://hashnote.net/"><img src="https://avatars.githubusercontent.com/u/546312?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alisue</b></sub></a><br /><a href="#design-lambdalisue" title="Design">🎨</a></td>
</tr>
</table>

View File

@@ -1,5 +1,5 @@
doctype html
html
html.terminus
head
meta(charset='UTF-8')
base(href='index.html')

View File

@@ -1,19 +1,29 @@
import { app, ipcMain, Menu, Tray, shell, screen, globalShortcut, MenuItemConstructorOptions } from 'electron'
import * as promiseIpc from 'electron-promise-ipc'
import * as remote from '@electron/remote/main'
import * as path from 'path'
import * as fs from 'fs'
import { loadConfig } from './config'
import { Window, WindowOptions } from './window'
import { pluginManager } from './pluginManager'
import { PTYManager } from './pty'
/* eslint-disable block-scoped-var */
try {
var wnr = require('windows-native-registry') // eslint-disable-line @typescript-eslint/no-var-requires, no-var
} catch (_) { }
export class Application {
private tray?: Tray
private ptyManager = new PTYManager()
private windows: Window[] = []
userPluginsPath: string
constructor () {
remote.initialize()
this.useBuiltinGraphics()
this.ptyManager.init(this)
ipcMain.on('app:config-change', (_event, config) => {
@@ -29,12 +39,12 @@ export class Application {
}
})
;(promiseIpc as any).on('plugin-manager:install', (path, name, version) => {
return pluginManager.install(path, name, version)
;(promiseIpc as any).on('plugin-manager:install', (name, version) => {
return pluginManager.install(this.userPluginsPath, name, version)
})
;(promiseIpc as any).on('plugin-manager:uninstall', (path, name) => {
return pluginManager.uninstall(path, name)
;(promiseIpc as any).on('plugin-manager:uninstall', (name) => {
return pluginManager.uninstall(this.userPluginsPath, name)
})
const configData = loadConfig()
@@ -46,6 +56,15 @@ export class Application {
}
}
this.userPluginsPath = path.join(
app.getPath('userData'),
'plugins',
)
if (!fs.existsSync(this.userPluginsPath)) {
fs.mkdirSync(this.userPluginsPath)
}
app.commandLine.appendSwitch('disable-http-cache')
app.commandLine.appendSwitch('max-active-webgl-contexts', '9000')
app.commandLine.appendSwitch('lang', 'EN')
@@ -63,7 +82,7 @@ export class Application {
}
async newWindow (options?: WindowOptions): Promise<Window> {
const window = new Window(options)
const window = new Window(this, options)
this.windows.push(window)
window.visible$.subscribe(visible => {
if (visible) {
@@ -161,6 +180,16 @@ export class Application {
this.windows[this.windows.length - 1].passCliArguments(argv, cwd, true)
}
private useBuiltinGraphics (): void {
if (process.platform === 'win32') {
const keyPath = 'SOFTWARE\\Microsoft\\DirectX\\UserGpuPreferences'
const valueName = app.getPath('exe')
if (!wnr.getRegistryValue(wnr.HK.CU, keyPath, valueName)) {
wnr.setRegistryValue(wnr.HK.CU, keyPath, valueName, wnr.REG.SZ, 'GpuPreference=1;')
}
}
}
private setupMenu () {
const template: MenuItemConstructorOptions[] = [
{
@@ -212,13 +241,8 @@ export class Application {
label: 'View',
submenu: [
{ role: 'reload' },
{ role: 'forceReload' },
{ role: 'toggleDevTools' },
{ type: 'separator' },
{ role: 'resetZoom' },
{ role: 'zoomIn' },
{ role: 'zoomOut' },
{ type: 'separator' },
{ role: 'togglefullscreen' },
],
},

View File

@@ -1,57 +0,0 @@
/** @hidden */
module.exports = function patchPTYModule (mod) {
const oldSpawn = mod.spawn
if (mod.patched) {
return
}
mod.patched = true
mod.spawn = (file, args, opt) => {
let terminal = oldSpawn(file, args, opt)
let timeout = null
let buffer = Buffer.from('')
let lastFlush = 0
let nextTimeout = 0
// Minimum prebuffering window (ms) if the input is non-stop flowing
const minWindow = 5
// Maximum buffering time (ms) until output must be flushed unconditionally
const maxWindow = 100
function flush () {
if (buffer.length) {
terminal.emit('data-buffered', buffer)
}
lastFlush = Date.now()
buffer = Buffer.from('')
}
function reschedule () {
if (timeout) {
clearTimeout(timeout)
}
nextTimeout = Date.now() + minWindow
timeout = setTimeout(() => {
timeout = null
flush()
}, minWindow)
}
terminal.on('data', data => {
if (typeof data === 'string') {
data = Buffer.from(data)
}
buffer = Buffer.concat([buffer, data])
if (Date.now() - lastFlush > maxWindow) {
// Taking too much time buffering, flush to keep things interactive
flush()
} else {
if (Date.now() > nextTimeout - maxWindow / 10) {
// Extend the window if it's expiring
reschedule()
}
}
})
return terminal
}
}

View File

@@ -10,12 +10,18 @@ export function parseArgs (argv: string[], cwd: string): any {
.command('open [directory]', 'open a shell in a directory', {
directory: { type: 'string', 'default': cwd },
})
.command('run [command...]', 'run a command in the terminal', {
.command(['run [command...]', '/k'], 'run a command in the terminal', {
command: { type: 'string' },
})
.command('profile [profileName]', 'open a tab with specified profile', {
profileName: { type: 'string' },
})
.command('connect-ssh [connectionName]', 'open a tab for a saved SSH connection', {
connectionName: { type: 'string' },
})
.command('connect-serial [connectionName]', 'open a tab for a saved serial connection', {
connectionName: { type: 'string' },
})
.command('paste [text]', 'paste stdin into the active tab', yargs => {
return yargs.option('escape', {
alias: 'e',

View File

@@ -1,4 +1,5 @@
import * as nodePTY from '@terminus-term/node-pty'
import { StringDecoder } from './stringDecoder'
import { v4 as uuidv4 } from 'uuid'
import { ipcMain } from 'electron'
import { Application } from './app'
@@ -9,6 +10,7 @@ class PTYDataQueue {
private maxChunk = 1024
private maxDelta = 1024 * 50
private flowPaused = false
private decoder = new StringDecoder()
constructor (private pty: nodePTY.IPty, private onData: (data: Buffer) => void) { }
@@ -49,7 +51,7 @@ class PTYDataQueue {
this.buffers.unshift(toSend.slice(this.maxChunk))
toSend = toSend.slice(0, this.maxChunk)
}
this.onData(toSend)
this.emitData(toSend)
this.delta += toSend.length
if (this.buffers.length) {
@@ -58,6 +60,10 @@ class PTYDataQueue {
}
}
private emitData (data: Buffer) {
this.onData(this.decoder.write(data))
}
private pause () {
this.pty.pause()
this.flowPaused = true
@@ -81,7 +87,7 @@ export class PTY {
}
this.outputQueue = new PTYDataQueue(this.pty, data => {
setImmediate(() => this.emit('data-buffered', data))
setImmediate(() => this.emit('data', data))
})
this.pty.on('data', data => this.outputQueue.push(Buffer.from(data)))
@@ -99,7 +105,7 @@ export class PTY {
write (buffer: Buffer): void {
if ((this.pty as any)._writable) {
this.pty.write(buffer.toString())
this.pty.write(buffer as any)
}
}
@@ -120,7 +126,6 @@ export class PTYManager {
private ptys: Record<string, PTY|undefined> = {}
init (app: Application): void {
//require('./bufferizedPTY')(nodePTY) // eslint-disable-line @typescript-eslint/no-var-requires
ipcMain.on('pty:spawn', (event, ...options) => {
const id = uuidv4().toString()
event.returnValue = id

105
app/lib/stringDecoder.ts Normal file
View File

@@ -0,0 +1,105 @@
// based on Joyent's StringDecoder
// https://github.com/nodejs/string_decoder/blob/master/lib/string_decoder.js
export class StringDecoder {
lastNeed: number
lastTotal: number
lastChar: Buffer
constructor () {
this.lastNeed = 0
this.lastTotal = 0
this.lastChar = Buffer.allocUnsafe(4)
}
write (buf: Buffer): Buffer {
if (buf.length === 0) {
return buf
}
let r: Buffer|undefined = undefined
let i = 0
if (this.lastNeed) {
r = this.fillLast(buf)
if (r === undefined) {
return Buffer.from('')
}
i = this.lastNeed
this.lastNeed = 0
}
if (i < buf.length) {
return r ? Buffer.concat([r, this.text(buf, i)]) : this.text(buf, i)
}
return r
}
// For UTF-8, a replacement character is added when ending on a partial
// character.
end (buf?: Buffer): Buffer {
const r = buf?.length ? this.write(buf) : Buffer.from('')
if (this.lastNeed) {
console.log('end', r)
return Buffer.concat([r, Buffer.from('\ufffd')])
}
return r
}
// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
// partial character, the character's bytes are buffered until the required
// number of bytes are available.
private text (buf: Buffer, i: number) {
const total = this.utf8CheckIncomplete(buf, i)
if (!this.lastNeed) {
return buf.slice(i)
}
this.lastTotal = total
const end = buf.length - (total - this.lastNeed)
buf.copy(this.lastChar, 0, end)
return buf.slice(i, end)
}
// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
private fillLast (buf: Buffer): Buffer|undefined {
if (this.lastNeed <= buf.length) {
buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed)
return this.lastChar.slice(0, this.lastTotal)
}
buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length)
this.lastNeed -= buf.length
return undefined
}
// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
// continuation byte. If an invalid byte is detected, -2 is returned.
private utf8CheckByte (byte) {
if (byte <= 0x7F) {return 0} else if (byte >> 5 === 0x06) {return 2} else if (byte >> 4 === 0x0E) {return 3} else if (byte >> 3 === 0x1E) {return 4}
return byte >> 6 === 0x02 ? -1 : -2
}
// Checks at most 3 bytes at the end of a Buffer in order to detect an
// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
// needed to complete the UTF-8 character (if applicable) are returned.
private utf8CheckIncomplete (buf, i) {
let j = buf.length - 1
if (j < i) {return 0}
let nb = this.utf8CheckByte(buf[j])
if (nb >= 0) {
if (nb > 0) {this.lastNeed = nb - 1}
return nb
}
if (--j < i || nb === -2) {return 0}
nb = this.utf8CheckByte(buf[j])
if (nb >= 0) {
if (nb > 0) {this.lastNeed = nb - 2}
return nb
}
if (--j < i || nb === -2) {return 0}
nb = this.utf8CheckByte(buf[j])
if (nb >= 0) {
if (nb > 0) {
if (nb === 2) {nb = 0} else {this.lastNeed = nb - 3}
}
return nb
}
return 0
}
}

View File

@@ -9,6 +9,7 @@ import * as path from 'path'
import macOSRelease from 'macos-release'
import * as compareVersions from 'compare-versions'
import type { Application } from './app'
import { parseArgs } from './cli'
import { loadConfig } from './config'
@@ -43,7 +44,7 @@ export class Window {
get visible$ (): Observable<boolean> { return this.visible }
get closed$ (): Observable<void> { return this.closed }
constructor (options?: WindowOptions) {
constructor (private application: Application, options?: WindowOptions) {
this.configStore = loadConfig()
options = options ?? {}
@@ -117,12 +118,15 @@ export class Window {
})
this.window.on('blur', () => {
if (this.configStore.appearance?.dockHideOnBlur) {
if (this.configStore.appearance.dock !== 'off' && this.configStore.appearance?.dockHideOnBlur) {
this.hide()
}
})
this.window.loadURL(`file://${app.getAppPath()}/dist/index.html?${this.window.id}`, { extraHeaders: 'pragma: no-cache\n' })
this.window.loadURL(`file://${app.getAppPath()}/dist/index.html`, { extraHeaders: 'pragma: no-cache\n' })
this.window.webContents.setVisualZoomLevelLimits(1, 1)
this.window.webContents.setZoomFactor(1)
if (process.platform !== 'darwin') {
this.window.setMenu(null)
@@ -287,25 +291,17 @@ export class Window {
this.send('host:window-focused')
})
ipcMain.on('window-focus', event => {
ipcMain.on('ready', event => {
if (!this.window || event.sender !== this.window.webContents) {
return
}
this.window.focus()
})
ipcMain.on('window-maximize', event => {
if (!this.window || event.sender !== this.window.webContents) {
return
}
this.window.maximize()
})
ipcMain.on('window-unmaximize', event => {
if (!this.window || event.sender !== this.window.webContents) {
return
}
this.window.unmaximize()
this.window.webContents.send('start', {
config: this.configStore,
executable: app.getPath('exe'),
windowID: this.window.id,
isFirstWindow: this.window.id === 1,
userPluginsPath: this.application.userPluginsPath,
})
})
ipcMain.on('window-toggle-maximize', event => {

View File

@@ -14,49 +14,52 @@
"watch": "webpack --progress --color --watch"
},
"dependencies": {
"@angular/animations": "^11.1.1",
"@angular/common": "^11.1.1",
"@angular/compiler": "^11.1.1",
"@angular/core": "^11.1.1",
"@angular/forms": "^11.1.1",
"@angular/platform-browser": "^11.1.1",
"@angular/platform-browser-dynamic": "^11.1.1",
"@electron/remote": "^1.0.4",
"@ng-bootstrap/ng-bootstrap": "^7.0.0",
"@angular/animations": "^12.0.0",
"@angular/common": "^12.0.0",
"@angular/compiler": "^12.0.0",
"@angular/core": "^12.0.0",
"@angular/forms": "^12.0.0",
"@angular/platform-browser": "^12.0.0",
"@angular/platform-browser-dynamic": "^12.0.0",
"@electron/remote": "1.0.4",
"@ng-bootstrap/ng-bootstrap": "^9.1.1",
"@terminus-term/node-pty": "0.10.0-terminus.3",
"any-promise": "^1.3.0",
"electron-config": "2.0.0",
"electron-debug": "^3.2.0",
"electron-promise-ipc": "^2.2.4",
"fontmanager-redux": "1.0.0",
"glasstron": "0.0.7",
"js-yaml": "4.0.0",
"keytar": "^7.6.0",
"js-yaml": "4.1.0",
"keytar": "^7.7.0",
"mz": "^2.7.0",
"native-process-working-directory": "^1.0.2",
"ngx-toastr": "^13.2.1",
"@terminus-term/node-pty": "0.10.0-terminus.3",
"ngx-toastr": "^14.0.0",
"npm": "6",
"path": "0.12.7",
"rxjs": "^6.6.6",
"yargs": "^16.2.0",
"rxjs": "^7.1.0",
"ssh2": "^1.1.0",
"yargs": "^17.0.1",
"zone.js": "^0.11.4"
},
"optionalDependencies": {
"macos-native-processlist": "^2.0.0",
"serialport": "^9.0.7",
"serialport": "^9.1.0",
"windows-blurbehind": "^1.0.1",
"windows-native-registry": "^3.0.0",
"windows-process-tree": "^0.2.4"
"windows-process-tree": "^0.3.0"
},
"devDependencies": {
"@types/mz": "2.7.3",
"@types/node": "14.14.35",
"node-abi": "^2.21.0",
"@types/node": "15.12.1",
"ngx-filesize": "^2.0.16",
"node-abi": "^2.30.0",
"source-map-support": "^0.5.19"
},
"peerDependencies": {
"terminus-community-color-schemes": "*",
"terminus-core": "*",
"terminus-electron": "*",
"terminus-local": "*",
"terminus-plugin-manager": "*",
"terminus-serial": "*",
"terminus-settings": "*",

View File

@@ -16,6 +16,7 @@ export function getRootModule (plugins: any[]) {
extendedTimeOut: 1000,
}),
]
const bootstrap = [
...plugins.filter(x => x.bootstrap).map(x => x.bootstrap),
]

View File

@@ -8,9 +8,11 @@ import './toastr.scss'
import { enableProdMode, NgModuleRef, ApplicationRef } from '@angular/core'
import { enableDebugTools } from '@angular/platform-browser'
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'
import { ipcRenderer } from 'electron'
import { getRootModule } from './app.module'
import { findPlugins, loadPlugins, PluginInfo } from './plugins'
import { findPlugins, initModuleLookup, loadPlugins } from './plugins'
import { BootstrapData, BOOTSTRAP_DATA } from '../../terminus-core/src/api/mainProcess'
// Always land on the start view
location.hash = ''
@@ -21,43 +23,58 @@ if (process.platform === 'win32' && !('HOME' in process.env)) {
process.env.HOME = `${process.env.HOMEDRIVE}${process.env.HOMEPATH}`
}
if (process.env.TERMINUS_DEV) {
if (process.env.TERMINUS_DEV && !process.env.TERMINUS_FORCE_ANGULAR_PROD) {
console.warn('Running in debug mode')
} else {
enableProdMode()
}
async function bootstrap (plugins: PluginInfo[], safeMode = false): Promise<NgModuleRef<any>> {
async function bootstrap (bootstrapData: BootstrapData, safeMode = false): Promise<NgModuleRef<any>> {
if (safeMode) {
plugins = plugins.filter(x => x.isBuiltin)
bootstrapData.installedPlugins = bootstrapData.installedPlugins.filter(x => x.isBuiltin)
}
const pluginsModules = await loadPlugins(plugins, (current, total) => {
const pluginModules = await loadPlugins(bootstrapData.installedPlugins, (current, total) => {
(document.querySelector('.progress .bar') as HTMLElement).style.width = `${100 * current / total}%` // eslint-disable-line
})
const module = getRootModule(pluginsModules)
const module = getRootModule(pluginModules)
window['rootModule'] = module
return platformBrowserDynamic().bootstrapModule(module).then(moduleRef => {
if (process.env.TERMINUS_DEV) {
const applicationRef = moduleRef.injector.get(ApplicationRef)
const componentRef = applicationRef.components[0]
enableDebugTools(componentRef)
}
return moduleRef
})
const moduleRef = await platformBrowserDynamic([
{ provide: BOOTSTRAP_DATA, useValue: bootstrapData },
]).bootstrapModule(module)
if (process.env.TERMINUS_DEV) {
const applicationRef = moduleRef.injector.get(ApplicationRef)
const componentRef = applicationRef.components[0]
enableDebugTools(componentRef)
}
return moduleRef
}
findPlugins().then(async plugins => {
ipcRenderer.once('start', async (_$event, bootstrapData: BootstrapData) => {
console.log('Window bootstrap data:', bootstrapData)
initModuleLookup(bootstrapData.userPluginsPath)
let plugins = await findPlugins()
if (bootstrapData.config.pluginBlacklist) {
plugins = plugins.filter(x => !bootstrapData.config.pluginBlacklist.includes(x.name))
}
plugins = plugins.filter(x => x.name !== 'web')
bootstrapData.installedPlugins = plugins
console.log('Starting with plugins:', plugins)
try {
await bootstrap(plugins)
await bootstrap(bootstrapData)
} catch (error) {
console.error('Angular bootstrapping error:', error)
console.warn('Trying safe mode')
window['safeModeReason'] = error
try {
await bootstrap(plugins, true)
await bootstrap(bootstrapData, true)
} catch (error2) {
console.error('Bootstrap failed:', error2)
}
}
})
ipcRenderer.send('ready')

View File

@@ -118,4 +118,43 @@ ngb-typeahead-window {
&:hover {
opacity: 1;
}
}
}
@keyframes terminalShakeFrames {
0% {
transform: translateX(0);
}
25% {
transform: translateX(5px);
}
50% {
transform: translateX(-5px);
}
75% {
transform: translateX(5px);
}
100% {
transform: translateX(0);
}
}
.dropdown {
.dropdown-toggle::after {
vertical-align: 0.15em;
margin-left: .5em;
opacity: .5;
}
.dropdown-item {
i + span {
margin-left: 10px;
}
}
}
.no-wrap {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}

View File

@@ -1,8 +1,11 @@
import * as fs from 'mz/fs'
import * as path from 'path'
import * as remote from '@electron/remote'
import { PluginInfo } from '../../terminus-core/src/api/mainProcess'
const nodeModule = require('module') // eslint-disable-line @typescript-eslint/no-var-requires
const nodeRequire = (global as any).require
const nodeRequire = global['require']
function normalizePath (p: string): string {
const cygwinPrefix = '/cygdrive/'
@@ -13,45 +16,8 @@ function normalizePath (p: string): string {
return p
}
global['module'].paths.map((x: string) => nodeModule.globalPaths.push(normalizePath(x)))
if (process.env.TERMINUS_DEV) {
nodeModule.globalPaths.unshift(path.dirname(remote.app.getAppPath()))
}
const builtinPluginsPath = process.env.TERMINUS_DEV ? path.dirname(remote.app.getAppPath()) : path.join((process as any).resourcesPath, 'builtin-plugins')
const userPluginsPath = path.join(
remote.app.getPath('userData'),
'plugins',
)
if (!fs.existsSync(userPluginsPath)) {
fs.mkdir(userPluginsPath)
}
Object.assign(window, { builtinPluginsPath, userPluginsPath })
nodeModule.globalPaths.unshift(builtinPluginsPath)
nodeModule.globalPaths.unshift(path.join(userPluginsPath, 'node_modules'))
// nodeModule.globalPaths.unshift(path.join((process as any).resourcesPath, 'app.asar', 'node_modules'))
if (process.env.TERMINUS_PLUGINS) {
process.env.TERMINUS_PLUGINS.split(':').map(x => nodeModule.globalPaths.push(normalizePath(x)))
}
export type ProgressCallback = (current: number, total: number) => void // eslint-disable-line @typescript-eslint/no-type-alias
export interface PluginInfo {
name: string
description: string
packageName: string
isBuiltin: boolean
version: string
author: string
homepage?: string
path?: string
info?: any
}
const builtinModules = [
'@angular/animations',
'@angular/common',
@@ -65,33 +31,48 @@ const builtinModules = [
'rxjs',
'rxjs/operators',
'terminus-core',
'terminus-local',
'terminus-settings',
'terminus-terminal',
'zone.js/dist/zone.js',
]
const cachedBuiltinModules = {}
builtinModules.forEach(m => {
const label = 'Caching ' + m
console.time(label)
cachedBuiltinModules[m] = nodeRequire(m)
console.timeEnd(label)
})
export type ProgressCallback = (current: number, total: number) => void // eslint-disable-line @typescript-eslint/no-type-alias
const originalRequire = (global as any).require
;(global as any).require = function (query: string) {
if (cachedBuiltinModules[query]) {
return cachedBuiltinModules[query]
}
return originalRequire.apply(this, [query])
}
export function initModuleLookup (userPluginsPath: string): void {
global['module'].paths.map((x: string) => nodeModule.globalPaths.push(normalizePath(x)))
const originalModuleRequire = nodeModule.prototype.require
nodeModule.prototype.require = function (query: string) {
if (cachedBuiltinModules[query]) {
return cachedBuiltinModules[query]
if (process.env.TERMINUS_DEV) {
nodeModule.globalPaths.unshift(path.dirname(remote.app.getAppPath()))
}
nodeModule.globalPaths.unshift(builtinPluginsPath)
nodeModule.globalPaths.unshift(path.join(userPluginsPath, 'node_modules'))
// nodeModule.globalPaths.unshift(path.join((process as any).resourcesPath, 'app.asar', 'node_modules'))
if (process.env.TERMINUS_PLUGINS) {
process.env.TERMINUS_PLUGINS.split(':').map(x => nodeModule.globalPaths.push(normalizePath(x)))
}
const cachedBuiltinModules = {}
builtinModules.forEach(m => {
cachedBuiltinModules[m] = nodeRequire(m)
})
const originalRequire = (global as any).require
;(global as any).require = function (query: string) {
if (cachedBuiltinModules[query]) {
return cachedBuiltinModules[query]
}
return originalRequire.apply(this, [query])
}
const originalModuleRequire = nodeModule.prototype.require
nodeModule.prototype.require = function (query: string) {
if (cachedBuiltinModules[query]) {
return cachedBuiltinModules[query]
}
return originalModuleRequire.call(this, query)
}
return originalModuleRequire.call(this, query)
}
export async function findPlugins (): Promise<PluginInfo[]> {
@@ -100,7 +81,14 @@ export async function findPlugins (): Promise<PluginInfo[]> {
const candidateLocations: { pluginDir: string, packageName: string }[] = []
const PREFIX = 'terminus-'
const processedPaths = []
for (let pluginDir of paths) {
if (processedPaths.includes(pluginDir)) {
continue
}
processedPaths.push(pluginDir)
pluginDir = normalizePath(pluginDir)
if (!await fs.exists(pluginDir)) {
continue
@@ -128,6 +116,12 @@ export async function findPlugins (): Promise<PluginInfo[]> {
const name = packageName.substring(PREFIX.length)
if (builtinModules.includes(packageName) && pluginDir !== builtinPluginsPath) {
continue
}
console.log(`Found ${name} in ${pluginDir}`)
if (foundPlugins.some(x => x.name === name)) {
console.info(`Plugin ${packageName} already exists, overriding`)
foundPlugins = foundPlugins.filter(x => x.name !== name)
@@ -156,8 +150,6 @@ export async function findPlugins (): Promise<PluginInfo[]> {
}
foundPlugins.sort((a, b) => a.name > b.name ? 1 : -1)
;(window as any).installedPlugins = foundPlugins
return foundPlugins
}
@@ -169,14 +161,11 @@ export async function loadPlugins (foundPlugins: PluginInfo[], progress: Progres
console.info(`Loading ${foundPlugin.name}: ${nodeRequire.resolve(foundPlugin.path)}`)
progress(index, foundPlugins.length)
try {
const label = 'Loading ' + foundPlugin.name
console.time(label)
const packageModule = nodeRequire(foundPlugin.path)
const pluginModule = packageModule.default.forRoot ? packageModule.default.forRoot() : packageModule.default
pluginModule.pluginName = foundPlugin.name
pluginModule.bootstrap = packageModule.bootstrap
plugins.push(pluginModule)
console.timeEnd(label)
await new Promise(x => setTimeout(x, 50))
} catch (error) {
console.error(`Could not load ${foundPlugin.name}:`, error)

View File

@@ -18,6 +18,7 @@
"es2015",
"es2015.iterable",
"es2017",
"es2019",
"es7"
]
},

View File

@@ -24,6 +24,7 @@
"compileOnSave": false,
"exclude": [
"dist",
"src",
"node_modules",
"*/node_modules"
]

View File

@@ -2,84 +2,86 @@ const path = require('path')
const webpack = require('webpack')
module.exports = {
name: 'terminus',
target: 'node',
entry: {
'index.ignore': 'file-loader?name=index.html!pug-html-loader!' + path.resolve(__dirname, './index.pug'),
sentry: path.resolve(__dirname, 'lib/sentry.ts'),
preload: path.resolve(__dirname, 'src/entry.preload.ts'),
bundle: path.resolve(__dirname, 'src/entry.ts'),
},
mode: process.env.TERMINUS_DEV ? 'development' : 'production',
optimization:{
minimize: false,
},
context: __dirname,
devtool: 'source-map',
output: {
path: path.join(__dirname, 'dist'),
pathinfo: true,
filename: '[name].js',
},
resolve: {
modules: ['src/', 'node_modules', '../node_modules', 'assets/'].map(x => path.join(__dirname, x)),
extensions: ['.ts', '.js'],
},
module: {
rules: [
{
test: /\.ts$/,
use: {
loader: 'awesome-typescript-loader',
options: {
configFileName: path.resolve(__dirname, 'tsconfig.json'),
},
},
},
{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] },
{ test: /\.css$/, use: ['style-loader', 'css-loader', 'sass-loader'] },
{
test: /\.(png|svg)$/,
use: {
loader: 'file-loader',
options: {
name: 'images/[name].[ext]',
},
},
},
{
test: /\.(ttf|eot|otf|woff|woff2)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
use: {
loader: 'file-loader',
options: {
name: 'fonts/[name].[ext]',
},
},
},
name: 'terminus',
target: 'node',
entry: {
'index.ignore': 'file-loader?name=index.html!pug-html-loader!' + path.resolve(__dirname, './index.pug'),
sentry: path.resolve(__dirname, 'lib/sentry.ts'),
preload: path.resolve(__dirname, 'src/entry.preload.ts'),
bundle: path.resolve(__dirname, 'src/entry.ts'),
},
mode: process.env.TERMINUS_DEV ? 'development' : 'production',
optimization:{
minimize: false,
},
context: __dirname,
devtool: 'source-map',
output: {
path: path.join(__dirname, 'dist'),
pathinfo: true,
filename: '[name].js',
publicPath: 'auto',
},
resolve: {
modules: ['src/', 'node_modules', '../node_modules', 'assets/'].map(x => path.join(__dirname, x)),
extensions: ['.ts', '.js'],
},
module: {
rules: [
{
test: /\.ts$/,
use: {
loader: 'awesome-typescript-loader',
options: {
configFileName: path.resolve(__dirname, 'tsconfig.json'),
},
},
},
{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] },
{ test: /\.css$/, use: ['style-loader', 'css-loader', 'sass-loader'] },
{
test: /\.(png|svg)$/,
use: {
loader: 'url-loader',
options: {
limit: 999999,
},
},
},
{
test: /\.(ttf|eot|otf|woff|woff2)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
use: {
loader: 'file-loader',
options: {
name: 'fonts/[name].[ext]',
},
},
},
],
},
externals: {
'@angular/core': 'commonjs @angular/core',
'@angular/compiler': 'commonjs @angular/compiler',
'@angular/platform-browser': 'commonjs @angular/platform-browser',
'@angular/platform-browser-dynamic': 'commonjs @angular/platform-browser-dynamic',
'@angular/forms': 'commonjs @angular/forms',
'@angular/common': 'commonjs @angular/common',
'@ng-bootstrap/ng-bootstrap': 'commonjs @ng-bootstrap/ng-bootstrap',
'@electron/remote': 'commonjs @electron/remote',
child_process: 'commonjs child_process',
electron: 'commonjs electron',
fs: 'commonjs fs',
'ngx-toastr': 'commonjs ngx-toastr',
module: 'commonjs module',
mz: 'commonjs mz',
path: 'commonjs path',
rxjs: 'commonjs rxjs',
'zone.js': 'commonjs zone.js/dist/zone.js',
},
plugins: [
new webpack.optimize.ModuleConcatenationPlugin(),
new webpack.DefinePlugin({
'process.type': '"renderer"',
}),
],
},
externals: {
'@angular/core': 'commonjs @angular/core',
'@angular/compiler': 'commonjs @angular/compiler',
'@angular/platform-browser': 'commonjs @angular/platform-browser',
'@angular/platform-browser-dynamic': 'commonjs @angular/platform-browser-dynamic',
'@angular/forms': 'commonjs @angular/forms',
'@angular/common': 'commonjs @angular/common',
'@ng-bootstrap/ng-bootstrap': 'commonjs @ng-bootstrap/ng-bootstrap',
child_process: 'commonjs child_process',
electron: 'commonjs electron',
fs: 'commonjs fs',
'ngx-toastr': 'commonjs ngx-toastr',
module: 'commonjs module',
mz: 'commonjs mz',
path: 'commonjs path',
rxjs: 'commonjs rxjs',
'zone.js': 'commonjs zone.js/dist/zone.js',
},
plugins: [
new webpack.optimize.ModuleConcatenationPlugin(),
new webpack.DefinePlugin({
'process.type': '"renderer"'
}),
],
}

View File

@@ -51,6 +51,7 @@ module.exports = {
util: 'commonjs util',
'source-map-support': 'commonjs source-map-support',
'windows-swca': 'commonjs windows-swca',
'windows-native-registry': 'commonjs windows-native-registry',
'windows-blurbehind': 'commonjs windows-blurbehind',
'yargs/yargs': 'commonjs yargs/yargs',
},

View File

@@ -2,56 +2,56 @@
# yarn lockfile v1
"@angular/animations@^11.1.1":
version "11.2.0"
resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-11.2.0.tgz#383438758c61d98f43c5ea1078d8388eb8784387"
integrity sha512-orYrBPNAsF8VpvuOaXTtPltwK2nsje5R8sWJnRC2dh1RCRdyIqHwmRIU0Mi6qLMiEaLNrFPGEMyQ9gB+sC/vYg==
"@angular/animations@^12.0.0":
version "12.0.0"
resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-12.0.0.tgz#5f845b1a58ffb6f3ea6103edf0756ac65320b725"
integrity sha512-BG/Ksk3863I7GKUem73Kty4UeU289oN+iPo/0O0x2dJCzNcpafML0GJpz4lg/RT9l6UddFviI4q9NiopR+eJfw==
dependencies:
tslib "^2.0.0"
tslib "^2.1.0"
"@angular/common@^11.1.1":
version "11.2.0"
resolved "https://registry.yarnpkg.com/@angular/common/-/common-11.2.0.tgz#90d602c0e33bb95a4d0c4c597f08255d78ed580f"
integrity sha512-wsWI5F6Y2DNxne2D5uk8e9U/vn95UYZLMNBW+QXI9U/I9kDSXoa8yEvNcn1x0XfNXBMst5pi4iSF5M8mIck1eg==
"@angular/common@^12.0.0":
version "12.0.0"
resolved "https://registry.yarnpkg.com/@angular/common/-/common-12.0.0.tgz#a4b992f3af997e9e957500148100f3f2a90ad3e9"
integrity sha512-d6+WSnCFcxAHBsbCvBC3Rutmk+tB5CEdKhkTBY/vGe0A/MjbayzHR4IDv2i0+UZDLSgMJubqh3iCPUcSglXSEg==
dependencies:
tslib "^2.0.0"
tslib "^2.1.0"
"@angular/compiler@^11.1.1":
version "11.2.0"
resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-11.2.0.tgz#130bee57dd1daa1326d37bef4b63c02aa7309cc2"
integrity sha512-EW6LM/kUYhQkuFqGt03c/eRKZAYr0LLEdMOn//j1uIh+wSq9KLffBGpky6b63xdfWxsXi8OucXUOydTQBckNEQ==
"@angular/compiler@^12.0.0":
version "12.0.0"
resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-12.0.0.tgz#bb0d4f464fee4803dbda49d862474f771c31f633"
integrity sha512-7NdZNyxm9KLlRMmmtId6RfV6VbQIUMDxN44R+ax66BoWsuhdYXUDsDO554LwYwrjnnXXGkurDJhv7umeRwaZGw==
dependencies:
tslib "^2.0.0"
tslib "^2.1.0"
"@angular/core@^11.1.1":
version "11.2.0"
resolved "https://registry.yarnpkg.com/@angular/core/-/core-11.2.0.tgz#309ae61d55b21fca0b644a6571109741d64b2467"
integrity sha512-jnbnJTW2GwfkRoXG8J4zs5FMcahMZwo6jrZGe9FiXjCYG9cLEuOXy4h99Z1s/o0vc/VXyWgym7SmeEgv+urf8g==
"@angular/core@^12.0.0":
version "12.0.0"
resolved "https://registry.yarnpkg.com/@angular/core/-/core-12.0.0.tgz#d16a217f0919b3b161229118c52b1f703815eb71"
integrity sha512-fwXtF6qP8pr07+El/dg67RmgsI4Ubfi+E5YLjYKQ62gM8MzYyYGmLPakFzFnbzYrOr05zdprrbcVgGtMRHapMA==
dependencies:
tslib "^2.0.0"
tslib "^2.1.0"
"@angular/forms@^11.1.1":
version "11.2.0"
resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-11.2.0.tgz#8ba7a98efdd464a4a6b901ba1f220162dd80c1ed"
integrity sha512-FgIG9ou27FbmyFv0n6pF95cQEz412/+iyY9OSlDnezD/7yU4fwk4NNPgP6Z/b1k7ClLYxP/YKC00WVhi1i8HdA==
"@angular/forms@^12.0.0":
version "12.0.0"
resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-12.0.0.tgz#faf5e3e36a8c4f57f42a5b3dd11786f39c94d693"
integrity sha512-/Z2AWd2k/9cs+WwXBlZ8yUqgGsHYcp8g6PUCehZQk1gd/4n4FOKvTIGiypajGUPwO4GOHJDzibfCsGw8MenCpQ==
dependencies:
tslib "^2.0.0"
tslib "^2.1.0"
"@angular/platform-browser-dynamic@^11.1.1":
version "11.2.0"
resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-11.2.0.tgz#647fe6d8dfa7651d38564240cbf75f97f11754b7"
integrity sha512-bBCtgtL87mvDT0K3HNBS19UC0BzIJUTGnYKJS9IugyfTEqlldB4juMmh/3FPjk30kxxJ8IB/ydaN2uVhBAxPVQ==
"@angular/platform-browser-dynamic@^12.0.0":
version "12.0.0"
resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.0.0.tgz#295036e7b487b6dbe3b13db763a371675d391ee6"
integrity sha512-Rkxr/KVOZGuGSuIYo2XZYbOpyS2t2jpLPS65KUUcOEwktj4hSv5VZ2soZF18tG5ZNbx06C1QDW/j9HwmZjEh5g==
dependencies:
tslib "^2.0.0"
tslib "^2.1.0"
"@angular/platform-browser@^11.1.1":
version "11.2.0"
resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-11.2.0.tgz#d1bbafd394ebfb600043060ec2d8543763041403"
integrity sha512-xd3O4svQ95BN/KpzQUFkSWfvwiCURuLJhLlDkxzLA58ElA0qodHOjQmQz/1vRFh/nXQQoWg8z9ixbmcRGzWTow==
"@angular/platform-browser@^12.0.0":
version "12.0.0"
resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-12.0.0.tgz#097805ad9a5db044dc0a74c1294cdfa5122eca4c"
integrity sha512-h+uMMluRh4dqJIor7EpvwNKRjv4xCxpttizJlqbo3vfcoOoLDoc9SvEFiXxd+UVh3S0re8zBsyBIJl+gTVFKWQ==
dependencies:
tslib "^2.0.0"
tslib "^2.1.0"
"@electron/remote@^1.0.4":
"@electron/remote@1.0.4":
version "1.0.4"
resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-1.0.4.tgz#f1c8cf3560bab762b462bfae9991919cced8bc33"
integrity sha512-kguDJRhL3ZynHrkbX8Tr7xoAzGsNgh4eqXkycXb6cgXbOgehGqkBVe+MnjSVMXz3QJykerGKPy28gqcM7AFGYw==
@@ -65,10 +65,10 @@
update-notifier "^2.2.0"
yargs "^8.0.2"
"@ng-bootstrap/ng-bootstrap@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-7.0.0.tgz#3bfa62eb52fdb891b1ce693ea11c39127e2d1ab7"
integrity sha512-SxUaptGWJmCxM0d2Zy1mx7K7p/YBwGZ69NmmBQVY4BE6p5av0hWrVmv9rzzfBz0rhxU7RPZLor2Jpaoq8Xyl4w==
"@ng-bootstrap/ng-bootstrap@^9.1.1":
version "9.1.1"
resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-9.1.1.tgz#5a629915ea93b4f9b4d61854cb6862d99a7c9ca4"
integrity sha512-m31qKJylYueXm+a3YEoOfnrJYR1lovb7WgaQwvXQz3dDmtaYRX4n8aPeCMp1VrI7hFfFITKWo0GxPaI3JIFk4w==
dependencies:
tslib "^2.0.0"
@@ -87,10 +87,10 @@
"@serialport/binding-abstract" "^9.0.7"
debug "^4.3.1"
"@serialport/bindings@^9.0.7":
version "9.0.7"
resolved "https://registry.yarnpkg.com/@serialport/bindings/-/bindings-9.0.7.tgz#8f53fb56eb866d5a1021a19ced1ddc20a60916d7"
integrity sha512-cNWaxnEbbpLoSJ6GMb0ZeCpaciczm8XRE4jgBqe/BflWZb+wyiTYIocbsySxpS40WT3kJ0sNTFag77uSmQ6ftg==
"@serialport/bindings@^9.1.0":
version "9.1.0"
resolved "https://registry.yarnpkg.com/@serialport/bindings/-/bindings-9.1.0.tgz#bb4c2778118a4404fd38749b64c0fe533d72003a"
integrity sha512-X0GM5iZgrBkR1HwoSDsJ/AJ+M61end5Ttg5mqcaUkwGCKpgJSDW3STX6pvFNr9xNzvqS56yuhAcU/eNJ2xuDaA==
dependencies:
"@serialport/binding-abstract" "^9.0.7"
"@serialport/parser-readline" "^9.0.7"
@@ -157,10 +157,10 @@
dependencies:
"@types/node" "*"
"@types/node@*", "@types/node@14.14.35":
version "14.14.35"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.35.tgz#42c953a4e2b18ab931f72477e7012172f4ffa313"
integrity sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag==
"@types/node@*", "@types/node@15.12.1":
version "15.12.1"
resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.1.tgz#9b60797dee1895383a725f828a869c86c6caa5c2"
integrity sha512-zyxJM8I1c9q5sRMtVF+zdd13Jt6RU4r4qfhTd7lQubyThvLfx6yYekWSQjGCGV2Tkecgxnlpl/DNlb6Hg+dmEw==
JSONStream@^1.3.4, JSONStream@^1.3.5:
version "1.3.5"
@@ -295,7 +295,7 @@ asap@^2.0.0:
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz"
integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
asn1@~0.2.3:
asn1@^0.2.4, asn1@~0.2.3:
version "0.2.4"
resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz"
integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
@@ -332,7 +332,7 @@ base64-js@^1.3.1:
resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
bcrypt-pbkdf@^1.0.0:
bcrypt-pbkdf@^1.0.0, bcrypt-pbkdf@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz"
integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
@@ -686,6 +686,13 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
cpu-features@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.2.tgz#9f636156f1155fd04bdbaa028bb3c2fbef3cea7a"
integrity sha512-/2yieBqvMcRj8McNzkycjW2v3OIUOibBfd2dLEJ0nWts8NobAxwiyw9phVNS6oDL8x8tz9F7uNVFEVpJncQpeA==
dependencies:
nan "^2.14.1"
create-error-class@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
@@ -1049,6 +1056,11 @@ file-uri-to-path@1.0.0:
resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz"
integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
"filesize@>= 4.0.0":
version "6.3.0"
resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.3.0.tgz#dff53cfb3f104c9e422f346d53be8dbcc971bf11"
integrity sha512-ytx0ruGpDHKWVoiui6+BY/QMNngtDQ/pJaFwfBpQif0J63+E8DLdFyqS3NkKQn7vIruUEpoGD9JUJSg7Kp+I0g==
find-npm-prefix@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz#8d8ce2c78b3b4b9e66c8acc6a37c231eb841cfdf"
@@ -1318,9 +1330,9 @@ has@^1.0.3:
function-bind "^1.1.1"
hosted-git-info@^2.1.4, hosted-git-info@^2.7.1, hosted-git-info@^2.8.8:
version "2.8.8"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==
version "2.8.9"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
http-cache-semantics@^3.8.1:
version "3.8.1"
@@ -1416,11 +1428,6 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1,
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
inherits@2.0.3:
version "2.0.3"
resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
ini@^1.3.4, ini@^1.3.5, ini@^1.3.8, ini@~1.3.0:
version "1.3.8"
resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz"
@@ -1597,10 +1604,10 @@ isstream@~0.1.2:
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz"
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
js-yaml@4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f"
integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==
js-yaml@4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
dependencies:
argparse "^2.0.1"
@@ -1659,10 +1666,10 @@ keyboardevents-areequal@^0.2.1:
resolved "https://registry.npmjs.org/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz"
integrity sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==
keytar@^7.6.0:
version "7.6.0"
resolved "https://registry.yarnpkg.com/keytar/-/keytar-7.6.0.tgz#498e796443cb543d31722099443f29d7b5c44100"
integrity sha512-H3cvrTzWb11+iv0NOAnoNAPgEapVZnYLVHZQyxmh7jdmVfR/c0jNNFEZ6AI38W/4DeTGTaY66ZX4Z1SbfKPvCQ==
keytar@^7.7.0:
version "7.7.0"
resolved "https://registry.yarnpkg.com/keytar/-/keytar-7.7.0.tgz#3002b106c01631aa79b1aa9ee0493b94179bbbd2"
integrity sha512-YEY9HWqThQc5q5xbXbRwsZTh2PJ36OSYRjSv3NN2xf5s5dpLTjEZnC2YikR29OaVybf9nQ0dJ/80i40RS97t/A==
dependencies:
node-addon-api "^3.0.0"
prebuild-install "^6.0.0"
@@ -2081,7 +2088,7 @@ mz@^2.7.0:
object-assign "^4.0.1"
thenify-all "^1.0.0"
nan@^2.13.2, nan@^2.14.0, nan@^2.14.2:
nan@^2.13.2, nan@^2.14.0, nan@^2.14.1, nan@^2.14.2:
version "2.14.2"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19"
integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==
@@ -2098,17 +2105,25 @@ native-process-working-directory@^1.0.2:
dependencies:
node-addon-api "^3.1.0"
ngx-toastr@^13.2.1:
version "13.2.1"
resolved "https://registry.yarnpkg.com/ngx-toastr/-/ngx-toastr-13.2.1.tgz#531bc7da6a524a861e0409bd2749878b3b3f8a3f"
integrity sha512-UAzp7/xWK9IXA2LsOmhpaaIGCqscvJokoQpBNpAMrjEkDeSlFf8PWQAuQY795KW0mJb3qF9UG/s23nsXfMYKmg==
ngx-filesize@^2.0.16:
version "2.0.16"
resolved "https://registry.yarnpkg.com/ngx-filesize/-/ngx-filesize-2.0.16.tgz#fdaba04170edb6cfcdf7be932783cf913b03f016"
integrity sha512-VdaCirE7hSyfQh8ZEmhzNEhbddiTYUHF4V6OX+KyTmnQSVx4hp9kmzDX5YlkIlmClI6wI+LZmH9/q7XS3fsMPA==
dependencies:
filesize ">= 4.0.0"
tslib "^2.0.0"
node-abi@^2.20.0, node-abi@^2.21.0, node-abi@^2.7.0:
version "2.21.0"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.21.0.tgz#c2dc9ebad6f4f53d6ea9b531e7b8faad81041d48"
integrity sha512-smhrivuPqEM3H5LmnY3KU6HfYv0u4QklgAxfFyRNujKUzbUcYZ+Jc2EhukB9SRcD2VpqhxM7n/MIcp1Ua1/JMg==
ngx-toastr@^14.0.0:
version "14.0.0"
resolved "https://registry.yarnpkg.com/ngx-toastr/-/ngx-toastr-14.0.0.tgz#20e4737ef330b892a453768cd98b980558aeb286"
integrity sha512-dnDzSY73pF6FvNyxdh6ftfvXvUg6SU7MAT3orPUCzA77t3ZcFslro06zk4NCA2g67RF7dBwM0OJ/y0SN6fdGYw==
dependencies:
tslib "^2.1.0"
node-abi@^2.20.0, node-abi@^2.30.0, node-abi@^2.7.0:
version "2.30.0"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.0.tgz#8be53bf3e7945a34eea10e0fc9a5982776cf550b"
integrity sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==
dependencies:
semver "^5.4.1"
@@ -2645,14 +2660,6 @@ path-type@^2.0.0:
dependencies:
pify "^2.0.0"
path@0.12.7:
version "0.12.7"
resolved "https://registry.npmjs.org/path/-/path-0.12.7.tgz"
integrity sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=
dependencies:
process "^0.11.1"
util "^0.10.3"
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz"
@@ -2706,11 +2713,6 @@ process-nextick-args@~2.0.0:
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
process@^0.11.1:
version "0.11.10"
resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz"
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
promise-inflight@^1.0.1, promise-inflight@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz"
@@ -3021,12 +3023,12 @@ run-queue@^1.0.0, run-queue@^1.0.3:
dependencies:
aproba "^1.1.1"
rxjs@^6.6.6:
version "6.6.6"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.6.tgz#14d8417aa5a07c5e633995b525e1e3c0dec03b70"
integrity sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg==
rxjs@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.1.0.tgz#94202d27b19305ef7b1a4f330277b2065df7039e"
integrity sha512-gCFO5iHIbRPwznl6hAYuwNFld8W4S2shtSJIqG27ReWXo9IWrCyEICxUA+6vJHwSR/OakoenC4QsDxq50tzYmw==
dependencies:
tslib "^1.9.0"
tslib "~2.1.0"
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0:
version "5.2.1"
@@ -3062,13 +3064,13 @@ serialize-error@^5.0.0:
dependencies:
type-fest "^0.8.0"
serialport@^9.0.7:
version "9.0.7"
resolved "https://registry.yarnpkg.com/serialport/-/serialport-9.0.7.tgz#bd116a70bd7acbfd587491acd3ee03e02a0df71c"
integrity sha512-NeDfVks3JAJ7s8cXDopx1iUUgC/7TaltE7iQGiSewIWMZaK7oStiz3VJzcuKgor7F+U/y6zbAnj4i6eHq0on+g==
serialport@^9.1.0:
version "9.1.0"
resolved "https://registry.yarnpkg.com/serialport/-/serialport-9.1.0.tgz#f8b9dc87e6713e1e0198752f6e2cce95aaf5a6ab"
integrity sha512-W17ji2TOotufIUCXIWcB6P+RztO1S4BcWsAc99jQn5BaH3Kw6xUyOX2ng0ZQ+hPjS/WWI2CdWynf4bKRJKD/+A==
dependencies:
"@serialport/binding-mock" "^9.0.7"
"@serialport/bindings" "^9.0.7"
"@serialport/bindings" "^9.1.0"
"@serialport/parser-byte-length" "^9.0.7"
"@serialport/parser-cctalk" "^9.0.7"
"@serialport/parser-delimiter" "^9.0.7"
@@ -3205,6 +3207,17 @@ split-on-first@^1.0.0:
resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f"
integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==
ssh2@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.1.0.tgz#43dd24930e15e317687f519d6b40270d9cd00d00"
integrity sha512-CidQLG2ZacoT0Z7O6dOyisj4JdrOrLVJ4KbHjVNz9yI1vO08FAYQPcnkXY9BP8zeYo+J/nBgY6Gg4R7w4WFWtg==
dependencies:
asn1 "^0.2.4"
bcrypt-pbkdf "^1.0.2"
optionalDependencies:
cpu-features "0.0.2"
nan "^2.14.2"
sshpk@^1.7.0:
version "1.16.1"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz"
@@ -3221,9 +3234,9 @@ sshpk@^1.7.0:
tweetnacl "~0.14.0"
ssri@^6.0.0, ssri@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8"
integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==
version "6.0.2"
resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5"
integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==
dependencies:
figgy-pudding "^3.5.1"
@@ -3253,7 +3266,7 @@ strict-uri-encode@^2.0.0:
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=
string-width@^1.0.1, "string-width@^1.0.2 || 2":
string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz"
integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
@@ -3262,7 +3275,7 @@ string-width@^1.0.1, "string-width@^1.0.2 || 2":
is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0"
string-width@^2.0.0, string-width@^2.1.1:
"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz"
integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
@@ -3462,12 +3475,12 @@ tough-cookie@~2.5.0:
psl "^1.1.28"
punycode "^2.1.1"
tslib@^1.9.0:
version "1.14.1"
resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
tslib@^2.0.0, tslib@^2.1.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c"
integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==
tslib@^2.0.0:
tslib@~2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a"
integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==
@@ -3582,13 +3595,6 @@ util-promisify@^2.1.0:
dependencies:
object.getownpropertydescriptors "^2.0.3"
util@^0.10.3:
version "0.10.4"
resolved "https://registry.npmjs.org/util/-/util-0.10.4.tgz"
integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==
dependencies:
inherits "2.0.3"
uuid@^3.0.1, uuid@^3.3.2, uuid@^3.3.3:
version "3.4.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
@@ -3668,10 +3674,10 @@ windows-native-registry@^3.0.0:
dependencies:
node-addon-api "^3.0.0"
windows-process-tree@^0.2.4:
version "0.2.4"
resolved "https://registry.yarnpkg.com/windows-process-tree/-/windows-process-tree-0.2.4.tgz#747af587b54cc6c996f2be0836cc8a8fd0dc038f"
integrity sha512-9gag9AHm3Iin/4YC1EwoIfZlqW/rG2eV7rJZ4Fy5NnAMGdewmnwsie5Rz+CJo2vSolqzzfw7hPeu3oOdniNejg==
windows-process-tree@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/windows-process-tree/-/windows-process-tree-0.3.0.tgz#cf0d9291b22fba2a7f5a687c8272866e28fbcafd"
integrity sha512-0bKI4gcd5MOsOpn2TdStCSlnjThtH6BdHrocekY9qCgTqgEtdaUs0B5BaqyzF9jXoTSwz38NMdE1F55o4fgv9Q==
dependencies:
nan "^2.13.2"
@@ -3740,9 +3746,9 @@ xtend@~4.0.1:
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
y18n@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
integrity sha1-bRX7qITAhnnA136I53WegR4H+kE=
version "3.2.2"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696"
integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==
y18n@^4.0.0:
version "4.0.1"
@@ -3801,10 +3807,10 @@ yargs@^14.2.3:
y18n "^4.0.0"
yargs-parser "^15.0.1"
yargs@^16.2.0:
version "16.2.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
yargs@^17.0.1:
version "17.0.1"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.0.1.tgz#6a1ced4ed5ee0b388010ba9fd67af83b9362e0bb"
integrity sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==
dependencies:
cliui "^7.0.2"
escalade "^3.1.1"

View File

@@ -4,7 +4,7 @@ platform:
- x64
environment:
nodejs_version: "15"
nodejs_version: "14"
version: "{build}"

View File

@@ -27,7 +27,8 @@ files:
- '!**/{.DS_Store,.git,.hg,.svn,CVS,RCS,SCCS,.gitignore,.gitattributes}'
- '!**/{__pycache__,thumbs.db,.flowconfig,.idea,.vs,.nyc_output}'
- '!**/{appveyor.yml,.travis.yml,circle.yml}'
- '!**/{npm-debug.log,yarn.lock,.yarn-integrity,.yarn-metadata.json'
- '!**/{npm-debug.log,yarn.lock,.yarn-integrity,.yarn-metadata.json}'
- '!**/deps/cpu_features/build'
extraResources:
- builtin-plugins
- extras
@@ -70,6 +71,8 @@ linux:
artifactName: terminus-${version}-linux.${ext}
executableArgs:
- "--no-sandbox"
desktop:
StartupWMClass: terminus
snap:
plugs:
- default
@@ -86,10 +89,18 @@ deb:
- libxtst6
- libnss3
afterInstall: build/linux/after-install.tpl
fpm:
- '--replaces'
- 'terminus'
pacman:
depends:
- gnome-keyring
- libsecret
rpm:
depends:
- screen
- gnome-keyring
fpm:
- '--rpm-rpmbuild-define'
- '_build_id_links none'
- '--replaces'
- 'terminus'

View File

@@ -1,32 +1,697 @@
# Changes
### Changes
## Releases from [chrisant996/clink](https://github.com/chrisant996/clink) fork
##### v0.4.9
### v1.2.9
- Added detection for possible antivirus interference when injecting Clink.
- Ignore duplicate scripts paths when loading scripts.
- Fixed [#118](https://github.com/chrisant996/clink/issues/118); inputrc is not read from state directory (regression introduced in v1.0.0).
### v1.2.8
- Fixed `...\` or `.../` to change directories (path separator after several dots).
- Fixed `/dirname/` to change directories (forward slashes when a directory is the only thing in the input line).
- Fixed [#114](https://github.com/chrisant996/clink/issues/114); "Clink already loaded in process" error when autorun is installed for both Current User and All Users.
- Fixed [#113](https://github.com/chrisant996/clink/issues/113); forward slash translation didn't work with the `cd` command.
### v1.2.7
- Fixed [#113](https://github.com/chrisant996/clink/issues/113); `clink.slash_translation()` had been removed (regression introduced in v1.0.0).
- The new `match.translate_slashes` setting controls the default behavior for slash translation for completion matches.
- The new `clink.translateslashes()` API can override slash translation for completion matches (and `clink.slash_translation()` is supported for backward compatibility).
### v1.2.6
- Fixed tilde expansion for directory by itself; now `~\` can change the working directory to the `~` directory.
- Fixed pagination when displaying completions that take more than 1 line to display.
- Fixed inserting directory match completions when a Lua script didn't include a trailing path separator in the directory match.
- Fixed [#111](https://github.com/chrisant996/clink/issues/111); `..` completion is different from bash (regression introduced in v1.0.0).
### v1.2.5
- Added `os.expandenv()` function to expand environment variables in a string.
- Added `console.cellcount()` function to count the cells a string will use when displayed.
- Added `console.plaintext()` function to remove ANSI escape codes from a string.
- Clink now sets `%=clink.bin%` that points to the Clink binaries directory. This can be particularly useful for a portable installation of Clink so that scripts can find the Clink binaries directory and construct relative paths to other nearby files.
- Clean up column alignment in `--help` texts.
- Fixed `history.sticky_search` with anchored history search.
- Fixed `clink inject --profile` to use correct log file name while initially injecting.
- Fixed Clink autorun to be more compatible with Cmder ([Cmder #2536](https://github.com/cmderdev/cmder/issues/2536)).
### v1.2.4
- Added support for <kbd>Shift</kbd>+<kbd>Arrows</kbd> to select text and typing to replace selected text.
- Added optional argument to `word_classifications:classifyword()` and `word_classifications:applycolor()` to allow only applying color where another color hasn't yet been applied.
- Fixed first <kbd>Up</kbd> after reusing a history line so that it gets the reused history line, rather than getting the previous history line.
- Fixed `add-history` command to not add blank lines to history.
- Fixed `rl.setmatches()` (regression introduced in v1.1.26).
- Fixed input coloring for `clink set` and any color setting name (regression introduced in v1.2).
- Fixed potential crash with `clink history --session`.
- Fixed <kbd>Ctrl</kbd>+<kbd>D</kbd> when `cmd.ctrld_exits` is disabled; it didn't exit, but it did still discard the input line and start a new prompt.
- Fixed [#107](https://github.com/chrisant996/clink/issues/107); autorun reports inject failures (regression introduced in v1.2.3).
- Fixed [#106](https://github.com/chrisant996/clink/issues/106); history missing `--bare` option (regression introduced in v1.2.3).
### v1.2.3
- Added `history.sticky_search` setting: when enabled, reusing a history line does not add the reused line to the end of the history, and it leaves the history search position on the reused line so next/prev history can continue from there (e.g. replaying commands via <kbd>Up</kbd> several times then <kbd>Enter</kbd>, <kbd>Down</kbd>, <kbd>Enter</kbd>, etc).
- Added failure reporting and logging when `clink inject` fails.
- Added `--unique` flag for use with `clink history compact --unique` to remove duplicate entries from the history list.
- The `clink-popup-complete` command now matches wildcards.
- Restored the <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>U</kbd> key binding from v0.4.9 (moves the current working directory up one level).
- Fixed searching for inputrc files to also search in the profile directory (regression introduced in v1.0.0).
- Fixed incremental search in the History popup list to search in reverse order (bottom to top).
- Fixed `clink-popup-history` to set the history search position like other history search commands do, so that it plays well with the `history.sticky_search` setting.
### v1.2.2
- Added `%CLINK_HISTORY_LABEL%` environment variable to use a different master history file (fixes [#99](https://github.com/chrisant996/clink/issues/99)).
### v1.2.1
- Added Troubleshooting Tips section in the documentation.
- Added backward compatibility for `clink set` with v0.4.9. Old setting names and values are not documented, but are automatically mapped to the appropriate new setting(s). This was done so that suggestions in old web sites and posts can usually continue to work, to reduce confusion and support burden.
- Fixed [#97](https://github.com/chrisant996/clink/issues/97); VS2017 error C2039: 'min': is not a member of 'std'.
- Fixed [#96](https://github.com/chrisant996/clink/issues/96); wrong setting string (the name of a setting was accidentally truncated).
- Fixed some slightly inaccurate/incomplete migration from old settings to new settings.
### v1.2
- First official release from [chrisant996/clink](https://github.com/chrisant996/clink) fork.
### v1.1.49
- Added `clink.classifier()` to enable coloring the input line independently from argmatchers.
- Added `word_classifications:applycolor()` to apply SGR escape codes anywhere in the input line.
- Removed `word_classifications:iswordclassified()`.
- Fixed the Product Version string in the binary file version resources.
### v1.1.48
- Added `clink.getansihost()` function to get Clink's best guess who will process ANSI escape codes (can be useful for avoiding 256 bit and 24 bit color codes, for example).
- Added detection for being hosted in ConsoleZ.
- Fixed [#20](https://github.com/chrisant996/clink/issues/20); `set /p VAR=""` shows the normal command prompt text instead of empty prompt text.
### v1.1.47
- Added default key binding for <kbd>Ctrl</kbd>+<kbd>Space</kbd> to invoke `old-menu-complete`, which is the most similar to CMD's standard <kbd>Tab</kbd> behavior.
- Fixed `search-ignore-case` config variable to be on by default.
### v1.1.46
- Added `rl.setvariable()` to temporarily override the value of a Readline config variable.
- The completion commands now also expand tilde by itself (`~`), in addition to tilde followed by a path separator (`~\etc`).
- Fixed [#94](https://github.com/chrisant996/clink/issues/94); setting `history.save` to False also disables interactive history in subsequent sessions.
### v1.1.45
- Fixed [#93](https://github.com/chrisant996/clink/issues/93); stdout is sometimes broken by Cmder init.bat.
### v1.1.44
- Added `clink.getsession()`.
- Added `%CLINK_NOAUTORUN%` which overrides automatic inject when Clink is installed for autorun.
- Fixed [#92](https://github.com/chrisant996/clink/issues/92); `clink-popup-history` and similar commands not working with ConEmu and Cmder (regression introduced in v1.1.25).
### v1.1.43
- Added `clink history --diag` flag that prints diagnostic information while performing history operations.
- Minor optimization in `clink history` when printing the full list of history items.
- Fixed `clink history compact` so it actually performs compaction.
### v1.1.42
- Added `clink history --bare` flag to omit history item numbers.
- Added several Lua functions:
- `io.popenrw()` is like `io.popen()`, but returns both a read file handle and a write file handle (see documentation for important usage warning).
- `os.createtmpfile()` creates a unique named temporary file, with control over the prefix and suffix and path.
- `os.getfullpathname()` to get the full path name for a file.
- `os.getlongpathname()` to get the long path name for a file.
- `os.getshortpathname()` to get the 8.3 short path name (if available) for a file.
- Improved argument validation for Clink's Lua APIs. This could expose bugs in existing scripts, so there is also a `lua.strict` setting that can be disabled to revert back to loose argument validation.
- Updated documentation.
- Fixed `clink history compact` so that it forces compaction as intended.
- Fixed completion for `clink set` so that filename completion works in string settings.
- Fixed backwards return value from `rl.invokecommand()`.
- Fixed console input/output modes across `luafunc:` key bindings, in case the Lua functions spawn a process that alters the console mode without restoring it.
### v1.1.41
- Added `terminal.adjust_cursor_style` setting as a workaround to avoid interfering with the Windows 10 Cursor Shape console setting. There are several trade-offs, though.
- Added `rl_buffer:refreshline()` function to redraw the input line, e.g. in case something has written over it.
- Added `os.getpid()` function to get the process ID, intended mainly to help salt unique resource names.
- Added `clink.onfiltermatches()` so scripts can register a callback function to run after Clink generates matches and before it displays them.
### v1.1.40
- Added a group of `clink-complete-numbers` commands that do completion for numbers from the console screen, bound to <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>N</kbd> by default.
- Added `rl.getlastcommand()` function that returns the name of the last command invoked by key bindings.
- Fixed sort order in <kbd>Alt</kbd>+<kbd>H</kbd> for the newly supported key bindings (that were added in v1.1.39).
- Fixed <kbd>Ctrl</kbd>+<kbd>Space</kbd> (regression introduced in v1.1.39).
- Fixed various <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>whatever</kbd> combinations (regression introduced in v1.1.39).
- Fixed `rl.setmatches()` when the input line is not empty and `clink.colorize_input` is enabled.
### v1.1.39
- Added support for many more key bindings, such as <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+Letter keys.
- Added `terminal.differentiate_keys` setting that when enabled allows binding <kbd>Ctrl</kbd> + <kbd>H</kbd> or <kbd>I</kbd> or <kbd>M</kbd> or <kbd>[</kbd> separately from <kbd>Backspace</kbd>, <kbd>Tab</kbd>, <kbd>Return</kbd>, or <kbd>Escape</kbd>.
- Removed `terminal.modify_other_keys` setting and made it always enabled.
- Changed `terminal.use_altgr_substitute` to be disabled by default so that <kbd>Ctrl</kbd>+<kbd>Alt</kbd> key bindings can work by default on keyboards with <kbd>AltGr</kbd>.
- Changed output from `clink echo` so it's directly usable in the inputrc files.
- Fixed `terminal.use_altgr_substitute` to only affect <kbd>AltGr</kbd> substitute key combinations (it had always broken the <kbd>RightAlt</kbd> key in general on other keyboard layouts).
- Fixed a benign issue with the console input mode in `clink echo`.
### v1.1.38
- Fixed [#84](https://github.com/chrisant996/clink/issues/84); added `terminal.use_altgr_substitute` setting.
- Fixed [#80](https://github.com/chrisant996/clink/issues/80); clink.log is not deleted when Cmder injects Clink.
### v1.1.37
- Fixed copy to clipboard (it never cleared the clipboard!).
- Fixed [#82](https://github.com/chrisant996/clink/issues/82); added two new `clink.paste_crlf` modes: `ampersand` replaces newlines with ampersands, and `crlf` pastes newlines as-is and executes any commands ending in a newline.
- Fixed [#69](https://github.com/chrisant996/clink/issues/69); space in the prompt disappears after enter echo: added support for CJK codepages.
### v1.1.36
- Fixed [#79](https://github.com/chrisant996/clink/issues/79); Issue with United States - international keyboard layout (regression introduced in v1.1.0).
- Fixed [#78](https://github.com/chrisant996/clink/issues/78); crash when history file contains a line longer than 8192 characters (regression introduced in v1.1.2-alpha).
### v1.1.35
- Fixed when the `mark-directories` inputrc variable is `off` (regression introduced in v1.1.1-alpha).
- Fixed Lua reading from stdin, especially in the Lua debugger (regression introduced in v1.1.25).
- Fixed exponential cost performance bug in Readline when removing duplicate matches.
### v1.1.34
- Fixed copying to clipboard (CF_UNICODETEXT was put on the clipboard correctly, but CF_TEXT was empty and should have been omitted to let Windows automatically convert it from the Unicode text).
### v1.1.33
- Make the "replacing arglink" warning message a little more informative, and write a lua traceback to the Clink log file.
- Fixed [#77](https://github.com/chrisant996/clink/issues/77); with ConsoleZ scrolling does not always work.
- Fixed [#76](https://github.com/chrisant996/clink/issues/76); cannot `cd` up multiple directories normally.
### v1.1.32
- Added support for non-standard escape codes to set the window title or print environment variables. Depending on the `terminal.emulation` setting, the behavior is slightly different. When `emulate` Clink processes the escape codes. When `native` with ConEmu (and Clink) the escape codes are passed to ConEmu, except that Clink processes the environment variable codes in prompt strings. When `native` with other terminals, Clink preprocesses the title and environment variable escape codes in prompt strings, but passes the escape codes to the terminal outside of prompt strings.
- Fixed [#67](https://github.com/chrisant996/clink/issues/67); AutoRun interferes with Cmder.
### v1.1.31
- Fixed [#74](https://github.com/chrisant996/clink/issues/74); clink gets confused by non-standard ConEmu escape codes.
- Fixed [#73](https://github.com/chrisant996/clink/issues/73); `exec.space_prefix` and other settings defined in Lua scripts don't take effect until second input line (regression introduced in v1.1.4).
### v1.1.30
- Fixed history compacting on x86 (regression introduced in v1.1.2-alpha).
### v1.1.29
- Added `clink installscripts` and `clink uninstallscripts` to make it easy for package managers like Scoop to install/uninstall script packages for use with Clink. The installed script paths are stored in the registry for the current user.
- Fixed `bold` vs `bright` colors to more accurately follow generally accepted ANSI escape code conventions:
- Renamed `dim` to `nobold` for clarity (though `dim` is still recognized for backward compatibility).
- `bold` adds intensity to a non-intense color (e.g. `cyan` which is 36).
- `nobold` removes intensity added by `bold` (e.g. `1;36` becomes `36`), but does not remove intensity from an explicit intense color (such as `bright cyan` which is `96`).
- Fixed support for `--file=` flags in argmatchers.
- Fixed match display filtering on the first try for a word (regression introduced in v1.1.19).
- Fixed the `clink --profile` flag (regression introduced in v1.1.10).
- Fixed `clink info` to accurately report the script dirs (it didn't account for the `clink.path` setting correctly).
### v1.1.28
- Renamed the `log.rl_terminal` setting to `debug.log_terminal`; it has already been repeatedly very useful in multiple was since it was added, so it stays.
- Fixed [#70](https://github.com/chrisant996/clink/issues/70); ctrl+c not working (regression introduced in v1.1.25).
### v1.1.27
- Added `color.argmatcher` setting which, when set, is used to color a command name if it has an associated argmatcher (this supersedes `color.cmd`, `color.doskey`, and `color.input`). By default it's not set.
- Added `log.rl_terminal` setting which logs all terminal input and output for Readline (this setting may be renamed or removed in the future).
### v1.1.26
- Added `rl.invokecommand()` which can invoke a Readline command from inside a "luafunc:" key binding.
- Added `rl.setmatches()` which can override match completions from inside a "luafunc:" key binding.
- Worked around UTF8 key binding problem with Readline which had been causing some meta key bindings (M-x, M-C-x, etc) to sometimes produce garbled key bindings and garbled entries in `clink-show-help` (<kbd>Alt</kbd>+<kbd>H</kbd>).
- Fixed crash if "luafunc:" key binding macro refers to a symbol that doesn't exist.
### v1.1.25
- Added `clink-find-conhost` command that, when in a default (conhost) console window, is equivalent to picking "Find..." from the system menu.
- Added `clink-mark-conhost` command that, when in a default (conhost) console window, is equivalent to picking "Mark" from the system menu.
- `clink-copy-word` now copies the current word by default, but copies the nth word if a numeric argument is entered (see "Readline Arguments" in the Readline manual).
- Fixed match display filtering to not exceed the screen width (regression introduced in v1.1.12).
- Fixed multi-key sequences; in some cases it could get confused about whether an input key is part of a multi-key binding sequence (regression introduced in v1.1.1-alpha).
- Fixed stray input processing by conhost (holding <kbd>Ctrl</kbd>+<kbd>A</kbd> or <kbd>Ctrl</kbd>+<kbd>F</kbd> or etc could accidentally trigger conhost's shortcut keys).
- Fixed popup window location and size when using Windows Terminal.
- Fixed input coloring after `operate-and-get-next`; also fixes brief flicker of incorrect coloring whenever the input line is modified.
### v1.1.24
- `auto` for `terminal.emulation` now uses native VT support on Windows 10 build 15063 and higher, unless the HKCU\Console\ForceV2 regkey is 0.
- Special quote handling now enables `"dir\"fi` to complete to `"dir\file"`. CMD simply strips quotes during completion, and now Clink behaves similarly.
- <strong>Breaking Change:</strong> `line:getword()` and `line:getendword()` now strip quotes from the word. This should generally automagically make existing match generators work even with embedded quotes, but there's a chance that some match generator might need to be updated. This seems like a reasonable compromise, given the general benefit purchased by this breaking change.
- `os:globdirs()` and `os:globfile()` strip quotes from the <span class="arg">globpattern</span> in order to behave more like CMD. Embedded quotes are nonsensical and the intended interpretation is clear, so the APIs now help out with that.
- Fixed [#66](https://github.com/chrisant996/clink/issues/66); crash when injecting into 32 bit cmd (regression introduced in v1.1.21).
- Fixed [#64](https://github.com/chrisant996/clink/issues/64); wrong cursor position when PROMPT contains BEL character.
- Fixed [#62](https://github.com/chrisant996/clink/issues/62); argmatchers should color `-x:"foo"` as a flag if `-x:` is a flag.
- Fixed [#61](https://github.com/chrisant996/clink/issues/61); argmatchers should not handle completion for text immediately following `-flag:`. Instead it always uses file completion. A custom generator can be used to override that behavior.
- Fixed [#60](https://github.com/chrisant996/clink/issues/60); completion fails with multiple slashes.
- Fixed completion in some circumstances. Readline and Clink didn't always agree on where the word breaks were; now Clink always tells Readline where the word breaks are (so that completion, input colorization, and lua scripts can all work properly and consistently).
- Fixed 256 color ANSI codes.
### v1.1.23
- Fixed [#57](https://github.com/chrisant996/clink/issues/57); slashes not normalized in some cases.
- Fixed [#45](https://github.com/chrisant996/clink/issues/45); interaction between `history.dupe_mode`=`erase_prev` and `history.shared`=`false`.
- Fixed `menu-complete-wraparound` when off and there's only 1 match.
### v1.1.22
- Added `menu-complete-wraparound` (on by default) that controls whether completion commands wrap around when cycling past an end (affects popup windows as well).
- Fixed match completion getting stuck (regression introduced in v1.1.19).
- Fixed active mark region so it gets deactivated appropriately (it wasn't hooked up fully for Readline's callback mode, which is the mode Clink uses).
- Fixed `clink-show-help` (<kbd>Alt</kbd>+<kbd>H</kbd>) so it's able to list `C-@` bindings.
- Fixed inconsistent mark color.
### v1.1.21
- Added `clink.oninject()` so scripts can register a callback function to run when Clink is injected into CMD.
- Added `console.linehascolor()` function that returns whether the specified line contains any of the specified colors.
- Added `console.findprevline()` and `console.findnextline()` functions that can search backwards or forwards for text and/or colors in the screen buffer. Regular expressions may be used.
- Fixed doskey alias parsing for match generators and input line coloring (Clink had been using slightly different parsing rules than CMD does).
- Fixed the "-- More --" prompt while listing key bindings; <kbd>Esc</kbd> didn't quit, and unexpected keys weren't ignored.
### v1.1.20
- Now you can bind Lua functions to keys via "luafunc:" macros! Added new `rl_buffer` type that gets passed to the Lua function.
- Added a group of `console` Lua APIs intended mainly for use by Lua function key bindings (e.g. `console.scroll()`).
- Added `string.equalsi()` function that performs a case insensitive UTF8 comparison of two strings.
- Added `string.matchlen()` function that compares two UTF8 strings and returns how many characters match at the beginning, or -1 if the entire strings match. It respects the `match.ignore_case` and `match.ignore_accents` settings.
- Added `path.toparent()` function that adjust the input string by moving up one directory level.
- Added `clink.onendedit()` so scripts can register a callback function to run when editing finishes (e.g. <kbd>Enter</kbd> is pressed). If desired, the function can even change the input text. This is very powerful, and should be used carefully.
- Changed `os.getbatterystatus()` to return a table with the battery status details, rather than four separate return values.
- Fixed the `doskey.enhanced` setting to not expand doskey aliases when preceded by a space. However, a doskey alias after a `&` or `|` command separator needs to be preceded by two spaces to avoid expanding it. That's so `alias & alias` expands both, and ` alias & alias` expands neither; while the rules are more complicated to explain, they make more sense visually.
- Fixed environment variable completion (regression introduced in v1.1.19).
- Fixed Cmder startup (regression introduced in v1.1.17). Cmder expects to be able to replace Clink v0.4.9's clink.lua file, but there is no such thing anymore in newer versions of Clink. To be properly backwardly compatible with Clink v0.4.9 requires loading clink.lua (if it exists) from the first script directory listed by `clink info`, and ignoring clink.lua files in all other script directories.
### v1.1.19
- Improved responsiveness while typing: matches are collected only on demand, instead of always while typing. This makes it possible to always support match completion for UNC paths.
- Fixed [#50](https://github.com/chrisant996/clink/issues/50); <kbd>Alt</kbd>+<kbd>H</kbd> could warn about likely mistakes in key bindings.
### v1.1.18
- The input text now has context sensitive coloring based on the argmatchers. It's on by default and can be turned off with `clink set clink.colorize_input false`.
- Updated the Readline library to 8.1.
- Terminal emulation now supports the audible bell character.
- Fixed [#48](https://github.com/chrisant996/clink/issues/48); `menu-complete` gets stuck.
- Fixed [#47](https://github.com/chrisant996/clink/issues/47); <kbd>Alt</kbd>+<kbd>D</kbd> erases history instead of word.
- Fixed [#46](https://github.com/chrisant996/clink/issues/46); typing `..` in subdirectory of root doesn't work.
- Fixed restoring color after pager when showing help.
- Fixed `clink set` match completions for color settings.
### v1.1.17
- Added `os.getbatterystatus()` function that gets battery status information much faster than launching `wmic`.
- Fixed [#44](https://github.com/chrisant996/clink/issues/44); Path completion doesn't work with `cd /d`.
- Fixed loading scripts to ignore loading clink.lua, so that loading scripts behaves like Clink v0.4.9.
### v1.1.16
- Added `match.ignore_accent` setting (enabled by default) that ignores Latin alphabet diacriticals when completing matches (e.g. `ä` matches `a`, `ı` matches `i`, `ł` matches `l`, etc).
- Fixed [#42](https://github.com/chrisant996/clink/issues/42); history lines are split on special characters.
- Fixed [#41](https://github.com/chrisant996/clink/issues/41); Enable custom doskey handling of `..` and `-`.
- Fixed Readline bug inserting dir matches; `\win_ foo` (cursor at `_`) would become `\Windows\\_ foo`.
- Fixed the `quoted-insert` command to insert just `\x1b` when <kbd>ESC</kbd> is pressed.
### v1.1.15
- Migrating settings now immediately writes a new settings file, instead of waiting until a setting is changed.
- Added support to detect when running in Windows Terminal and use native terminal support (which enables things like Xterm 256 and 24-bit color support).
- Added terminal emulation support for Xterm 256 and 24-bit color escape codes. Clink maps the specified color to the most similar color in the active 16 color palette (using the CIELAB color space). To get full support for 24-bit color, it's necessary to use ConEmu or Windows Terminal or a similar console host, or to set `terminal.emulation` to `native` (which isn't supported on some older Windows OS versions).
- Allow doskey macros named `..` or `-`, and also now doskey macros that resolve to `..` or `-` or a directory name will work (just like if the macro text had been typed at the Clink prompt).
- Fixed compatibility problem with various scripts getting the %HOME% environment variable. Now if it isn't set, then Clink synthesizes %HOME% from %HOMEDRIVE% and %HOMEPATH% or from %USERPROFILE%.
- Fixed saving color settings to behave like other settings: only write a setting's value to the setting file if it differs from the default value.
- Fixed the `clink.print()` Lua function so it also works during loading scripts and during prompt filtering.
- Fixed the Readline input text display getting garbled if the filtered prompt includes Xterm's OSC window title code (`\x1b]0;text\x07`). Clink doesn't support that escape code, but at no longer garbles the input text if that escape code is present.
### v1.1.14
- Migrate settings and history from an old version of Clink, if present. This only happens if the new-version Clink settings or history files don't exist. (Deleting an existing new-version Clink settings or history file will cause migration to happen again.)
- Added `color.prompt` setting for backward compatibility with Clink v0.4.x.
### v1.1.13
- Fixed `clink.arg.register_parser` backward compatibility.
### v1.1.12
- Added `clink.ondisplaymatches()` as a replacement for the deprecated `clink.match_display_filter`. The new API is able to support popup list windows as well.
- Speculative possible fix for [#35](https://github.com/chrisant996/clink/issues/35) Crash when clink on clink.bat.
- Fixed [#33](https://github.com/chrisant996/clink/issues/33); Tab autocomplete, auto-quoting paths doesn't seem to work as in Clink 0.4.9.
### v1.1.11
- Changed to load Lua scripts only once per session, unless forced to reload them. This enables backward compatibility for things like [z.lua](https://github.com/skywind3000/z.lua) which has certain features that rely on Clink only loading scripts once per session.
- Added `clink.onbeginedit()` so scripts can register a callback function to run each time the edit prompt is activated.
- Added `lua.reload_scripts` setting to optionally force reloading Lua scripts each time the edit prompt is activated.
- Added `color.message` setting for the Readline message area color (e.g. the search prompt message or digit argument prompt message, etc).
- Fixed stray sticky `=` appended to completions after typing `set ` and then typing a different command.
### v1.1.10
- Fixed [#32](https://github.com/chrisant996/clink/issues/32); hooking `ReadConsoleW` on Windows 7.
### v1.1.9
- Added backward compatibility for `clink.match_display_filter`. The clink-completions/git.lua script uses it a lot, and that should all be working now.
- `settings.add` adds a color setting when the type is string and the name starts with "color.".
- `settings.get` now has an extra parameter to request the user friendly color name when getting a color setting.
- Added `clink.version_encoded` variable with the Clink version number as _MMmmmpppp_ (e.g. v1.1.9 is `10010009`) to make it easy for scripts to check for feature availability.
- The `clink info` command now shows Lua script paths as well.
- Fixed backward compatibility for loading scripts from the profile directory (if `clink.path` isn't set, then load scripts from the DLL directory and the profile directory).
- Fixed some `color.input` bleed through to other things (introduced in v1.1.5).
- Fixed scroll commands (regression introduced by input line color in v1.1.5).
- Fixed horizontally sorted match display and re-enabled the performance fix from v1.1.4.
- Fixed wildcard evaluation with non-file and non-directory matches (e.g. a branch name `origin/master` accidentally didn't match `or` or `*ma` because of the `/`).
- Fixed sort order of `foo\` vs `foo.bar\` when displaying matches or using the `menu-complete` family of commands.
- Fixed potentially-missing trailing path separator when `menu-complete` completes a directory match (regression introduced by wildcard matching in v1.1.5).
- Other obscure minor fixes.
### v1.1.8
- Fixed file match completions when an argmatcher only generates flag matches.
- Fixed automatic inferring whether Readline should use filename completion and/or display rules (regression introduced by backward compatibility in v1.1.3-alpha).
- Fixed backward compatibility for `clink.find_files()` and `clink.find_dirs()` (regression introduced by performance improvement in v1.1.7).
- Ignore extra arguments after the first one (the performance improvement in v1.1.7 revealed that some scripts call `clink.find_files()` with extra invalid arguments; e.g. clink-completions/modules/matchers.lua).
- Don't append a trailing path separator on directory names returned by these functions (the new `os.globfiles()` and `os.globdirs()` functions do, but the old `clink.find_files()` and `clink.find_dirs()` functions should not).
- Fixed backward compatibility for coloring matches (regression introduced by backward compatibility changes in v1.1.4).
### v1.1.7
- Performance improvement when displaying matches: When enumerating files and dirs, the `os.globfiles` and `os.globdirs` functions have all the info about each file. Now they can return that info in a table. This frees the match display function from needing to do any further file system IO. The performance boost is noticeable.
- Rewrote the color settings: the .fg and .bg sub-settings are gone, and the main setting now uses a more natural syntax (e.g. `clink set color.input bright yellow` or `clink set color.modmark bright cyan on blue`).
- Added "cmd" match type for shell (CMD.EXE) command completions.
- Added VT emulation for the reverse video SGR parameters.
- Fixed tab completion for <code>clink set <em>setting</em></code>, and also handle the new color setting syntax.
- Fixed confusing behavior if multiple scripts try to add settings with the same name (now the first one succeeds and the rest report errors).
### v1.1.6
- Hooked up tilde completion in the `cd`, `md`, and `rd` command argmatchers.
- Hooked up tilde completion with the `exec.enable` setting ("~\pro" matches "C:\Users\myusername\program.exe").
- When `terminal.emulation` is `auto`, now it also detects ANSI{32|64}.DLL just like Clink 0.4.8 did.
### v1.1.5
- The `menu-complete` family of commands now support matching `?` and `*` wildcards when the `match.wild` setting is enabled.
- Added `colour.input` and `colour.modmark` settings for coloring Readline's input line.
- Added `clink.upper()` Lua function, and both `clink.lower()` and `clink.upper()` are properly UTF8 aware now.
- Added `clink-copy-word` command that copies the word at the cursor to the clipboard.
- Added `clink.promptfilter` setting to control whether to filter the prompt with Lua scripts.
- Renamed `terminal.emulate` setting to `terminal.emulation`.
- Improved executable file extension logic to consistently use %PATHEXT% (and efficiently).
- Improved file extension logic (e.g. "file.foo bar" has no extension because of the space).
- Updated arg matcher for `clink` itself (was missing some flags).
- Changed `colour.hidden` setting to not be set by default.
- Fixed [#28](https://github.com/chrisant996/clink/issues/28); Tab completion for "~" does not work.
- Fixed [#25](https://github.com/chrisant996/clink/issues/25); Unicode surrogate pairs (and emoji) input isn't working -- Microsoft Terminal renders the text correctly, but ConEmu and the default conhost still don't (and that isn't a Clink issue).
- Fixed screen size bug in Readline on Windows.
- Fixed the backwards values in the `terminal.emulation` setting.
- Fixed `....` so it works properly again.
- Fixed case sensitive sorting of matches.
- Fixed script error when %PATHEXT% is empty.
- Fixed the `exec.cwd` Clink setting to default to true, so that the default behavior is consistent with how v0.4.x behaved.
- Fixed the `cd`, `md`, `rd`, etc argmatchers to only match one argument to be consistent with the actual command syntax.
### v1.1.4
- Automatically detect when running inside ConEmu and disable Clink's Virtual Terminal emulation.
- Added `search-ignore-case` inputrc variable that makes the history search commands case insensitive.
- Suppress adding a space after completing a flag match that ends with `:` or `=` (e.g. `msbuild -maxCpuCount:`).
- Report any errors while loading Lua scripts.
- Report an error if a Lua script tries to add a flag string that begins with a letter.
- Fixed slow printing of possible matches. Readline is inefficient about emitting output, so Clink supplies a custom implementation.
- Fixed some bugs in auto detection of flag prefix characters.
- Fixed backward compatibility for flags, and for args when merging two parsers by calling `clink.arg.register_parser('foo')` multiple times for the same command string.
- Fixed truncated message when the last line of a prompt exceeds 128 characters.
- Fixed abort (<kbd>Ctrl</kbd>+<kbd>G</kbd> or <kbd>Esc</kbd>) in non-incremental history search mode.
- Fixed saved values for settings added by Lua scripts; now the saved value is available to the script immediately on adding the setting, and saved values are retained even if the setting isn't always added by the script.
- Fixed (and documented) shorthand form for defining an argmatcher.
- Fixed length of colored match prefix after a path separator.
- Fixed normalizing a slash by itself (`command /` mustn't become `command \` since that can interfere with completing flags).
- Fixed the `completion-auto-query-items` inputrc variable.
- Fixed the key binding list to correctly respect `completion-display-width`.
- _No visible effect yet: internal change that parses the input line to identify colors to use for each word (command, argument, flag, etc), but the colors aren't yet applied to the input line._
### v1.1.3-alpha
- Fixed argmatcher lookup to be more strict, like in Clink 0.4.9 (match exact names, or name plus an extension from %PATHEXT%).
- Backward compatibility:
- Most things should work now.
- Dropping the new Clink on top of the vendor\clink directory in Cmder seems to work -- _but make a backup before you try this at home!_
- API changes:
- Added `log.info()` function.
- Added Clink version numbers in `clink.version_major`, etc.
- Added `_argmatcher:getwordbreakinfo()` callback; removed `_argmatcher:setprefixincluded()` (it was a mess, and it was new to v1.x, so there's no compatibility concern with removing it).
- Deprecated `_argmatcher:setflagprefix()`; now it happens automagically when using `_argmatcher:addflags()`.
- Introduced several deprecated functions to support backward compatibility.
- Improvements to Lua debugger:
- Added `lua.traceback_on_error`, `lua.break_on_error`, and `lua.break_on_traceback` settings to make debugging script errors easier.
- Made `pause()` consistent about pausing in the caller (rather than sometimes inside the pause command itself).
- The debugger automatically shows the stack trace when entering debug mode, and on every pause.
- Show 3 lines of source context by default.
- The help list is sorted now.
- Fixed the `set` command in the debugger to behave as documented.
### v1.1.2-alpha
- Documentation is mostly updated; just the argmatcher Lua API and Clink command line options are left to be documented.
- Added `history.max_lines` setting that controls how many lines of command history to save (1 to 50000, default is 2500).
- Added `readline.hide_stderr` setting that can suppress stderr output from the Readline library.
- For backward compatibility with 0.4.8, `clink_inputrc` files are loaded as well.
- Lua script API changes:
- `addmatch()` in Lua scripts takes an optional match type argument.
- Removed `displayable`, `aux`, and `suffix` fields in matches.
- Revert the change to disallow mixing file/directory/symlink with other match types (it broke the tests and certain completion scenarios).
- Fixed issues:
- [#18](https://github.com/chrisant996/clink/issues/18) alt+digit then alt+ctrl+y isn't working.
- [#17](https://github.com/chrisant996/clink/issues/17) arrow keys don't exit `reverse-search-history` like in bash.
- [#16](https://github.com/chrisant996/clink/issues/16) problems with $T in doskey macros.
- [#13](https://github.com/chrisant996/clink/issues/13) `clink history delete <n>` returns a CRT error.
- Other fixes:
- There should be no more problems running on Windows Insider builds because Clink now uses [Detours](https://github.com/microsoft/detours) for hooking APIs.
- Fixed crash in `insert-completions` due to heap failure (introduced by the performance changes for displaying matches).
- Fixed `clink` and `history` built-in aliases (solve glitchy path problem).
- Fixed scrolling to top of screen buffer.
- Fixed env var and `set` completions.
- Fixed `tilde-expand` for quoted text.
- Fixed <kbd>Esc</kbd> in Readline's digit argument input mode (it doesn't try to cancel the mode, because that's not how Readline is documented to work).
- Fixed exit code from some `clink` command line options.
- Set locale to UTF8 much earlier to avoid quirky behavior early in script processing.
### v1.1.1-alpha
- Exclusively use Readline's completion implementation. This (with fixes and enhancements in Readline itself) makes the completion experience much nicer and more sophisticated, and removes a lot of code that was added in v1.0.0a0.
- Exclusively use Readline's key binding implementation. This makes it possible to have a single consistent way to set key bindings (inputrc) and for `clink-show-help` to list all key bindings, and removes a lot of code that was added in v1.0.0a0.
- Converted all of Clink's internal key behaviors to be implemented as commands that can be bound in the inputrc file.
- Rewrote and refactored the pagination routine to be used in multiple places.
- Fixed prompt filtering to correctly use the specified priority order.
- Readline library:
- Updated the Readline library from v6.2 to v8.0. This picked up lots of bug fixes and new capabilities (for example colored completions).
- Changed Readline to support backslash as a path separator.
- The pager prompt in Readline is optionally colored, controlled by the `colour.interact` Clink setting.
- Added `completion-auto-query-items` config variable (on by default) which asks whether to list possible matches when the number of lines listed will fill one screen page.
- Added `history-point-at-end-of-anchored-search` config variable in inputrc to make the cursor point behave like 4Dos/4NT/TakeCommand when searching forward and backward through command history.
- Fixed prev history at top of history.
- Fixed to get the current values of environment variables when needed, rather than always getting the value from whenever Clink was started.
- Fixed coloring directory completions.
- Fixed `menu-complete` for `\dir` and `.` and `..`.
- Fixed slow performance when displaying matches. Readline was calling stat() at least once per match (!!). A new match type field enables faster performance, coloring readonly and hidden file matches, applying filename completion rules only to filenames (vs branch names or other text strings), correct match de-duplication, and more. The Lua match APIs can supply the new match type.
- Fixed inserting a completion to happen as a single undo group.
- Fixed tilde to map to `%USERPROFILE%` instead of `%APPDATA%` on Windows.
- Typing a directory by itself uses `cd /d` to change to the directory:
- Typing a directory with a trailing path separator changes to the directory.
- Typing `..\` changes to the parent directory.
- Typing `...` or `....` etc moves up an extra parent directory level for each extra dot (2 dots move up one parent, 3 dots moves up two parents, etc). A trailing path separator is optional when there are more than 2 dots.
- Typing `-` or `cd -` or `chdir -` changes to the previous directory.
- Commands that are new, enhanced, or fixed:
- Added `add-history` and `remove-history` commands (similar to 4Dos/4NT/TakeCommand).
- Got the `menu-complete`, `menu-complete-backward`, and `old-menu-complete` commands working (they never worked properly before in Clink).
- Also added a corresponding `old-menu-complete-backward` command for reverse order.
- All of the `*-menu-complete-*` commands support wildcards (`*` and `?`).
- Added `clink-show-help` command (<kbd>Alt</kbd>+<kbd>H</kbd>). The help now lists _**all**_ key bindings, and it shows user-friendly key names (like `A-Up` or `C-x,C-r` or `C-S-PgUp` or `A-C-S-F3`).
- Added `clink-popup-completions` command that shows a popup window listing possible completions. <kbd>Enter</kbd> inserts the highlighted completion.
- Added `clink-popup-directories` command that shows a popup window listing recent directories. <kbd>Enter</kbd> changes to the highlighted directory, or <kbd>Shift</kbd>+<kbd>Enter</kbd> inserts the highlighted directory in the editing line (or <kbd>Ctrl</kbd>+<kbd>Enter</kbd>).
- Added `clink-popup-history` command that shows a popup window listing command history. <kbd>Enter</kbd> executes the highlighted command, or <kbd>Shift</kbd>+<kbd>Enter</kbd> jumps to the highlighted command in the history (or <kbd>Ctrl</kbd>+<kbd>Enter</kbd>).
- Added `clink-scroll-lineup`, `clink-scroll-linedown`, `clink-scroll-page-up`, `clink-scroll-page-down`, `clink-scroll-top`, and `clink-scroll-bottom` commands that do what it looks like they'd do and are bound to the keys it looks like they'd be.
- Added `clink-expand-doskey` command (<kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>f</kbd>) that expands the current line according to the current doskey aliases.
- Added `clink-expand-env-var` command (<kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>e</kbd>) that expands the environment variable at the cursor point.
- Added `clink-exit` command (<kbd>Alt</kbd>+<kbd>F4</kbd>) that exits CMD.
- Fixed keyboard input issues:
- <kbd>Esc</kbd> is a bindable key now (`\e[27;27~`).
- Added more bindable key combinations (run `clink echo` then press keys to see the key sequence to use in the inputrc file).
- <kbd>Ctrl</kbd>+<kbd>@</kbd> (NUL) didn't work.
- <kbd>Ins</kbd> toggles insert/overwrite mode.
- Unbound keys are ignored now, instead of inserting gibberish characters (part of the terminal internal key sequence).
- Fixed input handling so the `quoted-insert` command can work properly.
- Fixed <kbd>Esc</kbd> while searching.
- Fixed vi mode (was working in v0.4.9, but not in v1.0.x).
- Fixed command history issues:
- The `dont_add_to_history_cmds` Clink setting is a space-delimited list of commands to not add to history.
- Fixed bleeding between history banks.
- Fixed uninitialized variable that made history updates intermittently do nothing or corrupt the other history bank.
- Fixed output from `clink history` to convert to UTF16 when writing to the console (but write UTF8 when output is redirected).
- Fixed terminal output issues:
- Added `terminal.emulate` Clink setting that controls whether Clink does VT emulation or passes all ANSI escape codes directly to the console host. For example, this lets the prompt and completion coloring take advantage of more sophisticated ANSI escape codes such as XTerm 256 color and 16 bit color support.
- Added back support for the `prefer-visible-bell` config variable.
- Fixed underline support.
- Fixed handling for UTF8 output from Readline.
- Fixed invisible cursor point in Lua debugger.
- Completions:
- Added `match.sort_dirs` Clink setting that specifies where to sort directories in the list of possible completions: before files, mixed in with files, or after files.
- Don't attempt completing incomplete UNC paths: at least the `\\server\share\` path components are required (for anything shorter the OS APIs are guaranteed to fail, but will fail slowly).
- Fixed sorting to use Unicode aware locale based sorting (like Windows does) instead of dumb UTF8 byte comparisons.
- Fixed arbitrary limit on completions (had been limited to 64KB worth of completions).
- Fixed quoting spaces in completions.
- Fixed to use the same list as CMD for characters that require quoting.
- Fixed normalizing UNC paths.
- Fixed volume relative completions (e.g. `x:foo`).
- Disallow mixing file/directory/symlink with other match types. This was to avoid a confusing/malfunctioning case in match display and prefix highlighting.
- Fixed UTF8 encoding in various Lua functions.
- Fixed printing stderr output from Readline, Lua, and Clink.
- Fixed crashes and other failures when starting Clink in 32 bit CMD.
- Fixed some memory leaks that accumulated with each new line of input.
- Fixed prompt filtering API to be backward compatible with v0.4.9 scripts.
- Fixed Lua errors from `clink set` (it neglected to fully initialize Clink's Lua integration before loading Lua scripts).
- Fixed UTF8 conversion bug that could truncate a string without fully converting it.
- Fixed serious rampant memory corruption bug in v1.0.x (not present in v0.4.9), which had been causing intermittent malfunctions and data corruption and crashes.
- Fixed multi-line doskey macros to show the prompt in between lines, like CMD does.
- Removed the 4096 byte limit on input.
- Renamed the Clink DLL back to what it was in v0.4.x, to fix compile time problems.
- Other fixed issues:
- [mridgers #544](https://github.com/mridgers/clink/issues/544) Clink v1.0.0.a1 doesn't support cyrillic characters keyboard input on Windows 10 with console V2.
- [mridgers #543](https://github.com/mridgers/clink/issues/543) Not compatible with Windows Insider Build 20150.
- [mridgers #537](https://github.com/mridgers/clink/issues/537) Clink breaks the CMDS tool.
- [mridgers #520](https://github.com/mridgers/clink/issues/520) Clink 1.0.0.a1 - `clink set history_io 1` Error.
- [mridgers #519](https://github.com/mridgers/clink/issues/519) Clink v1.0.0.a1 - `-s|--scripts [path]` command line arg removed?
- [mridgers #516](https://github.com/mridgers/clink/issues/516) Doskey $T not handled properly.
- [mridgers #512](https://github.com/mridgers/clink/issues/512) Command history missing in .history.
- [mridgers #503](https://github.com/mridgers/clink/issues/503) Keyboard shortcut for scrolling.
- [mridgers #501](https://github.com/mridgers/clink/issues/501) <kbd>Ctrl</kbd>+<kbd>Backspace</kbd> works now.
- [mridgers #487](https://github.com/mridgers/clink/issues/487) Clink breaks ConEmu-specific Escape codes.
- [mridgers #480](https://github.com/mridgers/clink/issues/480) History never saved.
- [mridgers #465](https://github.com/mridgers/clink/issues/465) Using LuaJIT (FFI).
- [mridgers #456](https://github.com/mridgers/clink/issues/456) Clear-screen not working properly when PROMPT is two lines long.
- [mridgers #453](https://github.com/mridgers/clink/issues/453) Wrong cursor position when a line contains non-printable characters.
- [mridgers #442](https://github.com/mridgers/clink/issues/442) Unable to paste more than 1024 characters using <kbd>Ctrl</kbd>+<kbd>V</kbd>.
- [mridgers #422](https://github.com/mridgers/clink/issues/422) Problem with filename modifiers.
- [mridgers #420](https://github.com/mridgers/clink/issues/420) Use NtSuspendProcess instead of CreateToolhelp32Snapshot to freeze the threads.
- [mridgers #372](https://github.com/mridgers/clink/issues/372) Provide a way to select a previous directory.
- [mridgers #365](https://github.com/mridgers/clink/issues/365) history-search behavior.
- [mridgers #342](https://github.com/mridgers/clink/issues/342) Clink_inputrc not being processed if it the clink_inputrc is a link (created via mklink).
- Fixed many other bugs.
## Releases from [mridgers/clink](https://github.com/mridgers/clink) original repo
### v1.0.0a1 _(alpha test release)_
- Improve terminal integration with the Readline library.
- Internal improvements to the built-in ecma48 terminal emulator.
- Fixed use after free in Doskey emulation.
- Fixed dash-dash flag completion.
- Search ancestors for a compatible target process (for when cmd.exe starts another process that subsequently starts clink; especially useful during development).
- Use clink/terminal's wcwidth() implementation.
- screen_buffer::set_cursor() should be relative to the visible area.
- Try to adjust the cursor position better when resizing the terminal.
- Some internal Lua functions needed the unquoted clink exe path.
- The origin path now affects the hash in the dll cache, to guard against directory moves.
- More code reorganization.
### v1.0.0a0 _(alpha test release)_
- Extensive code reorganization, refactoring, and rewriting -- multiple times -- almost everything was touched.
- OS integration:
- Fixed Doskey macros on Win8, and on Win10.
- Fixed `clink_x??.exe` startup stall on Windows 10.
- Removed XP support. It doesn't load DLLs like Clink uses them.
- Removed Powershell support.
- Readline integration:
- Search for multiple places for [.|_]inputrc (fixes [mridgers #258](https://github.com/mridgers/clink/issues/258)).
- Disabled Readline's completion code, and only use the clink alternative code.
- Removed redundant slash translation and shims to make it happen.
- Removed control of Readline's suffix appending and disabled it.
- `clink` commands and flags:
- Changed `--cfgdir` to `--profile`, it's no longer required, and added help about it.
- Added a `--version` option to print Clink's version.
- Added `clink info` to print information about Clink.
- Added `clink echo` command to echo input key sequences to stdout.
- Added `clink history` command (fixes [mridgers #172](https://github.com/mridgers/clink/issues/172)).
- Added `history` as an alias for `clink history`.
- Added internal `--list` flag to `clink set` for match generation.
- Removed `--scripts` argument (fixes [mridgers #206](https://github.com/mridgers/clink/issues/206)).
- Updated `clink autorun` command's help text.
- Lua scripts:
- Prefer `userprofile` over other standard environment variables for where to look for lua scripts.
- New API for argument style completion scripts.
- Refactored prompt filtering, and introduced new prompt filtering API.
- Refactored generating matches, and introduced new match generator API.
- Removed built in completions scripts for git, go, hg, and p4. There's better ones.
- Renamed many of clink's Lua functions.
- Moved functions from `clink` to `os` in Lua.
- Removed `clink.is_match()` in Lua; don't presume anything on anyone's behalf about matches.
- Added some current dir functions in Lua.
- Added some env/dir functions in Lua.
- Exposed path manipulation functions to Lua.
- Embed the core Lua scripts instead of loading them from files.
- Terminal IO:
- Added a module for scrolling the screen.
- Rewrote the terminal emulation module, and all Readline IO goes through it.
- Use VT220-style control codes for special keys.
- If <kbd>Alt</kbd> is pressed send ESC in the input stream rather than setting meta bit.
- Replaced wcwidth() with a more complete and correct version.
- Settings:
- Added `clink_path` setting for where to look for lua scripts.
- Added `match.ignore_case` setting.
- Added `files.unc_paths` setting for optional matching from UNC paths.
- Added a setting to skip adding lines that start with `history`.
- Removed `esc_clears_line` setting.
- Pasting CRLFs doesn't really make sense.
- Don't write out settings that are set to default.
- Make sure <kbd>Ctrl</kbd>-<kbd>C</kbd> doesn't modify history.
- Make a cached copy of Clink's DLL when injecting so as to not lock the master.
- Guard against Readline's writes to stderr.
- Remove `clink_inputrc_base` file and embed its content (fixes [mridgers #257](https://github.com/mridgers/clink/issues/257)).
- Include more metadata in the Clink's executables.
### v0.4.9
- Fixed broken Doskey on Win10 (#438, #451)
##### v0.4.8
### v0.4.8
- Environment variable 'clink_profile' overrides Clink's profile path (#390).
- Environment variable `clink_profile` overrides Clink's profile path (#390).
- Load a clink_inputrc file from Clink's profile directory (fixes #406).
- Bug fixes;
- Redraw issues when prompts end in OSC ANSI codes (#387, #384).
- Fixed 'clink autorun --help' crash.
- Fixed `clink autorun --help` crash.
##### v0.4.7
### v0.4.7
- Bug fixes;
- Sometimes autorun tries to run clink.exe (#374).
- Autorun would cause cmd.exe to return an error if it wasn't interactive (#373).
##### v0.4.6
### v0.4.6
- HOME is only set if it is currently unset.
- Readline can be initialised with .inputrc and _inputrc files too (#258).
- Bug fixes;
- Executable completion;
- Paths from PATH were checked twice.
- Incorrect results were returned for words ending in '.' or '-'.
- Incorrect results were returned for words ending in `.` or `-`.
- Directories . and .. were incorrectly displayed.
- Fixed a crash if .bat script's stdout is redirected (#366).
- Occasional crash when injecting Clink (#351).
@@ -35,26 +700,26 @@
- Double display of multi-line prompts when resizing the terminal (#352).
- Very rare wrap artefacts when making the terminal window larger.
- Doskey emulation (#344).
- Improved 'clink autorun' help (#348).
- Improved `clink autorun` help (#348).
- Fixed launching Clink when clink.bat is renamed (#357).
##### v0.4.5
### v0.4.5
- Improved 'clink autorun'. It now defaults to the Current User registry hive.
- 'clink set' gives more details for enumeration-type settings.
- Improved `clink autorun`. It now defaults to the Current User registry hive.
- `clink set` gives more details for enumeration-type settings.
- Tab completion for p4vc.
- New settings 'history_expand_mode' to control history expansion in quotes (#317).
- New settings `history_expand_mode` to control history expansion in quotes (#317).
- Bug fixes;
- Use full width of the terminal (#337).
- Fixed MinGW compile error (#335).
- Autorun now defaults to the current user's hive (#332).
- Creating clink.html no longer needs Pandoc, plus it looks a bit better (#331).
- Added settings to control history expansion (#326).
- Correct fallback when 'use_altgr_substitute' is off (#325).
- Correct fallback when `use_altgr_substitute` is off (#325).
- Load history prior to saving it on shutdown (#318).
- Added Shift-Tab documentation and menu completion example (#190).
- Added shim for backwards menu completion (#190).
- Input handling now outputs '\e`Z' for Shift-Tab (#190).
- Input handling now outputs <code>\e`Z</code> for <kbd>Shift</kbd>-<kbd>Tab</kbd> (#190).
- Updated Readme with current Premake info (#310).
- Guard against there being no buffer to read from (#304).
- Fixed artefacts when resizing conhost's buffer (#139).
@@ -63,36 +728,36 @@
- Fixed leaking exception filters.
- Clearing the screen doesn't leave artefacts behind.
##### v0.4.4
### v0.4.4
- Completing .. behaves more like Bash (#277).
- Escape from yes/no question when Ctrl+C is pressed.
- Escape from yes/no question when <kbd>Ctrl</kbd>+<kbd>C</kbd> is pressed.
- Valid XP executables (#278, #289).
- Fixed n-th argument yank not working as expected (#254).
- Fixed prompt colours sometimes not working (#279, #286).
- Fixed '!0' causing Clink to crash.
- Fixed `!0` causing Clink to crash.
- Save/restore cursor position in case Readline moves it.
##### v0.4.3
### v0.4.3
- Localised Y/N when auto-answering 'terminate?' prompt.
- $* would early out if there was no arguments.
- Localised Y/N when auto-answering "terminate?" prompt.
- `$*` would early out if there was no arguments.
- Disable ANSI code support if third party provides it.
- Installer can now set %CLINK_DIR% to install location.
- Improved output from 'clink set'.
- Improved output from `clink set`.
- Support for Windows 10 Technical Preview.
- Ctrl-L now scrolls last line to the top of the window rather than clearing.
- <kbd>Ctrl</kbd>-<kbd>L</kbd> now scrolls last line to the top of the window rather than clearing.
- New option to control how newline characters are pasted to the line.
- New options to control history;
- 'history_file_lines' - maximum lines saved to disk.
- 'history_ignore_space' - ignore lines prefixed with whitespace.
- 'history_dupe_mode' - how duplicate entries are handled.
- 'history_io' - load/save history from disk every line.
- `history_file_lines` - maximum lines saved to disk.
- `history_ignore_space` - ignore lines prefixed with whitespace.
- `history_dupe_mode` - how duplicate entries are handled.
- `history_io` - load/save history from disk every line.
- Fixed nonfunctional numpad keys.
- Fixed missing WINCH signals if other processes resize the buffer.
- Support Alt codes sent from Conhost.
- Support <kbd>Alt</kbd> codes sent from Conhost.
##### v0.4.2
### v0.4.2
- Prompt colouring no longer requires third party ANSI code utility.
- Override settings with environment variables prefixed with 'clink'.
@@ -100,44 +765,44 @@
- Updated Go completions (by matrixik).
- Arguments to clink.arg.new_parser() now initialise parser's flags/args (from vladimir-kotikov).
- New clink.arg.add_flags() and clink.arg.add_arguments() functions.
- Removed footer and Alt-H tip for more succinct stdout output.
- Removed footer and <kbd>Alt</kbd>-<kbd>H</kbd> tip for more succinct stdout output.
- Bug fixes;
- Windows XP works again.
- Fixed race condition in lua_execute().
##### v0.4.1
### v0.4.1
- Bug fixes;
- Various Unicode fixes causing corrupt environment variables.
- Fixed thread resume/suspend causing rare system-wide deadlock.
- Fixed incorrect translation of suffixed slash when completing flags.
- Add --nolog argument to disable file logging. Fix #187 Fix #154
- Add `--nolog` argument to disable file logging. Fix #187 Fix #154
- Added missing escape sequences from doskey emulation.
- Reinstated unix-kill-line key binding.
- Mapped PgUp/Down to search history using line typed so far.
- Mapped <kbd>PgUp</kbd>/<kbd>Down</kbd> to search history using line typed so far.
- Added documentation covering escape codes for special keys.
- Added support for Windows' AltGr substitute Ctrl-Alt.
- Added support for Windows' <kbd>AltGr</kbd> substitute <kbd>Ctrl</kbd>-<kbd>Alt</kbd>.
- Support for Readline's 'menu' style completion (see docs).
##### v0.4
### v0.4
- New features;
- Better 'clink.arg' API. Easier, more intuitive, and more powerful.
- Better `clink.arg` API. Easier, more intuitive, and more powerful.
- Whitespace prefix skips exec matching.
- Added a 'set' verb to easily change settings from the command line.
- Added a `set` verb to easily change settings from the command line.
- Basic support for a shells other than cmd.exe.
- Completion for Go (contributed by Dobroslaw Zybort).
- Setting 'exec_match_style' to -1 disables it entirely.
- Setting `exec_match_style` to -1 disables it entirely.
- Make history persistence optional.
- Alias/doskey completion.
- Very basic support for Powershell.
- View cmd.exe's autorun entry without needing admin rights.
- New key bindings;
- Ctrl-Alt-C : Copy command line to the clipboard.
- Ctrl-Alt-E : Expand environment variable under cursor.
- Ctrl-Alt-U : 'up directory' (formerly Shift-Up).
- Ctrl-U : Adds '..\' to the command line.
- Alt-H : Shows active keymap's key bindings.
- <kbd>Ctrl</kbd>-<kbd>Alt</kbd>-<kbd>C</kbd> : Copy command line to the clipboard.
- <kbd>Ctrl</kbd>-<kbd>Alt</kbd>-<kbd>E</kbd> : Expand environment variable under cursor.
- <kbd>Ctrl</kbd>-<kbd>Alt</kbd>-<kbd>U</kbd> : "up directory" (formerly <kbd>Shift</kbd>-<kbd>Up</kbd>).
- <kbd>Ctrl</kbd>-<kbd>U</kbd> : Adds `..\` to the command line.
- <kbd>Alt</kbd>-<kbd>H</kbd> : Shows active keymap's key bindings.
- New Lua functions;
- clink.execute().
- clink.get_host_process().
@@ -146,18 +811,18 @@
- clink.get_console_aliases().
- Lots of bug fixes, including;
- Better command extraction.
- Fixed cmd.exe command paging and Ctrl-C/Ctrl-Break handling.
- Fixed cmd.exe command paging and <kbd>Ctrl</kbd>-<kbd>C</kbd>/<kbd>Ctrl</kbd>-<kbd>Break</kbd> handling.
- Multiple locale fixes.
- Use localised text for 'Terminate batch job?' prompt.
- Use localised text for "Terminate batch job?" prompt.
##### v0.3
### v0.3
- Automatic answering of cmd.exe's 'Terminate batch script?' prompt.
- Automatic answering of cmd.exe's "Terminate batch script?" prompt.
- Coloured prompts (requires ANSICON or ConEmu).
- Added Shift-Up keyboard shortcut to automatically execute 'cd ..'
- Mapped Ctrl-Z to undo, Microsoft style.
- Added Shift-Up keyboard shortcut to automatically execute `cd ..`
- Mapped <kbd>Ctrl</kbd>-<kbd>Z</kbd> to undo, Microsoft style.
- Improved integration of Readline;
- New input handling code (Ctrl-Alt combos now work).
- New input handling code (<kbd>Ctrl</kbd>-<kbd>Alt</kbd> combos now work).
- An implementation of the Termcap library.
- Fully functional Vi-mode support.
- Support for resizable consoles.
@@ -175,31 +840,31 @@
- clink.get_cwd().
- Functions to query Clink's settings.
- New command line options;
- '--profile <dir>' to override default profile directory.
- '--nohostcheck' disables verification that host is cmd.exe.
- '--pid' specifies the process to inject into.
- <code>--profile <span class="arg">dir</span></code> to override default profile directory.
- `--nohostcheck` disables verification that host is cmd.exe.
- `--pid` specifies the process to inject into.
- Update Mercurial completion (issue 73).
- Start menu shortcut starts in USERPROFILE, like cmd.exe
- Zip distribution is now portable.
##### v0.2.1
### v0.2.1
- The .history file now merges multiple sessions together.
- Fixed missing y/n, pause, and other prompts.
- Fixed segfault in loader executable.
- Better ConEmu compatibility.
##### v0.2
### v0.2
- Basic argument completion for 'git', 'hg', 'svn', and 'p4'.
- Traditional Bash clear screen ('Ctrl-L') and exit shortcuts ('Ctrl-D').
- Scrollable command window using 'PgUp'/'PgDown' keys.
- Basic argument completion for `git`, `hg`, `svn`, and `p4`.
- Traditional Bash clear screen (<kbd>Ctrl</kbd>-<kbd>L</kbd>) and exit shortcuts (<kbd>Ctrl</kbd>-<kbd>D</kbd>).
- Scrollable command window using <kbd>PgUp</kbd>/<kbd>PgDown</kbd> keys.
- Doskey support.
- Automatic quoting of file names with spaces.
- Scriptable custom prompts.
- New argument framework to ease writing context-sensitive match generators.
- History and log file is now saved per-user rather than globally.
- Improved Clink's command line interface ('clink --help').
- Improved Clink's command line interface (`clink --help`).
- More reliable handling of cmd.exe's autorun entry.
- General improvements to executable and directory-command completion.
- Symbolic link support.
@@ -208,12 +873,16 @@
- Improved hooking so Clink can be shared with other thirdparty utilities that
also hook cmd.exe (ConEmu, ANSICon, etc.).
##### v0.1.1
### v0.1.1
- Fixed AltGr+<key> on international keyboards.
- Fixed broken completion when directories have a '-' in their name (Mark Hammond)
- Fixed <kbd>AltGr</kbd>+<kbd>&lt;key&gt;</kbd> on international keyboards.
- Fixed broken completion when directories have a `-` in their name (Mark Hammond)
- The check for single match scenarios now correctly handles case-insensitivity.
##### v0.1
### v0.1
- Initial release.
<!-- vim: wrap nolist ft=markdown
-->

View File

@@ -1,24 +1,9 @@
:: Copyright (c) 2012 Martin Ridgers
::
:: Permission is hereby granted, free of charge, to any person obtaining a copy
:: of this software and associated documentation files (the "Software"), to deal
:: in the Software without restriction, including without limitation the rights
:: to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
:: copies of the Software, and to permit persons to whom the Software is
:: furnished to do so, subject to the following conditions:
::
:: The above copyright notice and this permission notice shall be included in
:: all copies or substantial portions of the Software.
::
:: THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
:: IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
:: FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
:: AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
:: LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
:: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
:: SOFTWARE.
:: License: http://opensource.org/licenses/MIT
@echo off
set clink_profile_arg=
set clink_quiet_arg=
:: Mimic cmd.exe's behaviour when starting from the start menu.
if /i "%1"=="startmenu" (
@@ -33,6 +18,12 @@ if /i "%1"=="--profile" (
shift /1
)
:: Check for the --quiet option.
if /i "%1"=="--quiet" (
set clink_quiet_arg= --quiet
shift /1
)
:: If the .bat is run without any arguments, then start a cmd.exe instance.
if "%1"=="" (
call :launch
@@ -52,9 +43,10 @@ if /i "%processor_architecture%"=="x86" (
:end
set clink_profile_arg=
set clink_quiet_arg=
goto :eof
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:launch
start "Clink" cmd.exe /s /k ""%~dpnx0" inject %clink_profile_arg%"
start "Clink" cmd.exe /s /k ""%~dpnx0" inject %clink_profile_arg%%clink_quiet_arg%"
exit /b 0

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1 +0,0 @@
Ls

View File

@@ -1,116 +0,0 @@
# name: Pressing Ctrl-D exits session
# type: bool
# Ctrl-D exits cmd.exe when it is pressed on an empty line.
ctrld_exits = 1
# name: Toggle if pressing Esc clears line
# type: bool
# Clink clears the current line when Esc is pressed (unless Readline's Vi mode
# is enabled).
esc_clears_line = 1
# name: Match display colour
# type: int
# Colour to use when displaying matches. A value less than 0 will be the
# opposite brightness of the default colour.
match_colour = -1
# name: Executable match style
# type: enum
# 0 = PATH only
# 1 = PATH and CWD
# 2 = PATH, CWD, and directories
# Changes how Clink will match executables when there is no path separator on
# the line. 0 = PATH only, 1 = PATH and CWD, 2 = PATH, CWD, and directories. In
# all cases both executables and directories are matched when there is a path
# separator present. A value of -1 will disable executable matching completely.
exec_match_style = 2
# name: Whitespace prefix matches files
# type: bool
# If the line begins with whitespace then Clink bypasses executable matching and
# will match all files and directories instead.
space_prefix_match_files = 1
# name: Colour of the prompt
# type: int
# Surrounds the prompt in ANSI escape codes to set the prompt's colour. Disabled
# when the value is less than 0.
prompt_colour = -1
# name: Auto-answer terminate prompt
# type: enum
# 0 = Disabled
# 1 = Answer 'Y'
# 2 = Answer 'N'
# Automatically answers cmd.exe's 'Terminate batch job (Y/N)?' prompts. 0 =
# disabled, 1 = answer 'Y', 2 = answer 'N'.
terminate_autoanswer = 0
# name: Lines of history saved to disk
# type: int
# When set to a positive integer this is the number of lines of history that
# will persist when Clink saves the command history to disk. Use 0 for infinite
# lines and <0 to disable history persistence.
history_file_lines = 10000
# name: Skip adding lines prefixed with whitespace
# type: bool
# Ignore lines that begin with whitespace when adding lines in to the history.
history_ignore_space = 0
# name: Controls how duplicate entries are handled
# type: enum
# 0 = Always add
# 1 = Ignore
# 2 = Erase previous
# If a line is a duplicate of an existing history entry Clink will erase the
# duplicate when this is set 2. A value of 1 will not add duplicates to the
# history and a value of 0 will always add lines. Note that history is not
# deduplicated when reading/writing to disk.
history_dupe_mode = 2
# name: Read/write history file each line edited
# type: bool
# When non-zero the history will be read from disk before editing a new line and
# written to disk afterwards.
history_io = 0
# name: Sets how command history expansion is applied
# type: enum
# 0 = Off
# 1 = On
# 2 = Not in single quotes
# 3 = Not in double quote
# 4 = Not in any quotes
# The '!' character in an entered line can be interpreted to introduce words
# from the history. This can be enabled and disable by setting this value to 1
# or 0. Values or 2, 3 or 4 will skip any ! character quoted in single, double,
# or both quotes respectively.
history_expand_mode = 4
# name: Support Windows' Ctrl-Alt substitute for AltGr
# type: bool
# Windows provides Ctrl-Alt as a substitute for AltGr, historically to support
# keyboards with no AltGr key. This may collide with some of Readline's
# bindings.
use_altgr_substitute = 1
# name: Strips CR and LF chars on paste
# type: enum
# 0 = Paste unchanged
# 1 = Strip
# 2 = As space
# Setting this to a value >0 will make Clink strip CR and LF characters from
# text pasted into the current line. Set this to 1 to strip all newline
# characters and 2 to replace them with a space.
strip_crlf_on_paste = 2
# name: Enables basic ANSI escape code support
# type: bool
# When printing the prompt, Clink has basic built-in support for SGR ANSI escape
# codes to control the text colours. This is automatically disabled if a third
# party tool is detected that also provides this facility. It can also be
# disabled by setting this to 0.
ansi_code_support = 1

Binary file not shown.

Binary file not shown.

View File

@@ -1,40 +1,39 @@
{
"devDependencies": {
"@fortawesome/fontawesome-free": "^5.15.3",
"@sentry/cli": "^1.63.1",
"@sentry/electron": "^2.4.0",
"@sentry/cli": "^1.64.2",
"@sentry/electron": "^2.4.1",
"@terminus-term/to-string-loader": "1.1.7-beta.1",
"@types/electron-config": "^3.2.2",
"@types/electron-debug": "^2.1.0",
"@types/fs-extra": "^9.0.9",
"@types/js-yaml": "^4.0.0",
"@types/node": "14.14.35",
"@types/fs-extra": "^9.0.11",
"@types/js-yaml": "^4.0.1",
"@types/node": "15.6.1",
"@types/webpack-env": "^1.16.0",
"@typescript-eslint/eslint-plugin": "^4.14.1",
"@typescript-eslint/parser": "^4.17.0",
"@typescript-eslint/eslint-plugin": "^4.25.0",
"@typescript-eslint/parser": "^4.26.0",
"apply-loader": "2.0.0",
"awesome-typescript-loader": "^5.2.1",
"compare-versions": "^3.6.0",
"core-js": "^3.9.1",
"core-js": "^3.14.0",
"cross-env": "7.0.3",
"css-loader": "5.2.0",
"electron": "12.0.4",
"css-loader": "5.2.6",
"electron": "13.1.1",
"electron-builder": "22.10.5",
"electron-download": "^4.1.1",
"electron-installer-snap": "^5.1.0",
"electron-notarize": "^1.0.0",
"electron-rebuild": "^2.3.5",
"eslint": "^7.18.0",
"eslint-plugin-import": "^2.21.1",
"eslint": "^7.27.0",
"eslint-plugin-import": "^2.23.4",
"file-loader": "^6.2.0",
"graceful-fs": "^4.2.6",
"html-loader": "2.1.2",
"json-loader": "0.5.7",
"lru-cache": "^6.0.0",
"macos-release": "^2.4.1",
"node-abi": "^2.21.0",
"node-gyp": "^7.1.2",
"node-sass": "^5.0.0",
"node-abi": "^2.30.0",
"node-sass": "^6.0.0",
"npmlog": "4.1.2",
"npx": "^10.2.2",
"patch-package": "^6.4.7",
@@ -44,37 +43,38 @@
"pug-loader": "^2.4.0",
"pug-static-loader": "2.0.0",
"raw-loader": "4.0.2",
"sass-loader": "^11.0.1",
"sass-loader": "^12.0.0",
"shelljs": "0.8.4",
"source-code-pro": "^2.30.2",
"source-code-pro": "^2.38.0",
"source-sans-pro": "3.6.0",
"ssh2-streams": "^0.4.10",
"style-loader": "^2.0.0",
"svg-inline-loader": "^0.8.2",
"tslib": "^2.1.0",
"typedoc": "^0.20.32",
"typescript": "^3.9.9",
"tslib": "^2.2.0",
"typedoc": "^0.20.36",
"typescript": "^4.2.4",
"url-loader": "^4.1.1",
"val-loader": "3.1.0",
"webpack": "^5.31.0",
"webpack-bundle-analyzer": "^4.4.0",
"webpack-cli": "^4.6.0",
"val-loader": "4.0.0",
"webpack": "^5.38.1",
"webpack-bundle-analyzer": "^4.4.2",
"webpack-cli": "^4.7.0",
"yaml-loader": "0.6.0"
},
"resolutions": {
"*/node-abi": "^2.20.0",
"*/node-abi": "^2.30.0",
"**/graceful-fs": "^4.2.4"
},
"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 && webpack --color --config terminus-serial/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-local/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 && webpack --color --config terminus-electron/webpack.config.js && webpack --color --config terminus-web/webpack.config.js",
"build:web": "webpack --color --config web/webpack.config.js",
"build:typings": "node scripts/build-typings.js",
"watch": "cross-env TERMINUS_DEV=1 webpack --progress --color --watch",
"start": "cross-env TERMINUS_DEV=1 electron app --debug --inspect",
"start:prod": "electron app --debug",
"prod": "cross-env TERMINUS_DEV=1 electron app",
"docs": "typedoc --out docs/api --tsconfig terminus-core/src/tsconfig.typings.json terminus-core/src/index.ts && typedoc --out docs/api/terminal --tsconfig terminus-terminal/tsconfig.typings.json terminus-terminal/src/index.ts && typedoc --out docs/api/settings --tsconfig terminus-settings/tsconfig.typings.json terminus-settings/src/index.ts",
"docs": "typedoc --out docs/api --tsconfig terminus-core/src/tsconfig.typings.json terminus-core/src/index.ts && typedoc --out docs/api/terminal --tsconfig terminus-terminal/tsconfig.typings.json terminus-terminal/src/index.ts && typedoc --out docs/api/local --tsconfig terminus-local/tsconfig.typings.json terminus-local/src/index.ts && typedoc --out docs/api/settings --tsconfig terminus-settings/tsconfig.typings.json terminus-settings/src/index.ts",
"lint": "eslint --ext ts */src */lib",
"postinstall": "node ./scripts/install-deps.js"
"postinstall": "node ./scripts/install-deps.js",
"patch": "patch-package; cd web; patch-package"
},
"private": true
}

View File

@@ -0,0 +1,13 @@
diff --git a/node_modules/app-builder-lib/out/appInfo.js b/node_modules/app-builder-lib/out/appInfo.js
index 25a159e..d8a0262 100644
--- a/node_modules/app-builder-lib/out/appInfo.js
+++ b/node_modules/app-builder-lib/out/appInfo.js
@@ -165,7 +165,7 @@ class AppInfo {
get linuxPackageName() {
const name = this.name; // https://github.com/electron-userland/electron-builder/issues/2963
- return name.startsWith("@") ? this.sanitizedProductName : name;
+ return 'terminus-terminal'
}
get sanitizedName() {

View File

@@ -3,11 +3,10 @@ const builder = require('electron-builder').build
const vars = require('./vars')
const isTag = (process.env.GITHUB_REF || '').startsWith('refs/tags/')
const isCI = !!process.env.GITHUB_REF
builder({
dir: true,
linux: ['deb', 'tar.gz', 'rpm'],
linux: ['deb', 'tar.gz', 'rpm', 'pacman'],
config: {
extraMetadata: {
version: vars.version,

View File

@@ -6,6 +6,12 @@ const isTag = (process.env.GITHUB_REF || '').startsWith('refs/tags/')
process.env.ARCH = process.env.ARCH || process.arch
if (process.env.GITHUB_HEAD_REF) {
delete process.env.CSC_LINK
delete process.env.CSC_KEY_PASSWORD
process.env.CSC_IDENTITY_AUTO_DISCOVERY = 'false'
}
builder({
dir: true,
mac: ['pkg', 'zip'],
@@ -14,6 +20,9 @@ builder({
extraMetadata: {
version: vars.version,
},
mac: {
identity: !process.env.CI || process.env.CSC_LINK ? undefined : null,
},
npmRebuild: process.env.ARCH !== 'arm64',
},
publish: isTag ? 'always' : 'onTag',

View File

@@ -4,7 +4,7 @@ const path = require('path')
const vars = require('./vars')
let lifecycles = []
for (let dir of ['app', 'terminus-core', 'terminus-ssh', 'terminus-terminal']) {
for (let dir of ['app', 'terminus-core', 'terminus-local', 'terminus-ssh', 'terminus-terminal']) {
const build = rebuild({
buildPath: path.resolve(__dirname, '../' + dir),
electronVersion: vars.electronVersion,

View File

@@ -13,6 +13,10 @@ sh.cd('app')
sh.exec(`${npx} yarn install --force`)
sh.cd('..')
sh.cd('web')
sh.exec(`${npx} yarn install --force`)
sh.cd('..')
vars.builtinPlugins.forEach(plugin => {
log.info('deps', plugin)
sh.cd(plugin)

View File

@@ -11,6 +11,9 @@ sh.mkdir('-p', target)
fs.writeFileSync(path.join(target, 'package.json'), '{}')
sh.cd(target)
vars.builtinPlugins.forEach(plugin => {
if (plugin === 'terminus-web') {
return
}
log.info('install', plugin)
sh.cp('-r', path.join('..', plugin), '.')
sh.rm('-rf', path.join(plugin, 'node_modules'))

View File

@@ -3,7 +3,6 @@ const fs = require('fs')
const semver = require('semver')
const childProcess = require('child_process')
const appInfo = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../app/package.json')))
const electronInfo = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../node_modules/electron/package.json')))
exports.version = childProcess.execSync('git describe --tags', {encoding:'utf-8'})
@@ -18,6 +17,9 @@ exports.builtinPlugins = [
'terminus-core',
'terminus-settings',
'terminus-terminal',
'terminus-electron',
'terminus-local',
'terminus-web',
'terminus-community-color-schemes',
'terminus-plugin-manager',
'terminus-ssh',

View File

@@ -0,0 +1,42 @@
! Iceberg
! https://cocopon.github.io/iceberg.vim/
*.foreground: #c6c8d1
*.background: #161821
*.cursorColor: #c6c8d1
!
! Black
*.color0: #1e2132
*.color8: #6b7089
!
! Red
*.color1: #e27878
*.color9: #e98989
!
! Green
*.color2: #b4be82
*.color10: #c0ca8e
!
! Yellow
*.color3: #e2a478
*.color11: #e9b189
!
! Blue
*.color4: #84a0c6
*.color12: #91acd1
!
! Magenta
*.color5: #a093c7
*.color13: #ada0d3
!
! Cyan
*.color6: #89b8c2
*.color14: #95c4ce
!
! White
*.color7: #c6c8d1
*.color15: #d2d4de
!
! Bold, Italic, Underline
*.colorBD: #c6c8d1
!*.colorIT:
!*.colorUL:

View File

@@ -1,7 +1,7 @@
Terminus Core Plugin
--------------------
See also: [Settings plugin API](./settings/), [Terminal plugin API](./terminal/)
See also: [Settings plugin API](./settings/), [Terminal plugin API](./terminal/), [Local terminal API](./local/)
* tabbed interface services
* toolbar UI

View File

@@ -17,24 +17,19 @@
"author": "Eugene Pankov",
"license": "MIT",
"devDependencies": {
"@electron/remote": "^1.0.4",
"@types/js-yaml": "^4.0.0",
"@types/shell-escape": "^0.2.0",
"@types/winston": "^2.3.6",
"axios": "^0.21.1",
"bootstrap": "^4.1.3",
"clone-deep": "^4.0.1",
"core-js": "^3.1.2",
"deep-equal": "^2.0.5",
"deepmerge": "^4.1.1",
"electron-updater": "^4.0.6",
"js-yaml": "^4.0.0",
"mixpanel": "^0.10.2",
"mixpanel": "^0.13.0",
"ng2-dnd": "^5.0.2",
"ngx-perfect-scrollbar": "^10.1.0",
"readable-stream": "2.3.7",
"shell-escape": "^0.2.0",
"uuid": "^8.0.0",
"winston": "^3.3.3"
"readable-stream": "3.6.0",
"uuid": "^8.0.0"
},
"peerDependencies": {
"@angular/animations": "^9.1.9",

View File

@@ -0,0 +1,12 @@
export interface CLIEvent {
argv: any
cwd: string
secondInstance: boolean
}
export abstract class CLIHandler {
priority: number
firstMatchOnly: boolean
abstract handle (event: CLIEvent): Promise<boolean>
}

View File

@@ -0,0 +1,13 @@
import { Injectable } from '@angular/core'
@Injectable({ providedIn: 'root' })
export abstract class FileProvider {
name: string
async isAvailable (): Promise<boolean> {
return true
}
abstract selectAndStoreFile (description: string): Promise<string>
abstract retrieveFile (key: string): Promise<Buffer>
}

View File

@@ -0,0 +1,53 @@
import { Observable, Subject } from 'rxjs'
import { Injector } from '@angular/core'
import { Logger, LogService } from '../services/log.service'
export enum Platform {
Linux = 'Linux',
macOS = 'macOS',
Windows = 'Windows',
Web = 'Web',
}
/**
* Provides interaction with the main process
*/
export abstract class HostAppService {
abstract get platform (): Platform
abstract get configPlatform (): Platform
protected settingsUIRequest = new Subject<void>()
protected configChangeBroadcast = new Subject<void>()
protected logger: Logger
/**
* Fired when Preferences is selected in the macOS menu
*/
get settingsUIRequest$ (): Observable<void> { return this.settingsUIRequest }
/**
* Fired when another window modified the config file
*/
get configChangeBroadcast$ (): Observable<void> { return this.configChangeBroadcast }
constructor (
injector: Injector,
) {
this.logger = injector.get(LogService).create('hostApp')
}
abstract newWindow (): void
/**
* Notifies other windows of config file changes
*/
// eslint-disable-next-line @typescript-eslint/no-empty-function
broadcastConfigChange (_configStore: Record<string, any>): void { }
// eslint-disable-next-line @typescript-eslint/no-empty-function
emitReady (): void { }
abstract relaunch (): void
abstract quit (): void
}

View File

@@ -0,0 +1,35 @@
import { Observable, Subject } from 'rxjs'
export abstract class HostWindowService {
/**
* Fired once the window is visible
*/
get windowShown$ (): Observable<void> { return this.windowShown }
/**
* Fired when the window close button is pressed
*/
get windowCloseRequest$ (): Observable<void> { return this.windowCloseRequest }
get windowMoved$ (): Observable<void> { return this.windowMoved }
get windowFocused$ (): Observable<void> { return this.windowFocused }
protected windowShown = new Subject<void>()
protected windowCloseRequest = new Subject<void>()
protected windowMoved = new Subject<void>()
protected windowFocused = new Subject<void>()
abstract readonly isFullscreen: boolean
abstract reload (): void
abstract setTitle (title?: string): void
abstract toggleFullscreen (): void
abstract minimize (): void
abstract toggleMaximize (): void
abstract close (): void
// eslint-disable-next-line @typescript-eslint/no-empty-function
openDevTools (): void { }
// eslint-disable-next-line @typescript-eslint/no-empty-function
bringToFront (): void { }
}

View File

@@ -1,3 +1,4 @@
export { BaseComponent, SubscriptionContainer } from '../components/base.component'
export { BaseTabComponent, BaseTabProcess } from '../components/baseTab.component'
export { TabHeaderComponent } from '../components/tabHeader.component'
export { SplitTabComponent, SplitContainer } from '../components/splitTab.component'
@@ -8,18 +9,24 @@ export { HotkeyProvider, HotkeyDescription } from './hotkeyProvider'
export { Theme } from './theme'
export { TabContextMenuItemProvider } from './tabContextMenuProvider'
export { SelectorOption } from './selector'
export { CLIHandler, CLIEvent } from './cli'
export { PlatformService, ClipboardContent, MessageBoxResult, MessageBoxOptions, FileDownload, FileUpload, FileTransfer, HTMLFileUpload, FileUploadOptions } from './platform'
export { MenuItemOptions } from './menu'
export { BootstrapData, PluginInfo, BOOTSTRAP_DATA } from './mainProcess'
export { HostWindowService } from './hostWindow'
export { HostAppService, Platform } from './hostApp'
export { FileProvider } from './fileProvider'
export { AppService } from '../services/app.service'
export { ConfigService } from '../services/config.service'
export { DockingService } from '../services/docking.service'
export { ElectronService } from '../services/electron.service'
export { Logger, LogService } from '../services/log.service'
export { DockingService, Screen } from '../services/docking.service'
export { Logger, ConsoleLogger, LogService } from '../services/log.service'
export { HomeBaseService } from '../services/homeBase.service'
export { HotkeysService } from '../services/hotkeys.service'
export { HostAppService, Platform } from '../services/hostApp.service'
export { NotificationsService } from '../services/notifications.service'
export { ShellIntegrationService } from '../services/shellIntegration.service'
export { ThemesService } from '../services/themes.service'
export { TabsService } from '../services/tabs.service'
export { UpdaterService } from '../services/updater.service'
export { VaultService, Vault, VaultSecret, VAULT_SECRET_TYPE_FILE } from '../services/vault.service'
export { FileProvidersService } from '../services/fileProviders.service'
export * from '../utils'

View File

@@ -0,0 +1,22 @@
export const BOOTSTRAP_DATA = 'BOOTSTRAP_DATA'
export interface PluginInfo {
name: string
description: string
packageName: string
isBuiltin: boolean
version: string
author: string
homepage?: string
path?: string
info?: any
}
export interface BootstrapData {
config: Record<string, any>
executable: string
isFirstWindow: boolean
windowID: number
installedPlugins: PluginInfo[]
userPluginsPath: string
}

View File

@@ -0,0 +1,9 @@
export interface MenuItemOptions {
type?: ('normal' | 'separator' | 'submenu' | 'checkbox' | 'radio')
label?: string
sublabel?: string
enabled?: boolean
checked?: boolean
submenu?: MenuItemOptions[]
click?: () => void
}

View File

@@ -0,0 +1,202 @@
import { MenuItemOptions } from './menu'
import { Subject, Observable } from 'rxjs'
/* eslint-disable @typescript-eslint/no-unused-vars */
export interface ClipboardContent {
text: string
html?: string
}
export interface MessageBoxOptions {
type: 'warning'|'error'
message: string
detail?: string
buttons: string[]
defaultId?: number
}
export interface MessageBoxResult {
response: number
}
export abstract class FileTransfer {
abstract getName (): string
abstract getSize (): number
abstract close (): void
getCompletedBytes (): number {
return this.completedBytes
}
isComplete (): boolean {
return this.completedBytes >= this.getSize()
}
isCancelled (): boolean {
return this.cancelled
}
cancel (): void {
this.cancelled = true
this.close()
}
protected increaseProgress (bytes: number): void {
this.completedBytes += bytes
}
private completedBytes = 0
private cancelled = false
}
export abstract class FileDownload extends FileTransfer {
abstract write (buffer: Buffer): Promise<void>
}
export abstract class FileUpload extends FileTransfer {
abstract read (): Promise<Buffer>
async readAll (): Promise<Buffer> {
const buffers: Buffer[] = []
while (true) {
const buf = await this.read()
if (!buf.length) {
break
}
buffers.push(Buffer.from(buf))
}
return Buffer.concat(buffers)
}
}
export interface FileUploadOptions {
multiple: boolean
}
export abstract class PlatformService {
supportsWindowControls = false
get fileTransferStarted$ (): Observable<FileTransfer> { return this.fileTransferStarted }
get displayMetricsChanged$ (): Observable<void> { return this.displayMetricsChanged }
protected fileTransferStarted = new Subject<FileTransfer>()
protected displayMetricsChanged = new Subject<void>()
abstract readClipboard (): string
abstract setClipboard (content: ClipboardContent): void
abstract loadConfig (): Promise<string>
abstract saveConfig (content: string): Promise<void>
abstract startDownload (name: string, size: number): Promise<FileDownload|null>
abstract startUpload (options?: FileUploadOptions): Promise<FileUpload[]>
startUploadFromDragEvent (event: DragEvent, multiple = false): FileUpload[] {
const result: FileUpload[] = []
if (!event.dataTransfer) {
return []
}
// eslint-disable-next-line @typescript-eslint/prefer-for-of
for (let i = 0; i < event.dataTransfer.files.length; i++) {
const file = event.dataTransfer.files[i]
const transfer = new HTMLFileUpload(file)
this.fileTransferStarted.next(transfer)
result.push(transfer)
if (!multiple) {
break
}
}
return result
}
getConfigPath (): string|null {
return null
}
showItemInFolder (path: string): void {
throw new Error('Not implemented')
}
async isProcessRunning (name: string): Promise<boolean> {
return false
}
async installPlugin (name: string, version: string): Promise<void> {
throw new Error('Not implemented')
}
async uninstallPlugin (name: string): Promise<void> {
throw new Error('Not implemented')
}
getWinSCPPath (): string|null {
throw new Error('Not implemented')
}
exec (app: string, argv: string[]): void {
throw new Error('Not implemented')
}
isShellIntegrationSupported (): boolean {
return false
}
async isShellIntegrationInstalled (): Promise<boolean> {
return false
}
async installShellIntegration (): Promise<void> {
throw new Error('Not implemented')
}
async uninstallShellIntegration (): Promise<void> {
throw new Error('Not implemented')
}
openPath (path: string): void {
throw new Error('Not implemented')
}
abstract getOSRelease (): string
abstract getAppVersion (): string
abstract openExternal (url: string): void
abstract listFonts (): Promise<string[]>
abstract setErrorHandler (handler: (_: any) => void): void
abstract popupContextMenu (menu: MenuItemOptions[], event?: MouseEvent): void
abstract showMessageBox (options: MessageBoxOptions): Promise<MessageBoxResult>
abstract quit (): void
}
export class HTMLFileUpload extends FileUpload {
private stream: ReadableStream
private reader: ReadableStreamDefaultReader
constructor (private file: File) {
super()
this.stream = this.file.stream()
this.reader = this.stream.getReader()
}
getName (): string {
return this.file.name
}
getSize (): number {
return this.file.size
}
async read (): Promise<Buffer> {
const result: any = await this.reader.read()
if (result.done || !result.value) {
return Buffer.from('')
}
const chunk = Buffer.from(result.value)
this.increaseProgress(chunk.length)
return chunk
}
// eslint-disable-next-line @typescript-eslint/no-empty-function
bringToFront (): void { }
// eslint-disable-next-line @typescript-eslint/no-empty-function
close (): void { }
}

View File

@@ -1,6 +1,6 @@
import type { MenuItemConstructorOptions } from 'electron'
import { BaseTabComponent } from '../components/baseTab.component'
import { TabHeaderComponent } from '../components/tabHeader.component'
import { MenuItemOptions } from './menu'
/**
* Extend to add items to the tab header's context menu
@@ -8,5 +8,5 @@ import { TabHeaderComponent } from '../components/tabHeader.component'
export abstract class TabContextMenuItemProvider {
weight = 0
abstract async getItems (tab: BaseTabComponent, tabHeader?: TabHeaderComponent): Promise<MenuItemConstructorOptions[]>
abstract getItems (tab: BaseTabComponent, tabHeader?: TabHeaderComponent): Promise<MenuItemOptions[]>
}

View File

@@ -40,14 +40,14 @@ export abstract class TabRecoveryProvider {
* @param recoveryToken a recovery token found in the saved tabs list
* @returns [[boolean]] whether this [[TabRecoveryProvider]] can recover a tab from this token
*/
abstract async applicableTo (recoveryToken: RecoveryToken): Promise<boolean>
abstract applicableTo (recoveryToken: RecoveryToken): Promise<boolean>
/**
* @param recoveryToken a recovery token found in the saved tabs list
* @returns [[RecoveredTab]] descriptor containing tab type and component inputs
* or `null` if this token is from a different tab type or is not supported
*/
abstract async recover (recoveryToken: RecoveryToken): Promise<RecoveredTab>
abstract recover (recoveryToken: RecoveryToken): Promise<RecoveredTab>
/**
* @param recoveryToken a recovery token found in the saved tabs list

21
terminus-core/src/cli.ts Normal file
View File

@@ -0,0 +1,21 @@
import { Injectable } from '@angular/core'
import { HostAppService } from './api/hostApp'
import { CLIHandler, CLIEvent } from './api/cli'
@Injectable()
export class LastCLIHandler extends CLIHandler {
firstMatchOnly = true
priority = -999
constructor (private hostApp: HostAppService) {
super()
}
async handle (event: CLIEvent): Promise<boolean> {
if (event.secondInstance) {
this.hostApp.newWindow()
return true
}
return false
}
}

View File

@@ -1,15 +1,16 @@
title-bar(
*ngIf='!hostApp.isFullScreen && config.store.appearance.frame == "full" && config.store.appearance.dock == "off"',
[class.inset]='hostApp.platform == Platform.macOS && !hostApp.isFullScreen'
*ngIf='ready && !hostWindow.isFullScreen && config.store.appearance.frame == "full" && config.store.appearance.dock == "off"',
[class.inset]='hostApp.platform == Platform.macOS && !hostWindow.isFullScreen'
)
.content(
*ngIf='ready',
[class.tabs-on-top]='config.store.appearance.tabsLocation == "top" || config.store.appearance.tabsLocation == "left"',
[class.tabs-on-side]='hasVerticalTabs()',
)
.tab-bar
.inset.background(*ngIf='hostApp.platform == Platform.macOS \
&& !hostApp.isFullScreen \
&& !hostWindow.isFullScreen \
&& config.store.appearance.frame == "thin" \
&& (config.store.appearance.tabsLocation == "top" || config.store.appearance.tabsLocation == "left")')
.tabs(
@@ -56,6 +57,17 @@ title-bar(
)
div([class.ml-3]='hasIcons(button.submenuItems)') {{item.title}}
.d-flex(
*ngIf='activeTransfers.length > 0',
ngbDropdown,
[(open)]='activeTransfersDropdownOpen'
)
button.btn.btn-secondary.btn-tab-bar(
title='File transfers',
ngbDropdownToggle
) !{require('../icons/download-solid.svg')}
transfers-menu(ngbDropdownMenu, [(transfers)]='activeTransfers')
.drag-space.background([class.persistent]='config.store.appearance.frame == "thin" && hostApp.platform != Platform.macOS')
.btn-group.background
@@ -85,9 +97,8 @@ title-bar(
button.btn.btn-secondary.btn-tab-bar.btn-update(
*ngIf='updatesAvailable',
title='Update available - Click to install',
(click)='updater.update()',
[fastHtmlBind]='updateIcon'
)
(click)='updater.update()'
) !{require('../icons/gift.svg')}
window-controls.background(
*ngIf='config.store.appearance.frame == "thin" \

View File

@@ -86,7 +86,7 @@ $side-tab-width: 200px;
display: flex;
align-items: center;
padding: 0 15px;
padding: 0 12px;
flex: 0 0 auto;
border-bottom: 2px solid transparent;
transition: 0.25s all;
@@ -146,7 +146,7 @@ $side-tab-width: 200px;
width: 100%;
height: 100%;
left: -100%;
left: -1000%;
&.content-tab-active {
left: 0;
@@ -163,7 +163,7 @@ hotkey-hint {
::ng-deep .btn-tab-bar svg,
::ng-deep .btn-tab-bar + .dropdown-menu svg {
width: 16px;
width: 22px;
height: 16px;
fill: white;
fill-opacity: 0.75;

View File

@@ -3,19 +3,16 @@ import { Component, Inject, Input, HostListener, HostBinding } from '@angular/co
import { trigger, style, animate, transition, state } from '@angular/animations'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { ElectronService } from '../services/electron.service'
import { HostAppService, Platform } from '../services/hostApp.service'
import { HostAppService, Platform } from '../api/hostApp'
import { HotkeysService } from '../services/hotkeys.service'
import { Logger, LogService } from '../services/log.service'
import { ConfigService } from '../services/config.service'
import { DockingService } from '../services/docking.service'
import { ThemesService } from '../services/themes.service'
import { UpdaterService } from '../services/updater.service'
import { TouchbarService } from '../services/touchbar.service'
import { BaseTabComponent } from './baseTab.component'
import { SafeModeModalComponent } from './safeModeModal.component'
import { AppService, ToolbarButton, ToolbarButtonProvider } from '../api'
import { AppService, FileTransfer, HostWindowService, PlatformService, ToolbarButton, ToolbarButtonProvider } from '../api'
/** @hidden */
@Component({
@@ -62,31 +59,26 @@ export class AppRootComponent {
@HostBinding('class.no-tabs') noTabs = true
tabsDragging = false
unsortedTabs: BaseTabComponent[] = []
updateIcon: string
updatesAvailable = false
activeTransfers: FileTransfer[] = []
activeTransfersDropdownOpen = false
private logger: Logger
private constructor (
private docking: DockingService,
private hotkeys: HotkeysService,
private updater: UpdaterService,
private touchbar: TouchbarService,
public hostWindow: HostWindowService,
public hostApp: HostAppService,
public config: ConfigService,
public app: AppService,
@Inject(ToolbarButtonProvider) private toolbarButtonProviders: ToolbarButtonProvider[],
electron: ElectronService,
platform: PlatformService,
log: LogService,
ngbModal: NgbModal,
_themes: ThemesService,
) {
this.logger = log.create('main')
this.logger.info('v', electron.app.getVersion())
this.leftToolbarButtons = this.getToolbarButtons(false)
this.rightToolbarButtons = this.getToolbarButtons(true)
this.updateIcon = require('../icons/gift.svg')
this.logger.info('v', platform.getAppVersion())
this.hotkeys.matchedHotkey.subscribe((hotkey: string) => {
if (hotkey.startsWith('tab-')) {
@@ -119,16 +111,11 @@ export class AppRootComponent {
}
}
if (hotkey === 'toggle-fullscreen') {
this.hostApp.toggleFullscreen()
hostWindow.toggleFullscreen()
}
})
this.docking.dock()
this.hostApp.shown.subscribe(() => {
this.docking.dock()
})
this.hostApp.windowCloseRequest$.subscribe(async () => {
this.hostWindow.windowCloseRequest$.subscribe(async () => {
this.app.closeWindow()
})
@@ -136,35 +123,8 @@ export class AppRootComponent {
ngbModal.open(SafeModeModalComponent)
}
setInterval(() => {
if (this.config.store.enableAutomaticUpdates) {
this.updater.check().then(available => {
this.updatesAvailable = available
})
}
}, 3600 * 12)
this.touchbar.update()
this.hostApp.useBuiltinGraphics()
config.changed$.subscribe(() => this.updateVibrancy())
this.updateVibrancy()
let lastProgress: number|null = null
this.app.tabOpened$.subscribe(tab => {
this.unsortedTabs.push(tab)
tab.progress$.subscribe(progress => {
if (lastProgress === progress) {
return
}
if (progress !== null) {
this.hostApp.getWindow().setProgressBar(progress / 100.0, { mode: 'normal' })
} else {
this.hostApp.getWindow().setProgressBar(-1, { mode: 'none' })
}
lastProgress = progress
})
this.noTabs = false
})
@@ -172,12 +132,31 @@ export class AppRootComponent {
this.unsortedTabs = this.unsortedTabs.filter(x => x !== tab)
this.noTabs = app.tabs.length === 0
})
platform.fileTransferStarted$.subscribe(transfer => {
this.activeTransfers.push(transfer)
this.activeTransfersDropdownOpen = true
})
config.ready$.toPromise().then(() => {
this.leftToolbarButtons = this.getToolbarButtons(false)
this.rightToolbarButtons = this.getToolbarButtons(true)
setInterval(() => {
if (this.config.store.enableAutomaticUpdates) {
this.updater.check().then(available => {
this.updatesAvailable = available
})
}
}, 3600 * 12 * 1000)
})
}
async ngOnInit () {
this.ready = true
this.app.emitReady()
this.config.ready$.toPromise().then(() => {
this.ready = true
this.app.emitReady()
})
}
@HostListener('dragover')
@@ -224,9 +203,4 @@ export class AppRootComponent {
.filter(button => (button.weight ?? 0) > 0 === aboveZero)
.sort((a: ToolbarButton, b: ToolbarButton) => (a.weight ?? 0) - (b.weight ?? 0))
}
private updateVibrancy () {
this.hostApp.setVibrancy(this.config.store.appearance.vibrancy, this.config.store.appearance.vibrancyType)
this.hostApp.getWindow().setOpacity(this.config.store.appearance.opacity)
}
}

View File

@@ -0,0 +1,58 @@
import { Observable, Subscription, Subject } from 'rxjs'
interface CancellableEvent {
element: HTMLElement
event: string
handler: EventListenerOrEventListenerObject
options?: boolean|AddEventListenerOptions
}
export class SubscriptionContainer {
private subscriptions: Subscription[] = []
private events: CancellableEvent[] = []
addEventListener (element: HTMLElement, event: string, handler: EventListenerOrEventListenerObject, options?: boolean|AddEventListenerOptions): void {
element.addEventListener(event, handler, options)
this.events.push({
element,
event,
handler,
options,
})
}
subscribe <T> (observable: Observable<T>, handler: (v: T) => void): void {
this.subscriptions.push(observable.subscribe(handler))
}
cancelAll (): void {
for (const s of this.subscriptions) {
s.unsubscribe()
}
for (const e of this.events) {
e.element.removeEventListener(e.event, e.handler, e.options)
}
this.subscriptions = []
this.events = []
}
}
export class BaseComponent {
protected get destroyed$ (): Observable<void> { return this._destroyed }
private _destroyed = new Subject<void>()
private _subscriptionContainer = new SubscriptionContainer()
addEventListenerUntilDestroyed (element: HTMLElement, event: string, handler: EventListenerOrEventListenerObject, options?: boolean|AddEventListenerOptions): void {
this._subscriptionContainer.addEventListener(element, event, handler, options)
}
subscribeUntilDestroyed <T> (observable: Observable<T>, handler: (v: T) => void): void {
this._subscriptionContainer.subscribe(observable, handler)
}
ngOnDestroy (): void {
this._destroyed.next()
this._destroyed.complete()
this._subscriptionContainer.cancelAll()
}
}

View File

@@ -1,6 +1,7 @@
import { Observable, Subject } from 'rxjs'
import { ViewRef } from '@angular/core'
import { RecoveryToken } from '../api/tabRecovery'
import { BaseComponent } from './base.component'
/**
* Represents an active "process" inside a tab,
@@ -13,7 +14,7 @@ export interface BaseTabProcess {
/**
* Abstract base class for custom tab components
*/
export abstract class BaseTabComponent {
export abstract class BaseTabComponent extends BaseComponent {
/**
* Parent tab (usually a SplitTabComponent)
*/
@@ -69,6 +70,7 @@ export abstract class BaseTabComponent {
get recoveryStateChangedHint$ (): Observable<void> { return this.recoveryStateChangedHint }
protected constructor () {
super()
this.focused$.subscribe(() => {
this.hasFocus = true
})
@@ -158,10 +160,17 @@ export abstract class BaseTabComponent {
this.blurred.complete()
this.titleChange.complete()
this.progress.complete()
this.activity.complete()
this.recoveryStateChangedHint.complete()
if (!skipDestroyedEvent) {
this.destroyed.next()
}
this.destroyed.complete()
}
/** @hidden */
ngOnDestroy (): void {
this.destroy()
super.ngOnDestroy()
}
}

View File

@@ -1,4 +1,4 @@
import { Observable, Subject, Subscription } from 'rxjs'
import { Observable, Subject } from 'rxjs'
import { Component, Injectable, ViewChild, ViewContainerRef, EmbeddedViewRef, AfterViewInit, OnDestroy } from '@angular/core'
import { BaseTabComponent, BaseTabProcess } from './baseTab.component'
import { TabRecoveryProvider, RecoveredTab, RecoveryToken } from '../api/tabRecovery'
@@ -163,7 +163,6 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
/** @hidden */
private focusedTab: BaseTabComponent|null = null
private maximizedTab: BaseTabComponent|null = null
private hotkeysSubscription: Subscription
private viewRefs: Map<BaseTabComponent, EmbeddedViewRef<any>> = new Map()
private tabAdded = new Subject<BaseTabComponent>()
@@ -210,7 +209,7 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
})
this.blurred$.subscribe(() => this.getAllTabs().forEach(x => x.emitBlurred()))
this.hotkeysSubscription = this.hotkeys.matchedHotkey.subscribe(hotkey => {
this.subscribeUntilDestroyed(this.hotkeys.matchedHotkey, hotkey => {
if (!this.hasFocus || !this.focusedTab) {
return
}
@@ -272,7 +271,9 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
/** @hidden */
ngOnDestroy (): void {
this.hotkeysSubscription.unsubscribe()
this.tabAdded.complete()
this.tabRemoved.complete()
super.ngOnDestroy()
}
/** @returns Flat list of all sub-tabs */
@@ -497,18 +498,18 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
const ref = this.viewContainer.insert(tab.hostView) as EmbeddedViewRef<any> // eslint-disable-line @typescript-eslint/no-unnecessary-type-assertion
this.viewRefs.set(tab, ref)
ref.rootNodes[0].addEventListener('click', () => this.focus(tab))
tab.addEventListenerUntilDestroyed(ref.rootNodes[0], 'click', () => this.focus(tab))
tab.titleChange$.subscribe(t => this.setTitle(t))
tab.activity$.subscribe(a => a ? this.displayActivity() : this.clearActivity())
tab.progress$.subscribe(p => this.setProgress(p))
tab.subscribeUntilDestroyed(tab.titleChange$, t => this.setTitle(t))
tab.subscribeUntilDestroyed(tab.activity$, a => a ? this.displayActivity() : this.clearActivity())
tab.subscribeUntilDestroyed(tab.progress$, p => this.setProgress(p))
if (tab.title) {
this.setTitle(tab.title)
}
tab.recoveryStateChangedHint$.subscribe(() => {
tab.subscribeUntilDestroyed(tab.recoveryStateChangedHint$, () => {
this.recoveryStateChangedHint.next()
})
tab.destroyed$.subscribe(() => {
tab.subscribeUntilDestroyed(tab.destroyed$, () => {
this.removeTab(tab)
})
}

View File

@@ -66,7 +66,7 @@ $tabs-height: 38px;
$button-size: 26px;
width: $button-size;
height: $button-size;
border-radius: $button-size / 2;
border-radius: $button-size / 6;
line-height: $button-size;
align-self: center;

View File

@@ -1,5 +1,4 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import type { MenuItemConstructorOptions } from 'electron'
import { Component, Input, Optional, Inject, HostBinding, HostListener, ViewChild, ElementRef, NgZone } from '@angular/core'
import { SortableComponent } from 'ng2-dnd'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
@@ -7,10 +6,12 @@ import { TabContextMenuItemProvider } from '../api/tabContextMenuProvider'
import { BaseTabComponent } from './baseTab.component'
import { RenameTabModalComponent } from './renameTabModal.component'
import { HotkeysService } from '../services/hotkeys.service'
import { ElectronService } from '../services/electron.service'
import { AppService } from '../services/app.service'
import { HostAppService, Platform } from '../services/hostApp.service'
import { HostAppService, Platform } from '../api/hostApp'
import { ConfigService } from '../services/config.service'
import { BaseComponent } from './base.component'
import { MenuItemOptions } from '../api/menu'
import { PlatformService } from '../api/platform'
/** @hidden */
export interface SortableComponentProxy {
@@ -23,7 +24,7 @@ export interface SortableComponentProxy {
template: require('./tabHeader.component.pug'),
styles: [require('./tabHeader.component.scss')],
})
export class TabHeaderComponent {
export class TabHeaderComponent extends BaseComponent {
@Input() index: number
@Input() @HostBinding('class.active') active: boolean
@Input() tab: BaseTabComponent
@@ -33,15 +34,16 @@ export class TabHeaderComponent {
private constructor (
public app: AppService,
public config: ConfigService,
private electron: ElectronService,
private hostApp: HostAppService,
private ngbModal: NgbModal,
private hotkeys: HotkeysService,
private platform: PlatformService,
private zone: NgZone,
@Inject(SortableComponent) private parentDraggable: SortableComponentProxy,
@Optional() @Inject(TabContextMenuItemProvider) protected contextMenuProviders: TabContextMenuItemProvider[],
) {
this.hotkeys.matchedHotkey.subscribe((hotkey) => {
super()
this.subscribeUntilDestroyed(this.hotkeys.matchedHotkey, (hotkey) => {
if (this.app.activeTab === this.tab) {
if (hotkey === 'rename-tab') {
this.showRenameTabModal()
@@ -52,7 +54,7 @@ export class TabHeaderComponent {
}
ngOnInit () {
this.tab.progress$.subscribe(progress => {
this.subscribeUntilDestroyed(this.tab.progress$, progress => {
this.zone.run(() => {
this.progress = progress
})
@@ -74,8 +76,8 @@ export class TabHeaderComponent {
}).catch(() => null)
}
async buildContextMenu (): Promise<MenuItemConstructorOptions[]> {
let items: MenuItemConstructorOptions[] = []
async buildContextMenu (): Promise<MenuItemOptions[]> {
let items: MenuItemOptions[] = []
for (const section of await Promise.all(this.contextMenuProviders.map(x => x.getItems(this.tab, this)))) {
items.push({ type: 'separator' })
items = items.concat(section)
@@ -103,16 +105,8 @@ export class TabHeaderComponent {
}
}
@HostListener('auxclick', ['$event']) async onAuxClick ($event: MouseEvent) {
if ($event.which === 3) {
$event.preventDefault()
const contextMenu = this.electron.Menu.buildFromTemplate(await this.buildContextMenu())
contextMenu.popup({
x: $event.pageX,
y: $event.pageY,
})
}
@HostListener('contextmenu', ['$event']) async onContextMenu ($event: MouseEvent) {
$event.preventDefault()
this.platform.popupContextMenu(await this.buildContextMenu(), $event)
}
}

View File

@@ -0,0 +1,13 @@
.dropdown-header File transfers
.dropdown-item.transfer(*ngFor='let transfer of transfers', (click)='showTransfer(transfer)')
.icon(*ngIf='isDownload(transfer)') !{require('../icons/download.svg')}
.icon(*ngIf='!isDownload(transfer)') !{require('../icons/upload.svg')}
.main
label {{transfer.getName()}}
.status(*ngIf='transfer.isComplete()')
ngb-progressbar(type='success', [value]='100')
.status(*ngIf='transfer.isCancelled()')
ngb-progressbar(type='danger', [value]='100')
.status(*ngIf='!transfer.isComplete() && !transfer.isCancelled()')
ngb-progressbar(type='info', [value]='getProgress(transfer)')
button.btn.btn-link((click)='removeTransfer(transfer); $event.stopPropagation()') !{require('../icons/times.svg')}

View File

@@ -0,0 +1,31 @@
:host {
min-width: 300px;
}
.transfer {
display: flex;
align-items: center;
padding: 5px 0 5px 25px;
.icon {
padding: 4px 10px;
width: 36px;
height: 32px;
background: rgba(0,0,0,.25);
margin-right: 12px;
}
.main {
width: 100%;
margin-right: auto;
margin-bottom: 7px;
label {
margin: 0;
}
}
> i {
margin-right: 10px;
}
}

View File

@@ -0,0 +1,38 @@
import { Component, Input, Output, EventEmitter } from '@angular/core'
import { FileDownload, FileTransfer, PlatformService } from '../api/platform'
/** @hidden */
@Component({
selector: 'transfers-menu',
template: require('./transfersMenu.component.pug'),
styles: [require('./transfersMenu.component.scss')],
})
export class TransfersMenuComponent {
@Input() transfers: FileTransfer[]
@Output() transfersChange = new EventEmitter<FileTransfer[]>()
constructor (private platform: PlatformService) { }
isDownload (transfer: FileTransfer): boolean {
return transfer instanceof FileDownload
}
getProgress (transfer: FileTransfer): number {
return Math.round(100 * transfer.getCompletedBytes() / transfer.getSize())
}
showTransfer (transfer: FileTransfer): void {
const fp = transfer['filePath']
if (fp) {
this.platform.showItemInFolder(fp)
}
}
removeTransfer (transfer: FileTransfer): void {
if (!transfer.isComplete()) {
transfer.cancel()
}
this.transfers = this.transfers.filter(x => x !== transfer)
this.transfersChange.emit(this.transfers)
}
}

View File

@@ -0,0 +1,29 @@
.modal-body
.d-flex.align-items-center.mb-3
h3.m-0 Vault is locked
.ml-auto(ngbDropdown, placement='bottom-right')
button.btn.btn-link(ngbDropdownToggle, (click)='$event.stopPropagation()')
span(*ngIf='rememberFor') Remember for {{rememberFor}} min
span(*ngIf='!rememberFor') Do not remember
div(ngbDropdownMenu)
button.dropdown-item(
(click)='rememberFor = 0',
) Do not remember
button.dropdown-item(
*ngFor='let x of rememberOptions',
(click)='rememberFor = x',
) {{x}} min
.input-group
input.form-control.form-control-lg(
type='password',
autofocus,
[(ngModel)]='passphrase',
#input,
placeholder='Master passphrase',
(keyup.enter)='ok()',
(keyup.esc)='cancel()',
)
.input-group-append
button.btn.btn-secondary((click)='ok()', *ngIf='passphrase')
i.fas.fa-check

View File

@@ -0,0 +1,36 @@
import { Component, ViewChild, ElementRef } from '@angular/core'
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
/** @hidden */
@Component({
template: require('./unlockVaultModal.component.pug'),
})
export class UnlockVaultModalComponent {
passphrase: string
rememberFor = 1
rememberOptions = [1, 5, 15, 60]
@ViewChild('input') input: ElementRef
constructor (
private modalInstance: NgbActiveModal,
) { }
ngOnInit (): void {
this.rememberFor = parseInt(window.localStorage.vaultRememberPassphraseFor ?? 0)
setTimeout(() => {
this.input.nativeElement.focus()
})
}
ok (): void {
window.localStorage.vaultRememberPassphraseFor = this.rememberFor
this.modalInstance.close({
passphrase: this.passphrase,
rememberFor: this.rememberFor,
})
}
cancel (): void {
this.modalInstance.close(null)
}
}

View File

@@ -2,7 +2,7 @@
import { Component } from '@angular/core'
import { BaseTabComponent } from './baseTab.component'
import { ConfigService } from '../services/config.service'
import { HostAppService } from '../services/hostApp.service'
import { HostWindowService } from '../api/hostWindow'
/** @hidden */
@Component({
@@ -16,7 +16,7 @@ export class WelcomeTabComponent extends BaseTabComponent {
enableGlobalHotkey = true
constructor (
private hostApp: HostAppService,
private hostWindow: HostWindowService,
public config: ConfigService,
) {
super()
@@ -38,6 +38,6 @@ export class WelcomeTabComponent extends BaseTabComponent {
this.config.store.hotkeys['toggle-window'] = []
}
this.config.save()
this.hostApp.getWindow().reload()
this.hostWindow.reload()
}
}

View File

@@ -1,10 +1,10 @@
button.btn.btn-secondary.btn-minimize(
(click)='hostApp.minimize()',
(click)='hostWindow.minimize()',
)
svg(version='1.1', width='10', height='10')
path(d='M 0,5 10,5 10,6 0,6 Z')
button.btn.btn-secondary.btn-maximize(
(click)='hostApp.toggleMaximize()',
(click)='hostWindow.toggleMaximize()',
)
svg(version='1.1', width='10', height='10')
path(d='M 0,0 0,10 10,10 10,0 Z M 1,1 9,1 9,9 1,9 Z')

View File

@@ -1,6 +1,6 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Component } from '@angular/core'
import { HostAppService } from '../services/hostApp.service'
import { HostWindowService } from '../api/hostWindow'
import { AppService } from '../services/app.service'
/** @hidden */
@@ -10,7 +10,7 @@ import { AppService } from '../services/app.service'
styles: [require('./windowControls.component.scss')],
})
export class WindowControlsComponent {
private constructor (public hostApp: HostAppService, public app: AppService) { }
private constructor (public hostWindow: HostWindowService, public app: AppService) { }
async closeWindow () {
this.app.closeWindow()

View File

@@ -1,5 +1,5 @@
import { ConfigProvider } from './api/configProvider'
import { Platform } from './services/hostApp.service'
import { Platform } from './api/hostApp'
/** @hidden */
export class CoreConfigProvider extends ConfigProvider {
@@ -7,6 +7,7 @@ export class CoreConfigProvider extends ConfigProvider {
[Platform.macOS]: require('./configDefaults.macos.yaml'),
[Platform.Windows]: require('./configDefaults.windows.yaml'),
[Platform.Linux]: require('./configDefaults.linux.yaml'),
[Platform.Web]: require('./configDefaults.web.yaml'),
}
defaults = require('./configDefaults.yaml')
}

View File

@@ -1,8 +1,4 @@
hotkeys:
new-window:
- 'Ctrl-Shift-N'
toggle-window:
- 'Ctrl+Space'
toggle-fullscreen:
- 'F11'
close-tab:

View File

@@ -1,8 +1,4 @@
hotkeys:
new-window:
- '⌘-N'
toggle-window:
- 'Ctrl+Space'
toggle-fullscreen:
- 'Ctrl+⌘+F'
close-tab:

View File

@@ -0,0 +1,6 @@
pluginBlacklist: ['local']
terminal:
recoverTabs: false
enableAnalytics: false
enableWelcomeTab: false
enableAutomaticUpdates: false

View File

@@ -1,8 +1,4 @@
hotkeys:
new-window:
- 'Ctrl-Shift-N'
toggle-window:
- 'Ctrl+Space'
toggle-fullscreen:
- 'F11'
- 'Alt-Enter'

View File

@@ -14,8 +14,13 @@ appearance:
opacity: 1.0
vibrancy: true
vibrancyType: 'blur'
terminal:
recoverTabs: true
enableAnalytics: true
enableWelcomeTab: true
electronFlags:
- ['force_discrete_gpu', '0']
enableAutomaticUpdates: true
version: 1
vault: null
encrypted: false

View File

@@ -0,0 +1 @@
i.fas.fa-upload

View File

@@ -0,0 +1,24 @@
.drop-zone-hint {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, .5);
pointer-events: none;
z-index: 1;
display: flex;
transition: .25s opacity ease-out;
opacity: 0;
&.visible {
opacity: 1;
}
i {
font-size: 48px;
align-self: center;
margin: auto;
text-align: center;
}
}

View File

@@ -0,0 +1,49 @@
import { Directive, Output, ElementRef, EventEmitter, AfterViewInit } from '@angular/core'
import { FileUpload, PlatformService } from '../api/platform'
import './dropZone.directive.scss'
/** @hidden */
@Directive({
selector: '[dropZone]',
})
export class DropZoneDirective implements AfterViewInit {
@Output() transfer = new EventEmitter<FileUpload>()
private dropHint?: HTMLElement
constructor (
private el: ElementRef,
private platform: PlatformService,
) { }
ngAfterViewInit (): void {
this.el.nativeElement.addEventListener('dragover', () => {
if (!this.dropHint) {
this.dropHint = document.createElement('div')
this.dropHint.className = 'drop-zone-hint'
this.dropHint.innerHTML = require('./dropZone.directive.pug')
this.el.nativeElement.appendChild(this.dropHint)
setTimeout(() => {
this.dropHint!.classList.add('visible')
})
}
})
this.el.nativeElement.addEventListener('drop', (event: DragEvent) => {
this.removeHint()
for (const transfer of this.platform.startUploadFromDragEvent(event, true)) {
this.transfer.emit(transfer)
}
})
this.el.nativeElement.addEventListener('dragleave', () => {
this.removeHint()
})
}
private removeHint () {
const element = this.dropHint
delete this.dropHint
element?.classList.remove('visible')
setTimeout(() => {
element?.remove()
}, 500)
}
}

View File

@@ -5,14 +5,6 @@ import { HotkeyDescription, HotkeyProvider } from './api/hotkeyProvider'
@Injectable()
export class AppHotkeyProvider extends HotkeyProvider {
hotkeys: HotkeyDescription[] = [
{
id: 'new-window',
name: 'New window',
},
{
id: 'toggle-window',
name: 'Toggle terminal window',
},
{
id: 'toggle-fullscreen',
name: 'Toggle fullscreen mode',

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M216 0h80c13.3 0 24 10.7 24 24v168h87.7c17.8 0 26.7 21.5 14.1 34.1L269.7 378.3c-7.5 7.5-19.8 7.5-27.3 0L90.1 226.1c-12.6-12.6-3.7-34.1 14.1-34.1H192V24c0-13.3 10.7-24 24-24zm296 376v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h146.7l49 49c20.1 20.1 52.5 20.1 72.6 0l49-49H488c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z"></path></svg>

After

Width:  |  Height:  |  Size: 529 B

View File

@@ -0,0 +1 @@
<svg aria-hidden="true" focusable="false" data-prefix="fad" data-icon="download" class="svg-inline--fa fa-download fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><g class="fa-group"><path class="fa-secondary" fill="currentColor" d="M320 24v168h87.7c17.8 0 26.7 21.5 14.1 34.1L269.7 378.3a19.37 19.37 0 0 1-27.3 0L90.1 226.1c-12.6-12.6-3.7-34.1 14.1-34.1H192V24a23.94 23.94 0 0 1 24-24h80a23.94 23.94 0 0 1 24 24z" opacity="0.4"></path><path class="fa-primary" fill="currentColor" d="M488 352H341.3l-49 49a51.24 51.24 0 0 1-72.6 0l-49-49H24a23.94 23.94 0 0 0-24 24v112a23.94 23.94 0 0 0 24 24h464a23.94 23.94 0 0 0 24-24V376a23.94 23.94 0 0 0-24-24zm-120 96a16 16 0 1 1 16-16 16 16 0 0 1-16 16zm64 0a16 16 0 1 1 16-16 16 16 0 0 1-16 16z"></path></g></svg>

After

Width:  |  Height:  |  Size: 784 B

View File

@@ -0,0 +1 @@
<svg aria-hidden="true" focusable="false" data-prefix="fal" data-icon="times" class="svg-inline--fa fa-times fa-w-10" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M193.94 256L296.5 153.44l21.15-21.15c3.12-3.12 3.12-8.19 0-11.31l-22.63-22.63c-3.12-3.12-8.19-3.12-11.31 0L160 222.06 36.29 98.34c-3.12-3.12-8.19-3.12-11.31 0L2.34 120.97c-3.12 3.12-3.12 8.19 0 11.31L126.06 256 2.34 379.71c-3.12 3.12-3.12 8.19 0 11.31l22.63 22.63c3.12 3.12 8.19 3.12 11.31 0L160 289.94 262.56 392.5l21.15 21.15c3.12 3.12 8.19 3.12 11.31 0l22.63-22.63c3.12-3.12 3.12-8.19 0-11.31L193.94 256z"></path></svg>

After

Width:  |  Height:  |  Size: 637 B

View File

@@ -0,0 +1 @@
<svg aria-hidden="true" focusable="false" data-prefix="fad" data-icon="upload" class="svg-inline--fa fa-upload fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><g class="fa-group"><path class="fa-secondary" fill="currentColor" d="M488 351.92H352v8a56 56 0 0 1-56 56h-80a56 56 0 0 1-56-56v-8H24a23.94 23.94 0 0 0-24 24v112a23.94 23.94 0 0 0 24 24h464a23.94 23.94 0 0 0 24-24v-112a23.94 23.94 0 0 0-24-24zm-120 132a20 20 0 1 1 20-20 20.06 20.06 0 0 1-20 20zm64 0a20 20 0 1 1 20-20 20.06 20.06 0 0 1-20 20z" opacity="0.4"></path><path class="fa-primary" fill="currentColor" d="M192 359.93v-168h-87.7c-17.8 0-26.7-21.5-14.1-34.11L242.3 5.62a19.37 19.37 0 0 1 27.3 0l152.2 152.2c12.6 12.61 3.7 34.11-14.1 34.11H320v168a23.94 23.94 0 0 1-24 24h-80a23.94 23.94 0 0 1-24-24z"></path></g></svg>

After

Width:  |  Height:  |  Size: 813 B

View File

@@ -19,37 +19,29 @@ import { RenameTabModalComponent } from './components/renameTabModal.component'
import { SelectorModalComponent } from './components/selectorModal.component'
import { SplitTabComponent, SplitTabRecoveryProvider } from './components/splitTab.component'
import { SplitTabSpannerComponent } from './components/splitTabSpanner.component'
import { UnlockVaultModalComponent } from './components/unlockVaultModal.component'
import { WelcomeTabComponent } from './components/welcomeTab.component'
import { TransfersMenuComponent } from './components/transfersMenu.component'
import { AutofocusDirective } from './directives/autofocus.directive'
import { FastHtmlBindDirective } from './directives/fastHtmlBind.directive'
import { DropZoneDirective } from './directives/dropZone.directive'
import { HotkeyProvider } from './api/hotkeyProvider'
import { ConfigProvider } from './api/configProvider'
import { Theme } from './api/theme'
import { TabContextMenuItemProvider } from './api/tabContextMenuProvider'
import { TabRecoveryProvider } from './api/tabRecovery'
import { Theme, CLIHandler, TabContextMenuItemProvider, TabRecoveryProvider, HotkeyProvider, ConfigProvider, PlatformService, FileProvider } from './api'
import { AppService } from './services/app.service'
import { ConfigService } from './services/config.service'
import { VaultFileProvider } from './services/vault.service'
import { StandardTheme, StandardCompactTheme, PaperTheme } from './theme'
import { CoreConfigProvider } from './config'
import { AppHotkeyProvider } from './hotkeys'
import { TaskCompletionContextMenu, CommonOptionsContextMenu, TabManagementContextMenu } from './tabContextMenu'
import { LastCLIHandler } from './cli'
import 'perfect-scrollbar/css/perfect-scrollbar.css'
import 'ng2-dnd/bundles/style.css'
// PerfectScrollbar fix
import { fromEvent } from 'rxjs/internal/observable/fromEvent'
import { merge } from 'rxjs/internal/observable/merge'
try {
require('rxjs').fromEvent = fromEvent
require('rxjs').merge = merge
} catch {}
const PROVIDERS = [
{ provide: HotkeyProvider, useClass: AppHotkeyProvider, multi: true },
{ provide: Theme, useClass: StandardTheme, multi: true },
@@ -60,7 +52,9 @@ const PROVIDERS = [
{ provide: TabContextMenuItemProvider, useClass: TabManagementContextMenu, multi: true },
{ provide: TabContextMenuItemProvider, useClass: TaskCompletionContextMenu, multi: true },
{ provide: TabRecoveryProvider, useClass: SplitTabRecoveryProvider, multi: true },
{ provide: CLIHandler, useClass: LastCLIHandler, multi: true },
{ provide: PERFECT_SCROLLBAR_CONFIG, useValue: { suppressScrollX: true } },
{ provide: FileProvider, useClass: VaultFileProvider, multi: true },
]
/** @hidden */
@@ -89,28 +83,37 @@ const PROVIDERS = [
SelectorModalComponent,
SplitTabComponent,
SplitTabSpannerComponent,
UnlockVaultModalComponent,
WelcomeTabComponent,
TransfersMenuComponent,
DropZoneDirective,
],
entryComponents: [
RenameTabModalComponent,
SafeModeModalComponent,
SelectorModalComponent,
SplitTabComponent,
UnlockVaultModalComponent,
WelcomeTabComponent,
],
exports: [
CheckboxComponent,
ToggleComponent,
AutofocusDirective,
DropZoneDirective,
],
})
export default class AppModule { // eslint-disable-line @typescript-eslint/no-extraneous-class
constructor (app: AppService, config: ConfigService) {
constructor (app: AppService, config: ConfigService, platform: PlatformService) {
app.ready$.subscribe(() => {
if (config.store.enableWelcomeTab) {
app.openNewTabRaw(WelcomeTabComponent)
}
})
platform.setErrorHandler(err => {
console.error('Unhandled exception:', err)
})
}
static forRoot (): ModuleWithProviders<AppModule> {

View File

@@ -1,7 +1,7 @@
import { Observable, Subject, AsyncSubject } from 'rxjs'
import { takeUntil } from 'rxjs/operators'
import { Injectable } from '@angular/core'
import { Injectable, Inject } from '@angular/core'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { BaseTabComponent } from '../components/baseTab.component'
@@ -9,9 +9,11 @@ import { SplitTabComponent } from '../components/splitTab.component'
import { SelectorModalComponent } from '../components/selectorModal.component'
import { SelectorOption } from '../api/selector'
import { RecoveryToken } from '../api/tabRecovery'
import { BootstrapData, BOOTSTRAP_DATA } from '../api/mainProcess'
import { HostWindowService } from '../api/hostWindow'
import { HostAppService } from '../api/hostApp'
import { ConfigService } from './config.service'
import { HostAppService } from './hostApp.service'
import { TabRecoveryService } from './tabRecovery.service'
import { TabsService, TabComponentType } from './tabs.service'
@@ -72,9 +74,11 @@ export class AppService {
private constructor (
private config: ConfigService,
private hostApp: HostAppService,
private hostWindow: HostWindowService,
private tabRecovery: TabRecoveryService,
private tabsService: TabsService,
private ngbModal: NgbModal,
@Inject(BOOTSTRAP_DATA) private bootstrapData: BootstrapData,
) {
this.tabsChanged$.subscribe(() => {
this.tabRecovery.saveTabs(this.tabs)
@@ -83,21 +87,20 @@ export class AppService {
this.tabRecovery.saveTabs(this.tabs)
}, 30000)
if (hostApp.getWindow().id === 1) {
if (config.store.terminal.recoverTabs) {
this.tabRecovery.recoverTabs().then(tabs => {
config.ready$.toPromise().then(async () => {
if (this.bootstrapData.isFirstWindow) {
if (config.store.terminal.recoverTabs) {
const tabs = await this.tabRecovery.recoverTabs()
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())
hostWindow.windowFocused$.subscribe(() => this._activeTab?.emitFocused())
this.tabClosed$.subscribe(async tab => {
const token = await tabRecovery.getFullRecoveryToken(tab)
@@ -118,7 +121,7 @@ export class AppService {
this.tabsChanged.next()
this.tabOpened.next(tab)
if (this.hostApp.getWindow().id === 1) {
if (this.bootstrapData.isFirstWindow) {
tab.recoveryStateChangedHint$.subscribe(() => {
this.tabRecovery.saveTabs(this.tabs)
})
@@ -126,7 +129,7 @@ export class AppService {
tab.titleChange$.subscribe(title => {
if (tab === this._activeTab) {
this.hostApp.setTitle(title)
this.hostWindow.setTitle(title)
}
})
@@ -204,7 +207,7 @@ export class AppService {
setImmediate(() => {
this._activeTab?.emitFocused()
})
this.hostApp.setTitle(this._activeTab?.title)
this.hostWindow.setTitle(this._activeTab?.title)
}
getParentTab (tab: BaseTabComponent): SplitTabComponent|null {
@@ -331,7 +334,7 @@ export class AppService {
this.tabRecovery.enabled = false
await this.tabRecovery.saveTabs(this.tabs)
if (await this.closeAllTabs()) {
this.hostApp.closeWindow()
this.hostWindow.close()
} else {
this.tabRecovery.enabled = true
}

View File

@@ -1,13 +1,15 @@
import { Observable, Subject } from 'rxjs'
import { Observable, Subject, AsyncSubject } from 'rxjs'
import * as yaml from 'js-yaml'
import * as path from 'path'
import * as fs from 'fs'
import { Injectable, Inject } from '@angular/core'
import { ConfigProvider } from '../api/configProvider'
import { ElectronService } from './electron.service'
import { HostAppService } from './hostApp.service'
import { PlatformService } from '../api/platform'
import { HostAppService } from '../api/hostApp'
import { Vault, VaultService } from './vault.service'
const deepmerge = require('deepmerge')
const configMerge = (a, b) => require('deepmerge')(a, b, { arrayMerge: (_d, s) => s }) // eslint-disable-line @typescript-eslint/no-var-requires
const configMerge = (a, b) => deepmerge(a, b, { arrayMerge: (_d, s) => s }) // eslint-disable-line @typescript-eslint/no-var-requires
const LATEST_VERSION = 1
function isStructuralMember (v) {
return v instanceof Object && !(v instanceof Array) &&
@@ -89,11 +91,10 @@ export class ConfigService {
*/
restartRequested: boolean
/**
* Full config file path
*/
path: string
/** Fires once when the config is loaded */
get ready$ (): Observable<boolean> { return this.ready }
private ready = new AsyncSubject<boolean>()
private changed = new Subject<void>()
private _store: any
private defaults: any
@@ -103,24 +104,32 @@ export class ConfigService {
/** @hidden */
private constructor (
electron: ElectronService,
private hostApp: HostAppService,
@Inject(ConfigProvider) configProviders: ConfigProvider[],
private platform: PlatformService,
private vault: VaultService,
@Inject(ConfigProvider) private configProviders: ConfigProvider[],
) {
this.path = path.join(electron.app.getPath('userData'), 'config.yaml')
this.defaults = configProviders.map(provider => {
let defaults = provider.platformDefaults[hostApp.platform] || {}
this.defaults = this.mergeDefaults()
setTimeout(() => this.init())
vault.contentChanged$.subscribe(() => {
this.store.vault = vault.store
this.save()
})
}
mergeDefaults (): unknown {
const providers = this.configProviders
return providers.map(provider => {
let defaults = provider.platformDefaults[this.hostApp.configPlatform] ?? {}
defaults = configMerge(
defaults,
provider.platformDefaults[this.hostApp.platform] ?? {},
)
if (provider.defaults) {
defaults = configMerge(defaults, provider.defaults)
defaults = configMerge(provider.defaults, defaults)
}
return defaults
}).reduce(configMerge)
this.load()
hostApp.configChangeBroadcast$.subscribe(() => {
this.load()
this.emitChange()
})
}
getDefaults (): Record<string, any> {
@@ -142,19 +151,24 @@ export class ConfigService {
return cleanup(this.defaults)
}
load (): void {
if (fs.existsSync(this.path)) {
this._store = yaml.load(fs.readFileSync(this.path, 'utf8'))
async load (): Promise<void> {
const content = await this.platform.loadConfig()
if (content) {
this._store = yaml.load(content)
} else {
this._store = {}
this._store = { version: LATEST_VERSION }
}
this._store = await this.maybeDecryptConfig(this._store)
this.migrate(this._store)
this.store = new ConfigProxy(this._store, this.defaults)
this.vault.setStore(this.store.vault)
}
save (): void {
async save (): Promise<void> {
// Scrub undefined values
this._store = JSON.parse(JSON.stringify(this._store))
fs.writeFileSync(this.path, yaml.dump(this._store), 'utf8')
let cleanStore = JSON.parse(JSON.stringify(this._store))
cleanStore = await this.maybeEncryptConfig(cleanStore)
await this.platform.saveConfig(yaml.dump(cleanStore))
this.emitChange()
this.hostApp.broadcastConfigChange(JSON.parse(JSON.stringify(this.store)))
}
@@ -202,14 +216,102 @@ export class ConfigService {
return services.filter(service => {
for (const pluginName in this.servicesCache) {
if (this.servicesCache[pluginName].includes(service.constructor)) {
return !this.store.pluginBlacklist.includes(pluginName)
return !this.store?.pluginBlacklist?.includes(pluginName)
}
}
return true
})
}
private async init () {
await this.load()
this.ready.next(true)
this.ready.complete()
this.hostApp.configChangeBroadcast$.subscribe(() => {
this.load()
this.emitChange()
})
}
private emitChange (): void {
this.changed.next()
this.vault.setStore(this.store.vault)
}
private migrate (config) {
config.version ??= 0
if (config.version < 1) {
for (const connection of config.ssh?.connections ?? []) {
if (connection.privateKey) {
connection.privateKeys = [connection.privateKey]
delete connection.privateKey
}
}
config.version = 1
}
}
private async maybeDecryptConfig (store) {
if (!store.encrypted) {
return store
}
// eslint-disable-next-line @typescript-eslint/init-declarations
let decryptedVault: Vault
while (true) {
try {
const passphrase = await this.vault.getPassphrase()
decryptedVault = await this.vault.decrypt(store.vault, passphrase)
break
} catch (e) {
let result = await this.platform.showMessageBox({
type: 'error',
message: 'Could not decrypt config',
detail: e.toString(),
buttons: ['Try again', 'Erase config', 'Quit'],
defaultId: 0,
})
if (result.response === 2) {
this.platform.quit()
}
if (result.response === 1) {
result = await this.platform.showMessageBox({
type: 'warning',
message: 'Are you sure?',
detail: e.toString(),
buttons: ['Erase config', 'Quit'],
defaultId: 1,
})
if (result.response === 1) {
this.platform.quit()
}
return {}
}
}
}
delete decryptedVault.config.vault
delete decryptedVault.config.encrypted
return {
...decryptedVault.config,
vault: store.vault,
encrypted: store.encrypted,
}
}
private async maybeEncryptConfig (store) {
if (!store.encrypted) {
return store
}
const vault = await this.vault.load()
if (!vault) {
throw new Error('Vault not configured')
}
vault.config = { ...store }
delete vault.config.vault
delete vault.config.encrypted
return {
vault: await this.vault.encrypt(vault),
encrypted: true,
}
}
}

View File

@@ -1,99 +1,14 @@
import type { Display } from 'electron'
import { Injectable } from '@angular/core'
import { ConfigService } from '../services/config.service'
import { ElectronService } from '../services/electron.service'
import { HostAppService, Bounds } from '../services/hostApp.service'
import { Observable, Subject } from 'rxjs'
@Injectable({ providedIn: 'root' })
export class DockingService {
/** @hidden */
private constructor (
private electron: ElectronService,
private config: ConfigService,
private hostApp: HostAppService,
) {
hostApp.displaysChanged$.subscribe(() => this.repositionWindow())
hostApp.displayMetricsChanged$.subscribe(() => this.repositionWindow())
}
dock (): void {
const dockSide = this.config.store.appearance.dock
if (dockSide === 'off') {
this.hostApp.setAlwaysOnTop(false)
return
}
let display = this.electron.screen.getAllDisplays()
.filter(x => x.id === this.config.store.appearance.dockScreen)[0]
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (!display) {
display = this.getCurrentScreen()
}
const newBounds: Bounds = { x: 0, y: 0, width: 0, height: 0 }
const fill = this.config.store.appearance.dockFill <= 1 ? this.config.store.appearance.dockFill : 1
const space = this.config.store.appearance.dockSpace <= 1 ? this.config.store.appearance.dockSpace : 1
const [minWidth, minHeight] = this.hostApp.getWindow().getMinimumSize()
if (dockSide === 'left' || dockSide === 'right') {
newBounds.width = Math.max(minWidth, Math.round(fill * display.bounds.width))
newBounds.height = Math.round(display.bounds.height * space)
}
if (dockSide === 'top' || dockSide === 'bottom') {
newBounds.width = Math.round(display.bounds.width * space)
newBounds.height = Math.max(minHeight, Math.round(fill * display.bounds.height))
}
if (dockSide === 'right') {
newBounds.x = display.bounds.x + display.bounds.width - newBounds.width
} else if (dockSide === 'left') {
newBounds.x = display.bounds.x
} else {
newBounds.x = display.bounds.x + Math.round(display.bounds.width / 2 * (1 - space))
}
if (dockSide === 'bottom') {
newBounds.y = display.bounds.y + display.bounds.height - newBounds.height
} else if (dockSide === 'top') {
newBounds.y = display.bounds.y
} else {
newBounds.y = display.bounds.y + Math.round(display.bounds.height / 2 * (1 - space))
}
const alwaysOnTop = this.config.store.appearance.dockAlwaysOnTop
this.hostApp.setAlwaysOnTop(alwaysOnTop)
setImmediate(() => {
this.hostApp.setBounds(newBounds)
})
}
getCurrentScreen (): Display {
return this.electron.screen.getDisplayNearestPoint(this.electron.screen.getCursorScreenPoint())
}
getScreens (): Display[] {
const primaryDisplayID = this.electron.screen.getPrimaryDisplay().id
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
).map((display, index) => {
return {
...display,
id: display.id,
name: display.id === primaryDisplayID ? 'Primary Display' : `Display ${index + 1}`,
}
})
}
private repositionWindow () {
const [x, y] = this.hostApp.getWindow().getPosition()
for (const screen of this.electron.screen.getAllDisplays()) {
const bounds = screen.bounds
if (x >= bounds.x && x <= bounds.x + bounds.width && y >= bounds.y && y <= bounds.y + bounds.height) {
return
}
}
const screen = this.electron.screen.getPrimaryDisplay()
this.hostApp.getWindow().setPosition(screen.bounds.x, screen.bounds.y)
}
export abstract class Screen {
id: number
name?: string
}
export abstract class DockingService {
get screensChanged$ (): Observable<void> { return this.screensChanged }
protected screensChanged = new Subject<void>()
abstract dock (): void
abstract getScreens (): Screen[]
}

View File

@@ -0,0 +1,48 @@
import { Inject, Injectable } from '@angular/core'
import { AppService, FileProvider, NotificationsService } from '../api'
@Injectable({ providedIn: 'root' })
export class FileProvidersService {
/** @hidden */
private constructor (
private app: AppService,
private notifications: NotificationsService,
@Inject(FileProvider) private fileProviders: FileProvider[],
) { }
async selectAndStoreFile (description: string): Promise<string> {
const p = await this.selectProvider()
return p.selectAndStoreFile(description)
}
async retrieveFile (key: string): Promise<Buffer> {
for (const p of this.fileProviders) {
try {
return await p.retrieveFile(key)
} catch {
continue
}
}
throw new Error('Not found')
}
async selectProvider (): Promise<FileProvider> {
const providers: FileProvider[] = []
await Promise.all(this.fileProviders.map(async p => {
if (await p.isAvailable()) {
providers.push(p)
}
}))
if (!providers.length) {
this.notifications.error('Vault master passphrase needs to be set to allow storing secrets')
throw new Error('No available file providers')
}
if (providers.length === 1) {
return providers[0]
}
return this.app.showSelector('Select file storage', providers.map(p => ({
name: p.name,
result: p,
})))
}
}

View File

@@ -1,9 +1,8 @@
import * as os from 'os'
import { Injectable } from '@angular/core'
import { ElectronService } from './electron.service'
import { ConfigService } from './config.service'
import { Injectable, Inject } from '@angular/core'
import * as mixpanel from 'mixpanel'
import { v4 as uuidv4 } from 'uuid'
import { ConfigService } from './config.service'
import { PlatformService, BOOTSTRAP_DATA, BootstrapData } from '../api'
@Injectable({ providedIn: 'root' })
export class HomeBaseService {
@@ -12,10 +11,11 @@ export class HomeBaseService {
/** @hidden */
private constructor (
private electron: ElectronService,
private config: ConfigService,
private platform: PlatformService,
@Inject(BOOTSTRAP_DATA) private bootstrapData: BootstrapData,
) {
this.appVersion = electron.app.getVersion()
this.appVersion = platform.getAppVersion()
if (this.config.store.enableAnalytics && !this.config.store.enableWelcomeTab) {
this.enableAnalytics()
@@ -23,12 +23,12 @@ export class HomeBaseService {
}
openGitHub (): void {
this.electron.shell.openExternal('https://github.com/eugeny/terminus')
this.platform.openExternal('https://github.com/eugeny/terminus')
}
reportBug (): void {
let body = `Version: ${this.appVersion}\n`
body += `Platform: ${os.platform()} ${os.release()}\n`
body += `Platform: ${process.platform} ${this.platform.getOSRelease()}\n`
const label = {
aix: 'OS: IBM AIX',
android: 'OS: Android',
@@ -38,10 +38,10 @@ export class HomeBaseService {
openbsd: 'OS: OpenBSD',
sunos: 'OS: Solaris',
win32: 'OS: Windows',
}[os.platform()]
const plugins = (window as any).installedPlugins.filter(x => !x.isBuiltin).map(x => x.name)
}[process.platform]
const plugins = this.bootstrapData.installedPlugins.filter(x => !x.isBuiltin).map(x => x.name)
body += `Plugins: ${plugins.join(', ') || 'none'}\n\n`
this.electron.shell.openExternal(`https://github.com/eugeny/terminus/issues/new?body=${encodeURIComponent(body)}&labels=${label}`)
this.platform.openExternal(`https://github.com/eugeny/terminus/issues/new?body=${encodeURIComponent(body)}&labels=${label}`)
}
enableAnalytics (): void {
@@ -60,7 +60,7 @@ export class HomeBaseService {
return {
distinct_id: window.localStorage.analyticsUserID,
platform: process.platform,
os: os.release(),
os: this.platform.getOSRelease(),
version: this.appVersion,
}
}

View File

@@ -1,319 +0,0 @@
import type { BrowserWindow, TouchBar, MenuItemConstructorOptions } from 'electron'
import * as path from 'path'
import * as fs from 'mz/fs'
import shellEscape from 'shell-escape'
import { Observable, Subject } from 'rxjs'
import { Injectable, NgZone, EventEmitter } from '@angular/core'
import { ElectronService } from './electron.service'
import { Logger, LogService } from './log.service'
import { isWindowsBuild, WIN_BUILD_FLUENT_BG_SUPPORTED } from '../utils'
/* eslint-disable block-scoped-var */
try {
var wnr = require('windows-native-registry') // eslint-disable-line @typescript-eslint/no-var-requires, no-var
} catch (_) { }
export enum Platform {
Linux = 'Linux',
macOS = 'macOS',
Windows = 'Windows',
}
export interface Bounds {
x: number
y: number
width: number
height: number
}
/**
* Provides interaction with the main process
*/
@Injectable({ providedIn: 'root' })
export class HostAppService {
platform: Platform
/**
* Fired once the window is visible
*/
shown = new EventEmitter<any>()
isFullScreen = false
isPortable = !!process.env.PORTABLE_EXECUTABLE_FILE
private preferencesMenu = new Subject<void>()
private secondInstance = new Subject<void>()
private cliOpenDirectory = new Subject<string>()
private cliRunCommand = new Subject<string[]>()
private cliPaste = new Subject<string>()
private cliOpenProfile = new Subject<string>()
private configChangeBroadcast = new Subject<void>()
private windowCloseRequest = new Subject<void>()
private windowMoved = new Subject<void>()
private windowFocused = new Subject<void>()
private displayMetricsChanged = new Subject<void>()
private displaysChanged = new Subject<void>()
private logger: Logger
private windowId: number
/**
* Fired when Preferences is selected in the macOS menu
*/
get preferencesMenu$ (): Observable<void> { return this.preferencesMenu }
/**
* Fired when a second instance of Terminus is launched
*/
get secondInstance$ (): Observable<void> { return this.secondInstance }
/**
* Fired for the `terminus open` CLI command
*/
get cliOpenDirectory$ (): Observable<string> { return this.cliOpenDirectory }
/**
* Fired for the `terminus run` CLI command
*/
get cliRunCommand$ (): Observable<string[]> { return this.cliRunCommand }
/**
* Fired for the `terminus paste` CLI command
*/
get cliPaste$ (): Observable<string> { return this.cliPaste }
/**
* Fired for the `terminus profile` CLI command
*/
get cliOpenProfile$ (): Observable<string> { return this.cliOpenProfile }
/**
* Fired when another window modified the config file
*/
get configChangeBroadcast$ (): Observable<void> { return this.configChangeBroadcast }
/**
* Fired when the window close button is pressed
*/
get windowCloseRequest$ (): Observable<void> { return this.windowCloseRequest }
get windowMoved$ (): Observable<void> { return this.windowMoved }
get windowFocused$ (): Observable<void> { return this.windowFocused }
get displayMetricsChanged$ (): Observable<void> { return this.displayMetricsChanged }
get displaysChanged$ (): Observable<void> { return this.displaysChanged }
private constructor (
private zone: NgZone,
private electron: ElectronService,
log: LogService,
) {
this.logger = log.create('hostApp')
this.platform = {
win32: Platform.Windows,
darwin: Platform.macOS,
linux: Platform.Linux,
}[process.platform]
this.windowId = parseInt(location.search.substring(1))
this.logger.info('Window ID:', this.windowId)
electron.ipcRenderer.on('host:preferences-menu', () => this.zone.run(() => this.preferencesMenu.next()))
electron.ipcRenderer.on('uncaughtException', (_$event, err) => {
this.logger.error('Unhandled exception:', err)
})
electron.ipcRenderer.on('host:window-enter-full-screen', () => this.zone.run(() => {
this.isFullScreen = true
}))
electron.ipcRenderer.on('host:window-leave-full-screen', () => this.zone.run(() => {
this.isFullScreen = false
}))
electron.ipcRenderer.on('host:window-shown', () => {
this.zone.run(() => this.shown.emit())
})
electron.ipcRenderer.on('host:window-close-request', () => {
this.zone.run(() => this.windowCloseRequest.next())
})
electron.ipcRenderer.on('host:window-moved', () => {
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', () => {
this.zone.run(() => this.displayMetricsChanged.next())
})
electron.ipcRenderer.on('host:displays-changed', () => {
this.zone.run(() => this.displaysChanged.next())
})
electron.ipcRenderer.on('cli', (_$event, argv: any, cwd: string, secondInstance: boolean) => this.zone.run(async () => {
this.logger.info('Second instance', argv)
const op = argv._[0]
const opAsPath = op ? path.resolve(cwd, op) : null
if (op === 'open') {
this.cliOpenDirectory.next(path.resolve(cwd, argv.directory))
} else if (op === 'run') {
this.cliRunCommand.next(argv.command)
} else if (op === 'paste') {
let text = argv.text
if (argv.escape) {
text = shellEscape([text])
}
this.cliPaste.next(text)
} else if (op === 'profile') {
this.cliOpenProfile.next(argv.profileName)
} else if (secondInstance && op === undefined) {
this.newWindow()
} else if (opAsPath && (await fs.lstat(opAsPath)).isDirectory()) {
this.cliOpenDirectory.next(opAsPath)
}
if (secondInstance) {
this.secondInstance.next()
}
}))
electron.ipcRenderer.on('host:config-change', () => this.zone.run(() => {
this.configChangeBroadcast.next()
}))
if (isWindowsBuild(WIN_BUILD_FLUENT_BG_SUPPORTED)) {
electron.ipcRenderer.send('window-set-disable-vibrancy-while-dragging', true)
}
}
/**
* Returns the current remote [[BrowserWindow]]
*/
getWindow (): BrowserWindow {
return this.electron.BrowserWindow.fromId(this.windowId)!
}
newWindow (): void {
this.electron.ipcRenderer.send('app:new-window')
}
toggleFullscreen (): void {
const window = this.getWindow()
window.setFullScreen(!this.isFullScreen)
}
openDevTools (): void {
this.getWindow().webContents.openDevTools({ mode: 'undocked' })
}
focusWindow (): void {
this.electron.ipcRenderer.send('window-focus')
}
minimize (): void {
this.electron.ipcRenderer.send('window-minimize')
}
maximize (): void {
this.electron.ipcRenderer.send('window-maximize')
}
unmaximize (): void {
this.electron.ipcRenderer.send('window-unmaximize')
}
toggleMaximize (): void {
this.electron.ipcRenderer.send('window-toggle-maximize')
}
setBounds (bounds: Bounds): void {
this.electron.ipcRenderer.send('window-set-bounds', bounds)
}
setAlwaysOnTop (flag: boolean): void {
this.electron.ipcRenderer.send('window-set-always-on-top', flag)
}
/**
* Sets window vibrancy mode (Windows, macOS)
*
* @param type `null`, or `fluent` when supported (Windowd only)
*/
setVibrancy (enable: boolean, type: string|null): void {
if (this.platform === Platform.Windows && !isWindowsBuild(WIN_BUILD_FLUENT_BG_SUPPORTED)) {
type = null
}
document.body.classList.toggle('vibrant', enable)
this.electron.ipcRenderer.send('window-set-vibrancy', enable, type)
}
setTitle (title?: string): void {
this.electron.ipcRenderer.send('window-set-title', title ?? 'Terminus')
}
setTouchBar (touchBar: TouchBar): void {
this.getWindow().setTouchBar(touchBar)
}
popupContextMenu (menuDefinition: MenuItemConstructorOptions[]): void {
this.electron.Menu.buildFromTemplate(menuDefinition).popup({})
}
/**
* Notifies other windows of config file changes
*/
broadcastConfigChange (configStore: Record<string, any>): void {
this.electron.ipcRenderer.send('app:config-change', configStore)
}
emitReady (): void {
this.electron.ipcRenderer.send('app:ready')
}
bringToFront (): void {
this.electron.ipcRenderer.send('window-bring-to-front')
}
closeWindow (): void {
this.electron.ipcRenderer.send('window-close')
}
registerGlobalHotkey (specs: string[]): void {
this.electron.ipcRenderer.send('app:register-global-hotkey', specs)
}
useBuiltinGraphics (): void {
const keyPath = 'SOFTWARE\\Microsoft\\DirectX\\UserGpuPreferences'
const valueName = this.electron.app.getPath('exe')
if (this.platform === Platform.Windows) {
if (!wnr.getRegistryValue(wnr.HK.CU, keyPath, valueName)) {
wnr.setRegistryValue(wnr.HK.CU, keyPath, valueName, wnr.REG.SZ, 'GpuPreference=1;')
}
}
}
setTrafficLightInset (x: number, y: number): void {
this.getWindow().setTrafficLightPosition({ x, y })
}
relaunch (): void {
if (this.isPortable) {
this.electron.app.relaunch({ execPath: process.env.PORTABLE_EXECUTABLE_FILE })
} else {
this.electron.app.relaunch()
}
this.electron.app.exit()
}
quit (): void {
this.logger.info('Quitting')
this.electron.app.quit()
}
}

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