Compare commits

..

87 Commits

Author SHA1 Message Date
Eugene Pankov
f91754ce7c build fix 2021-12-09 14:10:49 +01:00
Eugene Pankov
5911794b20 Update build.yml 2021-12-09 13:29:08 +01:00
Eugene Pankov
f640bf9443 Revert "Update build.yml"
This reverts commit 9f50d8506c.
2021-12-09 13:28:55 +01:00
Eugene Pankov
9f50d8506c Update build.yml 2021-12-09 13:02:26 +01:00
Eugene Pankov
361f6c2fe5 Update build.yml 2021-12-09 11:25:46 +01:00
Eugene Pankov
8cac38e1ef Update build.yml 2021-12-09 11:18:31 +01:00
Eugene Pankov
75757d027e Update README.md 2021-12-09 01:07:52 +01:00
Eugene Pankov
0c8b6e56da theme tweaks 2021-12-08 23:33:45 +01:00
Eugene Pankov
5be4a12ee5 theme updates 2021-12-08 23:25:46 +01:00
Eugene Pankov
433c7d33d9 fixed tab title recovery for split tabs - fixes #4810 2021-12-08 21:45:58 +01:00
Eugene Pankov
b755346ac0 fixed #5001 2021-12-08 21:01:48 +01:00
Eugene Pankov
4c663e4a20 profile settings: allow filtering by description - fixes #5022 2021-12-08 20:58:13 +01:00
Eugene Pankov
a34e4c236d lint 2021-12-08 20:38:16 +01:00
Eugene Pankov
b2b91f0cfd fixed X11 display spec parsing - fixes #5073, fixes #4978 2021-12-08 20:25:37 +01:00
Eugene Pankov
bbb02f4e64 bundle the clickable-links plugin with Tabby 2021-12-08 19:54:26 +01:00
Eugene Pankov
3eaf46e09d disabled ssh algorithm blacklist by default - fixes #4995, fixes #5072 2021-12-08 19:32:41 +01:00
Eugeny
fc02d27056 Merge pull request #5052 from Eugeny/dependabot/npm_and_yarn/node-sass-7.0.0 2021-12-07 09:10:48 +01:00
Eugeny
0fe7d81a5f Merge pull request #4988 from Eugeny/dependabot/npm_and_yarn/typedoc-0.22.10 2021-12-07 09:10:17 +01:00
dependabot[bot]
59dbe6ba83 Bump node-sass from 6.0.1 to 7.0.0
Bumps [node-sass](https://github.com/sass/node-sass) from 6.0.1 to 7.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/v6.0.1...v7.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-07 04:05:50 +00:00
Eugene Pankov
860a577ddb fixed ESM default imports 2021-12-06 19:13:26 +01:00
dependabot[bot]
2edb9cc5b8 Bump typedoc from 0.22.9 to 0.22.10
Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.22.9 to 0.22.10.
- [Release notes](https://github.com/TypeStrong/TypeDoc/releases)
- [Changelog](https://github.com/TypeStrong/typedoc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/TypeStrong/TypeDoc/compare/v0.22.9...v0.22.10)

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

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-06 17:39:46 +00:00
Eugene Pankov
5bc13965e1 Update package.json 2021-12-06 18:35:33 +01:00
Eugene Pankov
2ca93fdb98 Update build.yml 2021-12-06 18:16:20 +01:00
Eugene Pankov
aa62ca9a6e Update ssh.ts 2021-12-06 18:12:54 +01:00
Eugene Pankov
1928cda394 Update build.yml 2021-12-06 18:06:07 +01:00
Eugene Pankov
64f8e033c4 Update ssh.ts 2021-12-06 18:03:22 +01:00
Eugene Pankov
23280c2143 Update build.yml 2021-12-06 17:46:38 +01:00
Eugene Pankov
d2ec08e3f8 build updates 2021-12-06 12:14:06 +01:00
Eugeny
b186f986ac Merge pull request #4964 from Eugeny/dependabot/npm_and_yarn/app/electron-updater-4.6.1 2021-12-06 11:51:05 +01:00
Eugeny
dbf91228fe Merge pull request #4970 from Eugeny/dependabot/npm_and_yarn/electron-builder-22.14.5 2021-12-06 11:50:42 +01:00
Eugeny
b58198b82b Merge pull request #4996 from Eugeny/dependabot/npm_and_yarn/webpack-5.64.4 2021-12-06 11:50:03 +01:00
Eugeny
eca92760f3 Merge pull request #5002 from Eugeny/dependabot/npm_and_yarn/app/serialport-9.2.8 2021-12-06 11:49:50 +01:00
Eugeny
d4815ca827 Merge pull request #4997 from Eugeny/dependabot/npm_and_yarn/tabby-ssh/types/ssh2-0.5.49 2021-12-06 11:49:33 +01:00
Eugeny
4c19122acb Merge pull request #5009 from Eugeny/dependabot/github_actions/actions/setup-node-2.5.0 2021-12-06 11:49:25 +01:00
Eugene Pankov
6bdbca4e19 Update build.yml 2021-12-06 11:46:52 +01:00
Eugene Pankov
bb47a5d76f ssh: respect keyboard-interactive prompt echo setting - fixes #5045 2021-12-06 09:19:49 +01:00
Eugene Pankov
f308fd481d bumped plugins 2021-12-06 09:19:32 +01:00
Eugene Pankov
34adf767eb ensure patch-package runs on web 2021-12-01 10:04:09 +01:00
Eugene Pankov
2c6a26b01a bumped windows build image 2021-11-30 19:05:49 +01:00
dependabot[bot]
e596553dbf Bump actions/setup-node from 2.4.0 to 2.5.0
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 2.4.0 to 2.5.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v2.4.0...v2.5.0)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-30 04:14:38 +00:00
dependabot[bot]
990b1b8623 Bump serialport from 9.2.5 to 9.2.8 in /app
Bumps [serialport](https://github.com/serialport/node-serialport) from 9.2.5 to 9.2.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.2.5...@serialport/bindings@9.2.8)

---
updated-dependencies:
- dependency-name: serialport
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-29 04:01:51 +00:00
Eugene Pankov
9856249c88 fixed #5000 - native socksv5 connection support in ssh and connection mode UI overhaul 2021-11-28 18:21:26 +01:00
dependabot[bot]
7818f0642f Bump @types/ssh2 from 0.5.48 to 0.5.49 in /tabby-ssh
Bumps [@types/ssh2](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/ssh2) from 0.5.48 to 0.5.49.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/ssh2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-26 04:20:02 +00:00
dependabot[bot]
bcea319eb8 Bump webpack from 5.61.0 to 5.64.4
Bumps [webpack](https://github.com/webpack/webpack) from 5.61.0 to 5.64.4.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.61.0...v5.64.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-26 04:05:14 +00:00
Eugeny
246ae9fe77 Merge pull request #4993 from Eugeny/all-contributors/add-NessunKim 2021-11-25 12:36:26 +01:00
allcontributors[bot]
b4a678640e docs: update .all-contributorsrc [skip ci] 2021-11-25 11:36:13 +00:00
allcontributors[bot]
8692c17ea4 docs: update README.md [skip ci] 2021-11-25 11:36:12 +00:00
Eugeny
59ee098fde Merge pull request #4992 from NessunKim/hotkey-backticks 2021-11-25 12:36:11 +01:00
Nessun Kim
cd09043558 Fix hotkey setter to handle backticks and tildes properly 2021-11-25 20:12:00 +09:00
dependabot[bot]
be8f8eec70 Bump electron-builder from 22.11.7 to 22.14.5
Bumps [electron-builder](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-builder) from 22.11.7 to 22.14.5.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/packages/electron-builder/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/commits/v22.14.5/packages/electron-builder)

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

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-22 04:07:44 +00:00
dependabot[bot]
85fb2c5725 Bump electron-updater from 4.3.9 to 4.6.1 in /app
Bumps [electron-updater](https://github.com/electron-userland/electron-builder/tree/HEAD/packages/electron-updater) from 4.3.9 to 4.6.1.
- [Release notes](https://github.com/electron-userland/electron-builder/releases)
- [Changelog](https://github.com/electron-userland/electron-builder/blob/master/packages/electron-updater/CHANGELOG.md)
- [Commits](https://github.com/electron-userland/electron-builder/commits/HEAD/packages/electron-updater)

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

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-22 04:02:00 +00:00
Eugene Pankov
2baede4675 ignore fewer errors in profileSettingsTab 2021-11-21 17:51:32 +01:00
Eugeny
176992a629 Merge pull request #4962 from highfredo/master 2021-11-21 17:49:06 +01:00
highfredo
905e7ffc43 Deepclone profile before passing it to the configuration component and fix uncaught error on modal dismiss 2021-11-21 13:43:02 +01:00
Eugene Pankov
8ff130ebfd fixed #4931 - allow empty username to work with winscp integration 2021-11-20 17:39:10 +01:00
Eugene Pankov
064bcb31d8 fixed toolbar color in paper theme - fixes #4954 2021-11-20 17:24:09 +01:00
Eugene Pankov
25e4e5e8b4 Merge branch 'master' of github.com:Eugeny/tabby 2021-11-20 13:36:32 +01:00
Eugene Pankov
e3018086fb build against an older glibc 2021-11-20 13:36:27 +01:00
Eugeny
f3908da0a6 Merge pull request #4889 from Eugeny/dependabot/npm_and_yarn/shell-quote-1.7.3 2021-11-19 22:58:43 +01:00
Eugeny
2e57ffb169 Merge pull request #4907 from Eugeny/dependabot/npm_and_yarn/electron-rebuild-3.2.5 2021-11-19 22:58:11 +01:00
Eugeny
bda8199e5d Merge pull request #4923 from Eugeny/dependabot/npm_and_yarn/typedoc-0.22.9 2021-11-19 22:57:50 +01:00
Eugeny
a6cbb64f59 Merge pull request #4960 from Eugeny/all-contributors/add-highfredo 2021-11-19 22:57:03 +01:00
allcontributors[bot]
8b1efaeb53 docs: update .all-contributorsrc [skip ci] 2021-11-19 21:56:14 +00:00
allcontributors[bot]
fa767adf52 docs: update README.md [skip ci] 2021-11-19 21:56:13 +00:00
Eugene Pankov
096a6128c9 style tweaks 2021-11-19 22:53:34 +01:00
highfredo
a5fa022792 Autofill port forwarding inputs with the deleted port 2021-11-19 20:18:32 +01:00
highfredo
2922df08f4 Add description to ssh port forwarding 2021-11-19 20:17:08 +01:00
Eugeny
700aae3ab0 Merge pull request #4929 from Eugeny/all-contributors/add-composer404 2021-11-15 21:49:06 +01:00
allcontributors[bot]
cad6b4d1ee docs: update .all-contributorsrc [skip ci] 2021-11-15 20:45:34 +00:00
Eugeny
2b57061949 Merge pull request #4928 from composer404/master 2021-11-15 21:45:33 +01:00
allcontributors[bot]
ca5b0a95d9 docs: update README.md [skip ci] 2021-11-15 20:45:33 +00:00
Eugene Pankov
0e3b486e22 don't auto-update on quit 2021-11-15 21:44:02 +01:00
Kozik Przemysław
f3e5ad4a2a Merge branch 'master' of github.com:composer404/tabby 2021-11-15 20:22:25 +01:00
Kozik Przemysław
ad2ab61927 toolbar icons update 2021-11-15 20:21:58 +01:00
Kozik Przemysław
e2464cf3b1 Merge branch 'master' of github.com:composer404/tabby 2021-11-15 20:19:00 +01:00
Kozik Przemysław
4c2959b4c4 toolbar icons update 2021-11-15 20:18:28 +01:00
Kozik Przemysław
4718e9ff22 Toolbar icons update 2021-11-15 20:16:24 +01:00
dependabot[bot]
8899e57f81 Bump typedoc from 0.22.7 to 0.22.9
Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.22.7 to 0.22.9.
- [Release notes](https://github.com/TypeStrong/TypeDoc/releases)
- [Changelog](https://github.com/TypeStrong/typedoc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/TypeStrong/TypeDoc/compare/v0.22.7...v0.22.9)

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

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-15 04:08:47 +00:00
Eugene Pankov
14098177e4 bumped plugins 2021-11-14 16:23:29 +01:00
Eugene Pankov
3c68e2bd29 config sync is experimental no more 2021-11-14 15:50:40 +01:00
Eugeny
bebec4f638 Merge pull request #4921 from composer404/master 2021-11-14 15:33:54 +01:00
Kozik Przemysław
f16f00cc7e update plugin list in KR version 2021-11-14 15:06:26 +01:00
Kozik Przemysław
b01b25b084 plugin list update 2021-11-14 14:59:49 +01:00
Eugene Pankov
39389f77d0 added support for long-clicking for context menu when right click is set to paste (#4858) 2021-11-14 10:59:08 +01:00
Eugene Pankov
a1dbcdbae3 handle failing dscl 2021-11-13 19:04:30 +01:00
dependabot[bot]
f379159a70 Bump electron-rebuild from 3.2.3 to 3.2.5
Bumps [electron-rebuild](https://github.com/electron/electron-rebuild) from 3.2.3 to 3.2.5.
- [Release notes](https://github.com/electron/electron-rebuild/releases)
- [Changelog](https://github.com/electron/electron-rebuild/blob/master/.releaserc.json)
- [Commits](https://github.com/electron/electron-rebuild/compare/v3.2.3...v3.2.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-11 04:03:25 +00:00
dependabot[bot]
ec850344fc Bump shell-quote from 1.7.2 to 1.7.3
Bumps [shell-quote](https://github.com/substack/node-shell-quote) from 1.7.2 to 1.7.3.
- [Release notes](https://github.com/substack/node-shell-quote/releases)
- [Changelog](https://github.com/substack/node-shell-quote/blob/master/CHANGELOG.md)
- [Commits](https://github.com/substack/node-shell-quote/compare/v1.7.2...1.7.3)

---
updated-dependencies:
- dependency-name: shell-quote
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-08 04:06:41 +00:00
95 changed files with 1209 additions and 642 deletions

View File

@@ -469,6 +469,33 @@
"contributions": [ "contributions": [
"code" "code"
] ]
},
{
"login": "composer404",
"name": "Przemyslaw Kozik",
"avatar_url": "https://avatars.githubusercontent.com/u/58251560?v=4",
"profile": "https://github.com/composer404",
"contributions": [
"design"
]
},
{
"login": "highfredo",
"name": "Alfredo Arellano de la Fuente",
"avatar_url": "https://avatars.githubusercontent.com/u/5951524?v=4",
"profile": "https://github.com/highfredo",
"contributions": [
"code"
]
},
{
"login": "NessunKim",
"name": "MH Kim",
"avatar_url": "https://avatars.githubusercontent.com/u/12974079?v=4",
"profile": "https://github.com/NessunKim",
"contributions": [
"code"
]
} }
], ],
"contributorsPerLine": 7, "contributorsPerLine": 7,

View File

@@ -11,9 +11,9 @@ jobs:
fetch-depth: 0 fetch-depth: 0
- name: Installing Node - name: Installing Node
uses: actions/setup-node@v2.4.0 uses: actions/setup-node@v2.5.0
with: with:
node-version: 14 node-version: 16
- name: Install deps - name: Install deps
run: | run: |
@@ -46,9 +46,9 @@ jobs:
fetch-depth: 0 fetch-depth: 0
- name: Installing Node - name: Installing Node
uses: actions/setup-node@v2.4.0 uses: actions/setup-node@v2.5.0
with: with:
node-version: 14 node-version: 16
- name: Install deps - name: Install deps
run: | run: |
@@ -129,7 +129,7 @@ jobs:
path: artifact-zip path: artifact-zip
Linux-Build: Linux-Build:
runs-on: ubuntu-latest runs-on: ubuntu-18.04 # build against an older glibc for compatibility
needs: Lint needs: Lint
steps: steps:
@@ -139,9 +139,9 @@ jobs:
fetch-depth: 0 fetch-depth: 0
- name: Install Node - name: Install Node
uses: actions/setup-node@v2.4.0 uses: actions/setup-node@v2.5.0
with: with:
node-version: 14 node-version: 16
- name: Install deps - name: Install deps
run: | run: |
@@ -153,7 +153,6 @@ jobs:
cd .. cd ..
rm app/node_modules/.yarn-integrity rm app/node_modules/.yarn-integrity
yarn yarn
npm run patch
- name: Build native deps - name: Build native deps
run: scripts/build-native.js run: scripts/build-native.js
@@ -244,7 +243,7 @@ jobs:
path: artifact-web path: artifact-web
Windows-Build: Windows-Build:
runs-on: windows-2016 runs-on: windows-2022
needs: Lint needs: Lint
steps: steps:
@@ -254,9 +253,14 @@ jobs:
fetch-depth: 0 fetch-depth: 0
- name: Installing Node - name: Installing Node
uses: actions/setup-node@v2.4.0 uses: actions/setup-node@v2.5.0
with: with:
node-version: 14 node-version: 16
- name: Update node-gyp
run: |
npm install --global node-gyp@8.4.1
npm prefix -g | % {npm config set node_gyp "$_\node_modules\node-gyp\bin\node-gyp.js"}
- name: Build - name: Build
shell: powershell shell: powershell
@@ -274,7 +278,7 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }} WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }}
WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }} WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}
# DEBUG: electron-builder,electron-builder:* DEBUG: electron-builder,electron-builder:*
- name: Build packages without signing - name: Build packages without signing
run: node scripts/build-windows.js run: node scripts/build-windows.js

View File

@@ -12,7 +12,7 @@ jobs:
fetch-depth: 0 fetch-depth: 0
- name: Installing Node - name: Installing Node
uses: actions/setup-node@v2.4.0 uses: actions/setup-node@v2.5.0
with: with:
node-version: 14 node-version: 14

View File

@@ -109,6 +109,8 @@
* [save-output](https://github.com/Eugeny/tabby-save-output) - 터미널 출력을 파일에 기록 * [save-output](https://github.com/Eugeny/tabby-save-output) - 터미널 출력을 파일에 기록
* [sync-config](https://github.com/starxg/terminus-sync-config) - 구성을 Gist 또는 Gitee에 동기화 * [sync-config](https://github.com/starxg/terminus-sync-config) - 구성을 Gist 또는 Gitee에 동기화
* [clippy](https://github.com/Eugeny/tabby-clippy) - 항상 당신을 귀찮게 하는 예제 플러그인 * [clippy](https://github.com/Eugeny/tabby-clippy) - 항상 당신을 귀찮게 하는 예제 플러그인
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - 주어진 구성을 기반으로 사용자 정의 작업 공간 프로필을 생성할 수 있습니다
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - Tabby의 탭에서 선택한 텍스트로 기본 시스템 브라우저를 엽니다
<a name="themes"></a> <a name="themes"></a>
# 테마 # 테마

View File

@@ -2,7 +2,7 @@
<p align="center"> <p align="center">
<a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="GitHub All Releases" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=DOWNLOADS&logo=github&style=for-the-badge"></a> &nbsp; <a href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a> &nbsp; <a href="https://matrix.to/#/#tabby-general:matrix.org"><img alt="Matrix" src="https://img.shields.io/matrix/tabby-general:matrix.org?logo=matrix&style=for-the-badge&color=magenta"></a> <a href="https://github.com/Eugeny/tabby/releases/latest"><img alt="GitHub All Releases" src="https://img.shields.io/github/downloads/eugeny/tabby/total.svg?label=DOWNLOADS&logo=github&style=for-the-badge"></a> &nbsp; <a href="https://nightly.link/Eugeny/tabby/workflows/build/master"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=for-the-badge"/></a> &nbsp; <a href="https://matrix.to/#/#tabby-general:matrix.org"><img alt="Matrix" src="https://img.shields.io/matrix/tabby-general:matrix.org?logo=matrix&style=for-the-badge&color=magenta"></a> &nbsp; <a href="https://twitter.com/eugeeeeny"><img alt="Twitter" src="https://shields.io/badge/Subscribe-News-blue?logo=twitter&style=for-the-badge&color=blue"></a>
</p> </p>
<p align="center"> <p align="center">
@@ -115,6 +115,8 @@ Plugins and themes can be installed directly from the Settings view inside Tabby
* [save-output](https://github.com/Eugeny/tabby-save-output) - record terminal output into a file * [save-output](https://github.com/Eugeny/tabby-save-output) - record terminal output into a file
* [sync-config](https://github.com/starxg/terminus-sync-config) - sync the config to Gist or Gitee * [sync-config](https://github.com/starxg/terminus-sync-config) - sync the config to Gist or Gitee
* [clippy](https://github.com/Eugeny/tabby-clippy) - an example plugin which annoys you all the time * [clippy](https://github.com/Eugeny/tabby-clippy) - an example plugin which annoys you all the time
* [workspace-manager](https://github.com/composer404/tabby-workspace-manager) - allows creating custom workspace profiles based on the given config
* [search-in-browser](https://github.com/composer404/tabby-search-in-browser) - opens default system browser with a text selected from the Tabby's tab
<a name="themes"></a> <a name="themes"></a>
# Themes # Themes
@@ -213,6 +215,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<tr> <tr>
<td align="center"><a href="https://github.com/Me1onRind"><img src="https://avatars.githubusercontent.com/u/19531270?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zZ</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Me1onRind" title="Code">💻</a></td> <td align="center"><a href="https://github.com/Me1onRind"><img src="https://avatars.githubusercontent.com/u/19531270?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zZ</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Me1onRind" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/tainoNZ"><img src="https://avatars.githubusercontent.com/u/49261322?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aaron Davison</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=tainoNZ" title="Code">💻</a></td> <td align="center"><a href="https://github.com/tainoNZ"><img src="https://avatars.githubusercontent.com/u/49261322?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aaron Davison</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=tainoNZ" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/composer404"><img src="https://avatars.githubusercontent.com/u/58251560?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Przemyslaw Kozik</b></sub></a><br /><a href="#design-composer404" title="Design">🎨</a></td>
<td align="center"><a href="https://github.com/highfredo"><img src="https://avatars.githubusercontent.com/u/5951524?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alfredo Arellano de la Fuente</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=highfredo" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/NessunKim"><img src="https://avatars.githubusercontent.com/u/12974079?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MH Kim</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=NessunKim" title="Code">💻</a></td>
</tr> </tr>
</table> </table>

View File

@@ -1,5 +1,5 @@
import { app, ipcMain, Menu, Tray, shell, screen, globalShortcut, MenuItemConstructorOptions } from 'electron' import { app, ipcMain, Menu, Tray, shell, screen, globalShortcut, MenuItemConstructorOptions } from 'electron'
import * as promiseIpc from 'electron-promise-ipc' import promiseIpc from 'electron-promise-ipc'
import * as remote from '@electron/remote/main' import * as remote from '@electron/remote/main'
import { exec } from 'mz/child_process' import { exec } from 'mz/child_process'
import * as path from 'path' import * as path from 'path'
@@ -54,7 +54,11 @@ export class Application {
}) })
;(promiseIpc as any).on('get-default-mac-shell', async () => { ;(promiseIpc as any).on('get-default-mac-shell', async () => {
return (await exec(`/usr/bin/dscl . -read /Users/${process.env.LOGNAME} UserShell`))[0].toString().split(' ')[1].trim() try {
return (await exec(`/usr/bin/dscl . -read /Users/${process.env.LOGNAME} UserShell`))[0].toString().split(' ')[1].trim()
} catch {
return '/bin/bash'
}
}) })
const configData = loadConfig() const configData = loadConfig()

View File

@@ -1,4 +1,4 @@
import * as LRU from 'lru-cache' import LRU from 'lru-cache'
import * as fs from 'fs' import * as fs from 'fs'
const lru = new LRU({ max: 256, maxAge: 250 }) const lru = new LRU({ max: 256, maxAge: 250 })
const origLstat = fs.realpathSync.bind(fs) const origLstat = fs.realpathSync.bind(fs)

View File

@@ -90,6 +90,7 @@ class PTYDataQueue {
export class PTY { export class PTY {
private pty: nodePTY.IPty private pty: nodePTY.IPty
private outputQueue: PTYDataQueue private outputQueue: PTYDataQueue
exited = false
constructor (private id: string, private app: Application, ...args: any[]) { constructor (private id: string, private app: Application, ...args: any[]) {
this.pty = (nodePTY as any).spawn(...args) this.pty = (nodePTY as any).spawn(...args)
@@ -101,7 +102,10 @@ export class PTY {
setImmediate(() => this.emit('data', data)) setImmediate(() => this.emit('data', data))
}) })
this.pty.on('data', data => this.outputQueue.push(Buffer.from(data))) this.pty.onData(data => this.outputQueue.push(Buffer.from(data)))
this.pty.onExit(() => {
this.exited = true
})
} }
getPID (): number { getPID (): number {
@@ -144,7 +148,7 @@ export class PTYManager {
}) })
ipcMain.on('pty:exists', (event, id) => { ipcMain.on('pty:exists', (event, id) => {
event.returnValue = !!this.ptys[id] event.returnValue = !this.ptys[id]?.exited
}) })
ipcMain.on('pty:get-pid', (event, id) => { ipcMain.on('pty:get-pid', (event, id) => {

View File

@@ -6,7 +6,7 @@ import ElectronConfig = require('electron-config')
import * as os from 'os' import * as os from 'os'
import * as path from 'path' import * as path from 'path'
import macOSRelease from 'macos-release' import macOSRelease from 'macos-release'
import * as compareVersions from 'compare-versions' import { compare as compareVersions } from 'compare-versions'
import type { Application } from './app' import type { Application } from './app'
import { parseArgs } from './cli' import { parseArgs } from './cli'
@@ -26,7 +26,7 @@ abstract class GlasstronWindow extends BrowserWindow {
abstract setBlur (_: boolean) abstract setBlur (_: boolean)
} }
const macOSVibrancyType = process.platform === 'darwin' ? compareVersions.compare(macOSRelease().version, '10.14', '>=') ? 'fullscreen-ui' : 'dark' : null const macOSVibrancyType = process.platform === 'darwin' ? compareVersions(macOSRelease().version, '10.14', '>=') ? 'fullscreen-ui' : 'dark' : null
const activityIcon = nativeImage.createFromPath(`${app.getAppPath()}/assets/activity.png`) const activityIcon = nativeImage.createFromPath(`${app.getAppPath()}/assets/activity.png`)

View File

@@ -21,7 +21,7 @@
"electron-config": "2.0.0", "electron-config": "2.0.0",
"electron-debug": "^3.2.0", "electron-debug": "^3.2.0",
"electron-promise-ipc": "^2.2.4", "electron-promise-ipc": "^2.2.4",
"electron-updater": "^4.3.9", "electron-updater": "^4.6.1",
"fontmanager-redux": "1.1.0", "fontmanager-redux": "1.1.0",
"glasstron": "0.0.7", "glasstron": "0.0.7",
"js-yaml": "4.1.0", "js-yaml": "4.1.0",
@@ -36,7 +36,7 @@
}, },
"optionalDependencies": { "optionalDependencies": {
"macos-native-processlist": "^2.0.0", "macos-native-processlist": "^2.0.0",
"serialport": "^9.2.5", "serialport": "9.2.5",
"windows-blurbehind": "^1.0.1", "windows-blurbehind": "^1.0.1",
"windows-native-registry": "^3.1.0", "windows-native-registry": "^3.1.0",
"windows-process-tree": "^0.3.2" "windows-process-tree": "^0.3.2"
@@ -44,8 +44,7 @@
"devDependencies": { "devDependencies": {
"@types/mz": "2.7.4", "@types/mz": "2.7.4",
"@types/node": "16.0.1", "@types/node": "16.0.1",
"ngx-filesize": "^2.0.16", "ngx-filesize": "^2.0.16"
"node-abi": "^3.3.0"
}, },
"peerDependencies": { "peerDependencies": {
"tabby-community-color-schemes": "*", "tabby-community-color-schemes": "*",

View File

@@ -0,0 +1,6 @@
export const PLUGIN_BLACKLIST = [
'terminus-shell-selector', // superseded by profiles
'terminus-scrollbar', // now useless
'terminus-clickable-links', // now bundled with Tabby
'tabby-clickable-links', // now bundled with Tabby
]

View File

@@ -2,6 +2,7 @@ import * as fs from 'mz/fs'
import * as path from 'path' import * as path from 'path'
import * as remote from '@electron/remote' import * as remote from '@electron/remote'
import { PluginInfo } from '../../tabby-core/src/api/mainProcess' import { PluginInfo } from '../../tabby-core/src/api/mainProcess'
import { PLUGIN_BLACKLIST } from './pluginBlacklist'
const nodeModule = require('module') // eslint-disable-line @typescript-eslint/no-var-requires const nodeModule = require('module') // eslint-disable-line @typescript-eslint/no-var-requires
@@ -109,7 +110,7 @@ export async function findPlugins (): Promise<PluginInfo[]> {
}) })
} }
for (const packageName of pluginNames) { for (const packageName of pluginNames) {
if (packageName.startsWith(PREFIX) || packageName.startsWith(LEGACY_PREFIX)) { if ((packageName.startsWith(PREFIX) || packageName.startsWith(LEGACY_PREFIX)) && !PLUGIN_BLACKLIST.includes(packageName)) {
candidateLocations.push({ pluginDir, packageName }) candidateLocations.push({ pluginDir, packageName })
} }
} }

View File

@@ -6,6 +6,7 @@
"declaration": false, "declaration": false,
"noImplicitAny": false, "noImplicitAny": false,
"removeComments": false, "removeComments": false,
"esModuleInterop": true,
"emitDecoratorMetadata": true, "emitDecoratorMetadata": true,
"experimentalDecorators": true, "experimentalDecorators": true,
"sourceMap": true, "sourceMap": true,

View File

@@ -3,11 +3,13 @@
"baseUrl": "./lib", "baseUrl": "./lib",
"module": "commonjs", "module": "commonjs",
"target": "es2017", "target": "es2017",
"moduleResolution": "node",
"declaration": false, "declaration": false,
"noImplicitAny": false, "noImplicitAny": false,
"removeComments": false, "removeComments": false,
"emitDecoratorMetadata": true, "emitDecoratorMetadata": true,
"experimentalDecorators": true, "experimentalDecorators": true,
"esModuleInterop": true,
"sourceMap": true, "sourceMap": true,
"noUnusedParameters": true, "noUnusedParameters": true,
"noImplicitReturns": true, "noImplicitReturns": true,

View File

@@ -115,10 +115,10 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.0.1.tgz#70cedfda26af7a2ca073fdcc9beb2fff4aa693f8" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.0.1.tgz#70cedfda26af7a2ca073fdcc9beb2fff4aa693f8"
integrity sha512-hBOx4SUlEPKwRi6PrXuTGw1z6lz0fjsibcWCM378YxsSu/6+C30L6CR49zIBKHiwNWCYIcOLjg4OHKZaFeLAug== integrity sha512-hBOx4SUlEPKwRi6PrXuTGw1z6lz0fjsibcWCM378YxsSu/6+C30L6CR49zIBKHiwNWCYIcOLjg4OHKZaFeLAug==
"@types/semver@^7.3.5": "@types/semver@^7.3.6":
version "7.3.8" version "7.3.9"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.8.tgz#508a27995498d7586dcecd77c25e289bfaf90c59" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc"
integrity sha512-D/2EJvAlCEtYFEYmmlGwbGXuK886HzyCc3nZX/tkFTQdEU8jZDAgiv08P162yB17y4ZXZoq7yFAnW4GDBb9Now== integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==
JSONStream@^1.3.4, JSONStream@^1.3.5: JSONStream@^1.3.4, JSONStream@^1.3.5:
version "1.3.5" version "1.3.5"
@@ -364,10 +364,10 @@ buffer@^5.5.0:
base64-js "^1.3.1" base64-js "^1.3.1"
ieee754 "^1.1.13" ieee754 "^1.1.13"
builder-util-runtime@8.7.5: builder-util-runtime@8.9.1:
version "8.7.5" version "8.9.1"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.5.tgz#fbe59e274818885e0d2e358d5b7017c34ae6b0f5" resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.9.1.tgz#25f066b3fbc20b3e6236a9b956b1ebb0e33ff66a"
integrity sha512-fgUFHKtMNjdvH6PDRFntdIGUPgwZ69sXsAqEulCtoiqgWes5agrMq/Ud274zjJRTbckYh2PHh8/1CpFc6dpsbQ== integrity sha512-c8a8J3wK6BIVLW7ls+7TRK9igspTbzWmUqxFbgK0m40Ggm6efUbxtWVCGIjc+dtchyr5qAMAUL6iEGRdS/6vwg==
dependencies: dependencies:
debug "^4.3.2" debug "^4.3.2"
sax "^1.2.4" sax "^1.2.4"
@@ -865,16 +865,16 @@ electron-promise-ipc@^2.2.4:
serialize-error "^5.0.0" serialize-error "^5.0.0"
uuid "^3.0.1" uuid "^3.0.1"
electron-updater@^4.3.9: electron-updater@^4.6.1:
version "4.3.9" version "4.6.1"
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.3.9.tgz#247c660bafad7c07935e1b81acd3e9a5fd733154" resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.6.1.tgz#80ca805c4f51b2e682aac29d18fed75d6a533d32"
integrity sha512-LCNfedSwZfS4Hza+pDyPR05LqHtGorCStaBgVpRnfKxOlZcvpYEX0AbMeH5XUtbtGRoH2V8osbbf2qKPNb7AsA== integrity sha512-YsU1mHqXLrXXmBMsxhxy24PrbaB8rnpZDPmFa2gOkTYk/Ch13+R0fjsRSpPYvqtskVVY0ux8fu+HnUkVkqc7og==
dependencies: dependencies:
"@types/semver" "^7.3.5" "@types/semver" "^7.3.6"
builder-util-runtime "8.7.5" builder-util-runtime "8.9.1"
fs-extra "^10.0.0" fs-extra "^10.0.0"
js-yaml "^4.1.0" js-yaml "^4.1.0"
lazy-val "^1.0.4" lazy-val "^1.0.5"
lodash.escaperegexp "^4.1.2" lodash.escaperegexp "^4.1.2"
lodash.isequal "^4.5.0" lodash.isequal "^4.5.0"
semver "^7.3.5" semver "^7.3.5"
@@ -1682,7 +1682,7 @@ lazy-property@~1.0.0:
resolved "https://registry.yarnpkg.com/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147" resolved "https://registry.yarnpkg.com/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147"
integrity sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc= integrity sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc=
lazy-val@^1.0.4: lazy-val@^1.0.5:
version "1.0.5" version "1.0.5"
resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d"
integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==
@@ -2143,13 +2143,6 @@ node-abi@^2.20.0, node-abi@^2.21.0, node-abi@^2.7.0:
dependencies: dependencies:
semver "^5.4.1" semver "^5.4.1"
node-abi@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.3.0.tgz#62cc0d9c7976bd415889aba622ab8f5562082028"
integrity sha512-/+2sCVPXmj07GY/l0ggRr7+trqzX7F9d4QVfSArqIVYmRzc/LkXKr5FlRO6U8uZ/gVVclDDaBxBNITj1z1Z/Zw==
dependencies:
semver "^7.3.5"
node-addon-api@3.0.0: node-addon-api@3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.0.tgz" resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.0.tgz"
@@ -3123,7 +3116,7 @@ serialize-error@^5.0.0:
dependencies: dependencies:
type-fest "^0.8.0" type-fest "^0.8.0"
serialport@^9.2.5: serialport@9.2.5:
version "9.2.5" version "9.2.5"
resolved "https://registry.yarnpkg.com/serialport/-/serialport-9.2.5.tgz#23e81588336e844e8d7071742a00f501eec9f2b1" resolved "https://registry.yarnpkg.com/serialport/-/serialport-9.2.5.tgz#23e81588336e844e8d7071742a00f501eec9f2b1"
integrity sha512-nsDsD2GN/43T2a8jQYr1HH76gmDZ575Ts8FOdcBRUY8ecaI16BPbXa612cPPkQjOfg28+KL5qtQL9c0vvTaidg== integrity sha512-nsDsD2GN/43T2a8jQYr1HH76gmDZ575Ts8FOdcBRUY8ecaI16BPbXa612cPPkQjOfg28+KL5qtQL9c0vvTaidg==

View File

@@ -25,17 +25,17 @@
"apply-loader": "2.0.0", "apply-loader": "2.0.0",
"axios": "^0.21.1", "axios": "^0.21.1",
"clone-deep": "^4.0.1", "clone-deep": "^4.0.1",
"compare-versions": "^3.6.0", "compare-versions": "^4",
"core-js": "^3.18.2", "core-js": "^3.18.2",
"cross-env": "7.0.3", "cross-env": "7.0.3",
"css-loader": "^6.5.1", "css-loader": "^6.5.1",
"deep-equal": "2.0.5", "deep-equal": "2.0.5",
"electron": "13.5.1", "electron": "13.5.1",
"electron-builder": "^22.11.7", "electron-builder": "^22.14.5",
"electron-download": "^4.1.1", "electron-download": "^4.1.1",
"electron-installer-snap": "^5.1.0", "electron-installer-snap": "^5.1.0",
"electron-notarize": "^1.1.1", "electron-notarize": "^1.1.1",
"electron-rebuild": "^3.2.3", "electron-rebuild": "^3.2.5",
"eslint": "^7.32.0", "eslint": "^7.32.0",
"file-loader": "^6.2.0", "file-loader": "^6.2.0",
"graceful-fs": "^4.2.8", "graceful-fs": "^4.2.8",
@@ -46,7 +46,7 @@
"ngx-sortablejs": "^11.1.0", "ngx-sortablejs": "^11.1.0",
"ngx-toastr": "^14.0.0", "ngx-toastr": "^14.0.0",
"node-abi": "^3.2.0", "node-abi": "^3.2.0",
"node-sass": "^6.0.1", "node-sass": "^7.0.0",
"npmlog": "5.0.1", "npmlog": "5.0.1",
"npx": "^10.2.2", "npx": "^10.2.2",
"patch-package": "^6.4.7", "patch-package": "^6.4.7",
@@ -57,7 +57,7 @@
"pug-static-loader": "2.0.0", "pug-static-loader": "2.0.0",
"raw-loader": "4.0.2", "raw-loader": "4.0.2",
"sass-loader": "^12.3.0", "sass-loader": "^12.3.0",
"shell-quote": "^1.7.2", "shell-quote": "^1.7.3",
"shelljs": "0.8.4", "shelljs": "0.8.4",
"slugify": "^1.6.1", "slugify": "^1.6.1",
"sortablejs": "^1.14.0", "sortablejs": "^1.14.0",
@@ -69,11 +69,11 @@
"svg-inline-loader": "^0.8.2", "svg-inline-loader": "^0.8.2",
"ts-loader": "^9.2.3", "ts-loader": "^9.2.3",
"tslib": "^2.3.1", "tslib": "^2.3.1",
"typedoc": "^0.22.7", "typedoc": "^0.22.10",
"typescript": "^4.3.5", "typescript": "^4.3.5",
"utils-decorators": "^1.10.4", "utils-decorators": "^1.10.4",
"val-loader": "4.0.0", "val-loader": "4.0.0",
"webpack": "^5.61.0", "webpack": "^5.64.4",
"webpack-bundle-analyzer": "^4.5.0", "webpack-bundle-analyzer": "^4.5.0",
"webpack-cli": "^4.9.1", "webpack-cli": "^4.9.1",
"yaml-loader": "0.6.0", "yaml-loader": "0.6.0",
@@ -91,10 +91,9 @@
"start": "cross-env TABBY_DEV=1 electron app --debug --inspect", "start": "cross-env TABBY_DEV=1 electron app --debug --inspect",
"start:prod": "electron app --debug", "start:prod": "electron app --debug",
"prod": "cross-env TABBY_DEV=1 electron app", "prod": "cross-env TABBY_DEV=1 electron app",
"docs": "typedoc --out docs/api --tsconfig tabby-core/tsconfig.typings.json tabby-core/src/index.ts && typedoc --out docs/api/terminal --tsconfig tabby-terminal/tsconfig.typings.json tabby-terminal/src/index.ts && typedoc --out docs/api/local --tsconfig tabby-local/tsconfig.typings.json tabby-local/src/index.ts && typedoc --out docs/api/settings --tsconfig tabby-settings/tsconfig.typings.json tabby-settings/src/index.ts", "docs": "node scripts/build-docs.js",
"lint": "eslint --ext ts */src */lib", "lint": "eslint --ext ts */src */lib",
"postinstall": "node ./scripts/install-deps.js", "postinstall": "patch-package && node ./scripts/install-deps.js"
"patch": "patch-package; cd web; patch-package"
}, },
"private": true "private": true
} }

View File

@@ -1,5 +1,5 @@
diff --git a/node_modules/app-builder-lib/out/appInfo.js b/node_modules/app-builder-lib/out/appInfo.js diff --git a/node_modules/app-builder-lib/out/appInfo.js b/node_modules/app-builder-lib/out/appInfo.js
index f241acc..2bddb7f 100644 index 363f32c..a0434a9 100644
--- a/node_modules/app-builder-lib/out/appInfo.js --- a/node_modules/app-builder-lib/out/appInfo.js
+++ b/node_modules/app-builder-lib/out/appInfo.js +++ b/node_modules/app-builder-lib/out/appInfo.js
@@ -100,9 +100,7 @@ class AppInfo { @@ -100,9 +100,7 @@ class AppInfo {
@@ -12,4 +12,4 @@ index f241acc..2bddb7f 100644
+ return 'tabby-terminal' + return 'tabby-terminal'
} }
get sanitizedName() { get sanitizedName() {
return sanitizeFileName_1.sanitizeFileName(this.name); return filename_1.sanitizeFileName(this.name);

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

@@ -0,0 +1,9 @@
#!/usr/bin/env node
const sh = require('shelljs')
const vars = require('./vars')
const log = require('npmlog')
vars.packagesWithDocs.forEach(([dest, src]) => {
log.info('docs', src)
sh.exec(`yarn typedoc --out docs/api/${dest} --tsconfig ${src}/tsconfig.typings.json ${src}/src/index.ts`)
})

View File

@@ -2,11 +2,12 @@
const sh = require('shelljs') const sh = require('shelljs')
const vars = require('./vars') const vars = require('./vars')
const log = require('npmlog') const log = require('npmlog')
const { execSync } = require('child_process')
vars.allPackages.forEach(plugin => { vars.allPackages.forEach(plugin => {
log.info('bump', plugin) log.info('bump', plugin)
sh.cd(plugin) sh.cd(plugin)
sh.exec('npm --no-git-tag-version version ' + vars.version) sh.exec('npm --no-git-tag-version version ' + vars.version)
sh.exec('npm publish') execSync('npm publish', { stdio: 'inherit' })
sh.cd('..') sh.cd('..')
}) })

View File

@@ -25,6 +25,14 @@ exports.builtinPlugins = [
'tabby-electron', 'tabby-electron',
'tabby-local', 'tabby-local',
'tabby-plugin-manager', 'tabby-plugin-manager',
'tabby-linkifier',
]
exports.packagesWithDocs = [
['.', 'tabby-core'],
['terminal', 'tabby-terminal'],
['local', 'tabby-local'],
['settings', 'tabby-settings'],
] ]
exports.allPackages = [ exports.allPackages = [

View File

@@ -1,6 +1,6 @@
{ {
"name": "tabby-community-color-schemes", "name": "tabby-community-color-schemes",
"version": "1.0.162-nightly.0", "version": "1.0.165-nightly.0",
"description": "Community color schemes for Tabby", "description": "Community color schemes for Tabby",
"keywords": [ "keywords": [
"tabby-builtin-plugin" "tabby-builtin-plugin"

View File

@@ -1,7 +1,13 @@
Tabby Core Plugin # Tabby Core Plugin
--------------------
See also: [Settings plugin API](./settings/), [Terminal plugin API](./terminal/), [Local terminal API](./local/) See also:
* [Settings plugin API](./settings/)
* [Terminal plugin API](./terminal/)
* [Local terminal API](./local/)
* [Linkifier plugin API](./linkifier/)
This module provides:
* tabbed interface services * tabbed interface services
* toolbar UI * toolbar UI

View File

@@ -1,6 +1,6 @@
{ {
"name": "tabby-core", "name": "tabby-core",
"version": "1.0.162-nightly.0", "version": "1.0.165-nightly.0",
"description": "Tabby core", "description": "Tabby core",
"keywords": [ "keywords": [
"tabby-builtin-plugin" "tabby-builtin-plugin"
@@ -19,7 +19,6 @@
"devDependencies": { "devDependencies": {
"bootstrap": "^4.1.3", "bootstrap": "^4.1.3",
"deepmerge": "^4.1.1", "deepmerge": "^4.1.1",
"electron-updater": "^4.0.6",
"js-yaml": "^4.0.0", "js-yaml": "^4.0.0",
"mixpanel": "^0.13.0", "mixpanel": "^0.13.0",
"ngx-filesize": "^2.0.16", "ngx-filesize": "^2.0.16",

View File

@@ -25,7 +25,7 @@ export { DockingService, Screen } from '../services/docking.service'
export { Logger, ConsoleLogger, LogService } from '../services/log.service' export { Logger, ConsoleLogger, LogService } from '../services/log.service'
export { HomeBaseService } from '../services/homeBase.service' export { HomeBaseService } from '../services/homeBase.service'
export { HotkeysService } from '../services/hotkeys.service' export { HotkeysService } from '../services/hotkeys.service'
export { KeyEventData, KeyName, Keystroke } from '../services/hotkeys.util' export { KeyEventData, KeyName, Keystroke, altKeyName, metaKeyName } from '../services/hotkeys.util'
export { NotificationsService } from '../services/notifications.service' export { NotificationsService } from '../services/notifications.service'
export { ThemesService } from '../services/themes.service' export { ThemesService } from '../services/themes.service'
export { ProfilesService } from '../services/profiles.service' export { ProfilesService } from '../services/profiles.service'

View File

@@ -44,7 +44,7 @@ export abstract class ProfileProvider<P extends Profile> {
abstract getBuiltinProfiles (): Promise<PartialProfile<P>[]> abstract getBuiltinProfiles (): Promise<PartialProfile<P>[]>
abstract getNewTabParameters (profile: PartialProfile<P>): Promise<NewTabParameters<BaseTabComponent>> abstract getNewTabParameters (profile: P): Promise<NewTabParameters<BaseTabComponent>>
getSuggestedName (profile: PartialProfile<P>): string|null { getSuggestedName (profile: PartialProfile<P>): string|null {
return null return null

View File

@@ -108,13 +108,13 @@ export class AppRootComponent {
if (hotkey === 'move-tab-right') { if (hotkey === 'move-tab-right') {
this.app.moveSelectedTabRight() this.app.moveSelectedTabRight()
} }
if (hotkey === 'reopen-tab') {
this.app.reopenLastTab()
}
if (hotkey === 'duplicate-tab') { if (hotkey === 'duplicate-tab') {
this.app.duplicateTab(this.app.activeTab) this.app.duplicateTab(this.app.activeTab)
} }
} }
if (hotkey === 'reopen-tab') {
this.app.reopenLastTab()
}
if (hotkey === 'toggle-fullscreen') { if (hotkey === 'toggle-fullscreen') {
hostWindow.toggleFullscreen() hostWindow.toggleFullscreen()
} }

View File

@@ -29,3 +29,4 @@
) )
.title.mr-2 {{getOptionText(option)}} .title.mr-2 {{getOptionText(option)}}
.description.no-wrap.text-muted {{option.description}} .description.no-wrap.text-muted {{option.description}}
.no-wrap.badge.badge-secondary.text-muted.ml-auto(*ngIf='selectedIndex == i') Enter

View File

@@ -7,6 +7,7 @@
overflow: auto; overflow: auto;
border-top-left-radius: 0; border-top-left-radius: 0;
border-top-right-radius: 0; border-top-right-radius: 0;
padding: 0 15px;
} }
.group-header { .group-header {
@@ -30,4 +31,5 @@
input { input {
border-radius: 0; border-radius: 0;
border: none;
} }

View File

@@ -306,6 +306,7 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
async ngAfterViewInit (): Promise<void> { async ngAfterViewInit (): Promise<void> {
if (this._recoveredState) { if (this._recoveredState) {
await this.recoverContainer(this.root, this._recoveredState, this._recoveredState.duplicate) await this.recoverContainer(this.root, this._recoveredState, this._recoveredState.duplicate)
this.updateTitle()
this.layout() this.layout()
setTimeout(() => { setTimeout(() => {
if (this.hasFocus) { if (this.hasFocus) {

View File

@@ -3,7 +3,7 @@ div
h1.tabby-title Tabby h1.tabby-title Tabby
sup α sup α
.list-group.list-group-light.mb-4 .list-group.mb-4
a.list-group-item.list-group-item-action.d-flex( a.list-group-item.list-group-item-action.d-flex(
*ngFor='let button of getButtons(); trackBy: buttonsTrackBy', *ngFor='let button of getButtons(); trackBy: buttonsTrackBy',
(click)='button.click()', (click)='button.click()',

View File

@@ -13,6 +13,7 @@ button {
line-height: 0; line-height: 0;
text-align: center; text-align: center;
align-items: center; align-items: center;
justify-content: center;
&:not(:hover):not(:active) { &:not(:hover):not(:active) {
background: transparent; background: transparent;
@@ -21,4 +22,9 @@ button {
&:focus { &:focus {
box-shadow: none; box-shadow: none;
} }
svg {
width: 10px;
height: 10px;
}
} }

View File

@@ -209,6 +209,6 @@ export class AppHotkeyProvider extends HotkeyProvider {
} }
static getProfileHotkeyName (profile: PartialProfile<Profile>): string { static getProfileHotkeyName (profile: PartialProfile<Profile>): string {
return profile.id!.replace(/\./g, '-') return (profile.id ?? profile.name).replace(/\./g, '-')
} }
} }

View File

@@ -102,13 +102,6 @@ export class AppService {
}) })
hostWindow.windowFocused$.subscribe(() => this._activeTab?.emitFocused()) hostWindow.windowFocused$.subscribe(() => this._activeTab?.emitFocused())
this.tabClosed$.subscribe(async tab => {
const token = await tabRecovery.getFullRecoveryToken(tab)
if (token) {
this.closedTabsStack.push(token)
}
})
} }
addTabRaw (tab: BaseTabComponent, index: number|null = null): void { addTabRaw (tab: BaseTabComponent, index: number|null = null): void {
@@ -317,6 +310,10 @@ export class AppService {
if (checkCanClose && !await tab.canClose()) { if (checkCanClose && !await tab.canClose()) {
return return
} }
const token = await this.tabRecovery.getFullRecoveryToken(tab)
if (token) {
this.closedTabsStack.push(token)
}
tab.destroy() tab.destroy()
} }

View File

@@ -27,6 +27,14 @@ export class HomeBaseService {
this.platform.openExternal('https://github.com/Eugeny/tabby') this.platform.openExternal('https://github.com/Eugeny/tabby')
} }
openDiscussions (): void {
this.platform.openExternal('https://github.com/Eugeny/tabby/discussions')
}
openTwitter (): void {
this.platform.openExternal('https://twitter.com/eugeeeeny')
}
reportBug (): void { reportBug (): void {
let body = `Version: ${this.appVersion}\n` let body = `Version: ${this.appVersion}\n`
body += `Platform: ${this.hostApp.platform} ${process.arch} ${this.platform.getOSRelease()}\n` body += `Platform: ${this.hostApp.platform} ${process.arch} ${this.platform.getOSRelease()}\n`

View File

@@ -39,6 +39,10 @@ export function getKeyName (event: KeyEventData): KeyName {
key = altKeyName key = altKeyName
} else if (event.key === 'Shift') { } else if (event.key === 'Shift') {
key = 'Shift' key = 'Shift'
} else if (event.key === '`') {
key = '`'
} else if (event.key === '~') {
key = '~'
} else { } else {
key = event.code key = event.code
if (REGEX_LATIN_KEYNAME.test(event.key)) { if (REGEX_LATIN_KEYNAME.test(event.key)) {
@@ -54,7 +58,6 @@ export function getKeyName (event: KeyEventData): KeyName {
Slash: '/', Slash: '/',
Backslash: '\\', Backslash: '\\',
IntlBackslash: '`', IntlBackslash: '`',
Backquote: '~', // Electron says it's the tilde
Minus: '-', Minus: '-',
Equal: '=', Equal: '=',
Semicolon: ';', Semicolon: ';',

View File

@@ -381,3 +381,8 @@ toggle {
start-page footer { start-page footer {
background: $white !important; background: $white !important;
} }
.terminal-toolbar {
background: #ffffff4a !important;
border-bottom: 1px solid #00000026 !important;
}

View File

@@ -223,7 +223,7 @@ hotkey-input-modal {
} }
.list-group-item { .list-group-item {
transition: 0.0625s background; // transition: 0.0625s background ease;
i + * { i + * {
margin-left: 10px; margin-left: 10px;
@@ -232,7 +232,7 @@ hotkey-input-modal {
.list-group.list-group-flush .list-group-item { .list-group.list-group-flush .list-group-item {
background: transparent; background: transparent;
border-color: rgba(0, 0, 0, 0.2); border: none;
&:not(:last-child) { &:not(:last-child) {
border-bottom: none; border-bottom: none;
@@ -247,11 +247,16 @@ hotkey-input-modal {
.list-group-light { .list-group-light {
.list-group-item { .list-group-item {
border: none; border: none !important;
outline: none !important;
background: transparent;
border-radius: $border-radius;
margin: 0 !important;
&.list-group-item-action { &.list-group-item-action {
&:hover, &.active { &:hover, &.active {
background: $list-group-hover-bg; background: $component-active-bg;
color: $component-active-color;
} }
} }
} }

View File

@@ -78,11 +78,11 @@ $link-color: $gray-400;
$link-hover-color: $white; $link-hover-color: $white;
$link-hover-decoration: none; $link-hover-decoration: none;
$component-active-color: $white; $component-active-color: #4fadff;
$component-active-bg: #2f3a42; $component-active-bg: #0059a559;
$list-group-bg: $table-bg; $list-group-bg: $table-bg;
$list-group-border-color: $table-border-color; $list-group-border-color: transparent;
$list-group-item-padding-y: 0.8rem; $list-group-item-padding-y: 0.8rem;
$list-group-item-padding-x: 1rem; $list-group-item-padding-x: 1rem;
@@ -197,3 +197,5 @@ $progress-height: 3px;
$alert-bg-level: 9; $alert-bg-level: 9;
$alert-border-level: 5; $alert-border-level: 5;
$alert-color-level: -5; $alert-color-level: -5;
$text-muted: rgba(255, 255, 255, 0.5);

View File

@@ -2,11 +2,6 @@
# yarn lockfile v1 # yarn lockfile v1
"@types/semver@^7.3.5":
version "7.3.5"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.5.tgz#74deebbbcb1e86634dbf10a5b5e8798626f5a597"
integrity sha512-iotVxtCCsPLRAvxMFFgxL8HD2l4mAZ2Oin7/VJ2ooWO0VOK4EGOGmZWZn1uCq7RofR3I/1IOSjCHlFT71eVK0Q==
agent-base@6: agent-base@6:
version "6.0.2" version "6.0.2"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
@@ -24,14 +19,6 @@ bootstrap@^4.1.3:
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.3.tgz#c6a72b355aaf323920be800246a6e4ef30997fe6" resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.3.tgz#c6a72b355aaf323920be800246a6e4ef30997fe6"
integrity sha512-o9ppKQioXGqhw8Z7mah6KdTYpNQY//tipnkxppWhPbiSWdD+1raYsnhwEZjkTHYbGee4cVQ0Rx65EhOY/HNLcQ== integrity sha512-o9ppKQioXGqhw8Z7mah6KdTYpNQY//tipnkxppWhPbiSWdD+1raYsnhwEZjkTHYbGee4cVQ0Rx65EhOY/HNLcQ==
builder-util-runtime@8.7.5:
version "8.7.5"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.5.tgz#fbe59e274818885e0d2e358d5b7017c34ae6b0f5"
integrity sha512-fgUFHKtMNjdvH6PDRFntdIGUPgwZ69sXsAqEulCtoiqgWes5agrMq/Ud274zjJRTbckYh2PHh8/1CpFc6dpsbQ==
dependencies:
debug "^4.3.2"
sax "^1.2.4"
debug@4: debug@4:
version "4.3.1" version "4.3.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
@@ -39,51 +26,16 @@ debug@4:
dependencies: dependencies:
ms "2.1.2" ms "2.1.2"
debug@^4.3.2:
version "4.3.2"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
dependencies:
ms "2.1.2"
deepmerge@^4.1.1: deepmerge@^4.1.1:
version "4.2.2" version "4.2.2"
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
electron-updater@^4.0.6:
version "4.3.9"
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.3.9.tgz#247c660bafad7c07935e1b81acd3e9a5fd733154"
integrity sha512-LCNfedSwZfS4Hza+pDyPR05LqHtGorCStaBgVpRnfKxOlZcvpYEX0AbMeH5XUtbtGRoH2V8osbbf2qKPNb7AsA==
dependencies:
"@types/semver" "^7.3.5"
builder-util-runtime "8.7.5"
fs-extra "^10.0.0"
js-yaml "^4.1.0"
lazy-val "^1.0.4"
lodash.escaperegexp "^4.1.2"
lodash.isequal "^4.5.0"
semver "^7.3.5"
"filesize@>= 4.0.0": "filesize@>= 4.0.0":
version "6.3.0" version "6.3.0"
resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.3.0.tgz#dff53cfb3f104c9e422f346d53be8dbcc971bf11" resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.3.0.tgz#dff53cfb3f104c9e422f346d53be8dbcc971bf11"
integrity sha512-ytx0ruGpDHKWVoiui6+BY/QMNngtDQ/pJaFwfBpQif0J63+E8DLdFyqS3NkKQn7vIruUEpoGD9JUJSg7Kp+I0g== integrity sha512-ytx0ruGpDHKWVoiui6+BY/QMNngtDQ/pJaFwfBpQif0J63+E8DLdFyqS3NkKQn7vIruUEpoGD9JUJSg7Kp+I0g==
fs-extra@^10.0.0:
version "10.0.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1"
integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==
dependencies:
graceful-fs "^4.2.0"
jsonfile "^6.0.1"
universalify "^2.0.0"
graceful-fs@^4.1.6, graceful-fs@^4.2.0:
version "4.2.4"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
https-proxy-agent@5.0.0: https-proxy-agent@5.0.0:
version "5.0.0" version "5.0.0"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
@@ -97,44 +49,13 @@ inherits@^2.0.3:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
js-yaml@^4.0.0, js-yaml@^4.1.0: js-yaml@^4.0.0:
version "4.1.0" version "4.1.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
dependencies: dependencies:
argparse "^2.0.1" argparse "^2.0.1"
jsonfile@^6.0.1:
version "6.1.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
dependencies:
universalify "^2.0.0"
optionalDependencies:
graceful-fs "^4.1.6"
lazy-val@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.4.tgz#882636a7245c2cfe6e0a4e3ba6c5d68a137e5c65"
integrity sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==
lodash.escaperegexp@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347"
integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=
lodash.isequal@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=
lru-cache@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
dependencies:
yallist "^4.0.0"
mixpanel@^0.13.0: mixpanel@^0.13.0:
version "0.13.0" version "0.13.0"
resolved "https://registry.yarnpkg.com/mixpanel/-/mixpanel-0.13.0.tgz#699bf510d9ba013c75edcf979ff1e24085fde9d2" resolved "https://registry.yarnpkg.com/mixpanel/-/mixpanel-0.13.0.tgz#699bf510d9ba013c75edcf979ff1e24085fde9d2"
@@ -188,18 +109,6 @@ safe-buffer@~5.2.0:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
sax@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
semver@^7.3.5:
version "7.3.5"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
dependencies:
lru-cache "^6.0.0"
string_decoder@^1.1.1: string_decoder@^1.1.1:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
@@ -212,11 +121,6 @@ tslib@^2.0.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a"
integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==
universalify@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
util-deprecate@^1.0.1: util-deprecate@^1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
@@ -226,8 +130,3 @@ uuid@^8.0.0:
version "8.3.2" version "8.3.2"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
yallist@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==

View File

@@ -1,6 +1,6 @@
{ {
"name": "tabby-electron", "name": "tabby-electron",
"version": "1.0.162-nightly.0", "version": "1.0.165-nightly.0",
"description": "Electron-specific bindings", "description": "Electron-specific bindings",
"keywords": [ "keywords": [
"tabby-builtin-plugin" "tabby-builtin-plugin"

View File

@@ -30,6 +30,8 @@ export class ElectronUpdaterService extends UpdaterService {
} }
this.autoUpdater = electron.remote.require('electron-updater').autoUpdater this.autoUpdater = electron.remote.require('electron-updater').autoUpdater
this.autoUpdater.autoDownload = false
this.autoUpdater.autoInstallOnAppQuit = false
this.autoUpdater.on('update-available', () => { this.autoUpdater.on('update-available', () => {
this.logger.info('Update available') this.logger.info('Update available')

View File

@@ -0,0 +1,3 @@
# Tabby Linkifier Plugin
This plugin makes URLs, IPs and file paths in the terminal clickable and adds a context menu that allows quickly copying them.

View File

@@ -0,0 +1,22 @@
{
"name": "tabby-linkifier",
"version": "1.0.165-nightly.0",
"description": "Makes URLs, IPs and file paths clickable in Tabby",
"keywords": [
"tabby-builtin-plugin"
],
"main": "dist/index.js",
"typings": "typings/index.d.ts",
"scripts": {
"build": "webpack --progress --color --display-modules",
"watch": "webpack --progress --color --watch"
},
"files": [
"typings"
],
"author": "Eugene Pankov",
"license": "MIT",
"devDependencies": {
"untildify": "^4.0.0"
}
}

View File

@@ -0,0 +1,16 @@
import { BaseTerminalTabComponent } from 'tabby-terminal'
export abstract class LinkHandler {
regex: RegExp
priority = 1
convert (uri: string, _tab?: BaseTerminalTabComponent): Promise<string>|string {
return uri
}
verify (_uri: string, _tab?: BaseTerminalTabComponent): Promise<boolean>|boolean {
return true
}
abstract handle (uri: string, tab?: BaseTerminalTabComponent): void
}

View File

@@ -0,0 +1,12 @@
import { ConfigProvider } from 'tabby-core'
/** @hidden */
export class ClickableLinksConfigProvider extends ConfigProvider {
defaults = {
clickableLinks: {
modifier: null,
},
}
platformDefaults = { }
}

View File

@@ -0,0 +1,67 @@
import { Inject, Injectable } from '@angular/core'
import { ConfigService, PlatformService } from 'tabby-core'
import { TerminalDecorator, BaseTerminalTabComponent } from 'tabby-terminal'
import { LinkHandler } from './api'
@Injectable()
export class LinkHighlighterDecorator extends TerminalDecorator {
constructor (
private config: ConfigService,
private platform: PlatformService,
@Inject(LinkHandler) private handlers: LinkHandler[],
) {
super()
}
attach (tab: BaseTerminalTabComponent): void {
if (!(tab.frontend as any).xterm) {
// not hterm
return
}
for (const handler of this.handlers) {
const getLink = async uri => handler.convert(uri, tab)
const openLink = async uri => handler.handle(await getLink(uri), tab)
;(tab.frontend as any).xterm.registerLinkMatcher(
handler.regex,
(event: MouseEvent, uri: string) => {
if (!this.willHandleEvent(event)) {
return
}
openLink(uri)
},
{
priority: handler.priority,
validationCallback: async (uri: string, callback: (isValid: boolean) => void) => {
callback(await handler.verify(await handler.convert(uri, tab), tab))
},
willLinkActivate: (event: MouseEvent, uri: string) => {
if (event.button === 2) {
this.platform.popupContextMenu([
{
click: () => openLink(uri),
label: 'Open',
},
{
click: async () => {
this.platform.setClipboard({ text: await getLink(uri) })
},
label: 'Copy',
},
])
return false
}
return this.willHandleEvent(event)
},
}
)
}
}
private willHandleEvent (event: MouseEvent) {
const modifier = this.config.store.clickableLinks.modifier
return !modifier || event[modifier]
}
}

View File

@@ -0,0 +1,108 @@
import * as fs from 'fs/promises'
import * as path from 'path'
import untildify from 'untildify'
import { Injectable } from '@angular/core'
import { ToastrService } from 'ngx-toastr'
import { PlatformService } from 'tabby-core'
import { BaseTerminalTabComponent } from 'tabby-terminal'
import { LinkHandler } from './api'
@Injectable()
export class URLHandler extends LinkHandler {
// From https://urlregex.com/
regex = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((:((6553[0-5])|(655[0-2][0-9])|(65[0-4][0-9]{2})|(6[0-4][0-9]{3})|([1-5][0-9]{4})|([0-5]{1,5})|([0-9]{1,4})))?(?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/
priority = 5
constructor (private platform: PlatformService) {
super()
}
handle (uri: string): void {
this.platform.openExternal(uri)
}
}
@Injectable()
export class IPHandler extends LinkHandler {
regex = /\b((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/
priority = 4
constructor (private platform: PlatformService) {
super()
}
handle (uri: string): void {
this.platform.openExternal(`http://${uri}`)
}
}
export class BaseFileHandler extends LinkHandler {
constructor (
protected toastr: ToastrService,
protected platform: PlatformService,
) {
super()
}
async handle (uri: string): Promise<void> {
try {
this.platform.openExternal('file://' + uri)
} catch (err) {
this.toastr.error(err.toString())
}
}
async verify (uri: string): Promise<boolean> {
try {
await fs.access(uri)
return true
} catch {
return false
}
}
async convert (uri: string, tab?: BaseTerminalTabComponent): Promise<string> {
let p = untildify(uri)
if (!path.isAbsolute(p) && tab) {
const cwd = await tab.session?.getWorkingDirectory()
if (cwd) {
p = path.resolve(cwd, p)
}
}
return p
}
}
@Injectable()
export class UnixFileHandler extends BaseFileHandler {
// Only absolute and home paths
regex = /[~]?(\/[\w\d.~-]{1,100})+/
constructor (
protected toastr: ToastrService,
protected platform: PlatformService,
) {
super(toastr, platform)
}
}
@Injectable()
export class WindowsFileHandler extends BaseFileHandler {
regex = /(([a-zA-Z]:|\\|~)\\[\w\-()\\\.]{1,1024}|"([a-zA-Z]:|\\)\\[\w\s\-()\\\.]{1,1024}")/
constructor (
protected toastr: ToastrService,
protected platform: PlatformService,
) {
super(toastr, platform)
}
convert (uri: string, tab?: BaseTerminalTabComponent): Promise<string> {
const sanitizedUri = uri.replace(/"/g, '')
return super.convert(sanitizedUri, tab)
}
}

View File

@@ -0,0 +1,27 @@
/* eslint-disable @typescript-eslint/no-extraneous-class */
import { NgModule } from '@angular/core'
import { ToastrModule } from 'ngx-toastr'
import { ConfigProvider } from 'tabby-core'
import { TerminalDecorator } from 'tabby-terminal'
import { LinkHandler } from './api'
import { UnixFileHandler, WindowsFileHandler, URLHandler, IPHandler } from './handlers'
import { LinkHighlighterDecorator } from './decorator'
import { ClickableLinksConfigProvider } from './config'
@NgModule({
imports: [
ToastrModule,
],
providers: [
{ provide: LinkHandler, useClass: URLHandler, multi: true },
{ provide: LinkHandler, useClass: IPHandler, multi: true },
{ provide: LinkHandler, useClass: UnixFileHandler, multi: true },
{ provide: LinkHandler, useClass: WindowsFileHandler, multi: true },
{ provide: TerminalDecorator, useClass: LinkHighlighterDecorator, multi: true },
{ provide: ConfigProvider, useClass: ClickableLinksConfigProvider, multi: true },
],
})
export default class LinkifierModule { }
export * from './api'

View File

@@ -0,0 +1,7 @@
{
"extends": "../tsconfig.json",
"exclude": ["node_modules", "dist"],
"compilerOptions": {
"baseUrl": "src",
}
}

View File

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

View File

@@ -0,0 +1,5 @@
const config = require('../webpack.plugin.config')
module.exports = config({
name: 'linkifier',
dirname: __dirname,
})

View File

@@ -0,0 +1,8 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
untildify@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b"
integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==

View File

@@ -1,5 +1,4 @@
Tabby Local Plugin # Tabby Local Plugin
---------------------
* local shells * local shells

View File

@@ -1,6 +1,6 @@
{ {
"name": "tabby-local", "name": "tabby-local",
"version": "1.0.162-nightly.0", "version": "1.0.165-nightly.0",
"description": "Tabby's local shell plugin", "description": "Tabby's local shell plugin",
"keywords": [ "keywords": [
"tabby-builtin-plugin" "tabby-builtin-plugin"

View File

@@ -45,19 +45,17 @@ export class LocalProfilesService extends ProfileProvider<LocalProfile> {
})) }))
} }
async getNewTabParameters (profile: PartialProfile<LocalProfile>): Promise<NewTabParameters<TerminalTabComponent>> { async getNewTabParameters (profile: LocalProfile): Promise<NewTabParameters<TerminalTabComponent>> {
profile = deepClone(profile) profile = deepClone(profile)
if (!profile.options?.cwd) { if (!profile.options.cwd) {
if (this.app.activeTab instanceof TerminalTabComponent && this.app.activeTab.session) { if (this.app.activeTab instanceof TerminalTabComponent && this.app.activeTab.session) {
profile.options ??= {}
profile.options.cwd = await this.app.activeTab.session.getWorkingDirectory() ?? undefined profile.options.cwd = await this.app.activeTab.session.getWorkingDirectory() ?? undefined
} }
if (this.app.activeTab instanceof SplitTabComponent) { if (this.app.activeTab instanceof SplitTabComponent) {
const focusedTab = this.app.activeTab.getFocusedTab() const focusedTab = this.app.activeTab.getFocusedTab()
if (focusedTab instanceof TerminalTabComponent && focusedTab.session) { if (focusedTab instanceof TerminalTabComponent && focusedTab.session) {
profile.options ??= {}
profile.options.cwd = await focusedTab.session.getWorkingDirectory() ?? undefined profile.options.cwd = await focusedTab.session.getWorkingDirectory() ?? undefined
} }
} }

View File

@@ -295,18 +295,16 @@ export class Session extends BaseSession {
} else { } else {
await new Promise<void>((resolve) => { await new Promise<void>((resolve) => {
this.kill('SIGTERM') this.kill('SIGTERM')
setImmediate(() => { setTimeout(() => {
try { try {
process.kill(this.pty!.getPID(), 0) process.kill(this.pty!.getPID(), 0)
// still alive // still alive
setTimeout(() => { this.kill('SIGKILL')
this.kill('SIGKILL') resolve()
resolve()
}, 1000)
} catch { } catch {
resolve() resolve()
} }
}) }, 500)
}) })
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "tabby-plugin-manager", "name": "tabby-plugin-manager",
"version": "1.0.162-nightly.0", "version": "1.0.165-nightly.0",
"description": "Tabby's plugin manager", "description": "Tabby's plugin manager",
"keywords": [ "keywords": [
"tabby-builtin-plugin" "tabby-builtin-plugin"

View File

@@ -3,13 +3,10 @@ import { compare as semverCompare } from 'semver'
import { Observable, from, forkJoin, map } from 'rxjs' import { Observable, from, forkJoin, map } from 'rxjs'
import { Injectable, Inject } from '@angular/core' import { Injectable, Inject } from '@angular/core'
import { Logger, LogService, PlatformService, BOOTSTRAP_DATA, BootstrapData, PluginInfo } from 'tabby-core' import { Logger, LogService, PlatformService, BOOTSTRAP_DATA, BootstrapData, PluginInfo } from 'tabby-core'
import { PLUGIN_BLACKLIST } from '../../../app/src/pluginBlacklist'
const OFFICIAL_NPM_ACCOUNT = 'eugenepankov' const OFFICIAL_NPM_ACCOUNT = 'eugenepankov'
const BLACKLIST = [
'terminus-shell-selector', // superseded by profiles
'terminus-scrollbar', // now useless
]
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class PluginManagerService { export class PluginManagerService {
@@ -69,7 +66,7 @@ export class PluginManagerService {
})) }))
), ),
map(plugins => plugins.filter(x => x.packageName.startsWith(namePrefix))), map(plugins => plugins.filter(x => x.packageName.startsWith(namePrefix))),
map(plugins => plugins.filter(x => !BLACKLIST.includes(x.packageName))), map(plugins => plugins.filter(x => !PLUGIN_BLACKLIST.includes(x.packageName))),
map(plugins => { map(plugins => {
const mapping: Record<string, PluginInfo[]> = {} const mapping: Record<string, PluginInfo[]> = {}
for (const p of plugins) { for (const p of plugins) {

View File

@@ -1,6 +1,6 @@
{ {
"name": "tabby-serial", "name": "tabby-serial",
"version": "1.0.162-nightly.0", "version": "1.0.165-nightly.0",
"description": "Serial connections for Tabby", "description": "Serial connections for Tabby",
"keywords": [ "keywords": [
"tabby-builtin-plugin" "tabby-builtin-plugin"

View File

@@ -1,5 +1,4 @@
Tabby Settings Plugin # Tabby Settings Plugin
------------------------
* tabbed settings interface * tabbed settings interface

View File

@@ -1,6 +1,6 @@
{ {
"name": "tabby-settings", "name": "tabby-settings",
"version": "1.0.162-nightly.0", "version": "1.0.165-nightly.0",
"description": "Tabby terminal settings page", "description": "Tabby terminal settings page",
"keywords": [ "keywords": [
"tabby-builtin-plugin" "tabby-builtin-plugin"

View File

@@ -32,7 +32,7 @@ ul.nav-tabs(ngbNav, #nav='ngbNav')
i.fas.fa-fw.fa-plus i.fas.fa-fw.fa-plus
| New profile | New profile
.list-group.list-group-light.mt-3.mb-3 .list-group.mt-3.mb-3
ng-container(*ngFor='let group of profileGroups') ng-container(*ngFor='let group of profileGroups')
ng-container(*ngIf='isGroupVisible(group)') ng-container(*ngIf='isGroupVisible(group)')
.list-group-item.list-group-item-action.d-flex.align-items-center( .list-group-item.list-group-item-action.d-flex.align-items-center(
@@ -118,7 +118,7 @@ ul.nav-tabs(ngbNav, #nav='ngbNav')
.title Default profile settings .title Default profile settings
.description These apply to all profiles of a given type .description These apply to all profiles of a given type
.list-group.list-group-light.mt-3.mb-3 .list-group.mt-3.mb-3
a.list-group-item.list-group-item-action( a.list-group-item.list-group-item-action(
(click)='editDefaults(provider)', (click)='editDefaults(provider)',
*ngFor='let provider of profileProviders' *ngFor='let provider of profileProviders'

View File

@@ -100,9 +100,13 @@ export class ProfilesSettingsTabComponent extends BaseComponent {
if (!provider) { if (!provider) {
throw new Error('Cannot edit a profile without a provider') throw new Error('Cannot edit a profile without a provider')
} }
modal.componentInstance.profile = Object.assign({}, profile) modal.componentInstance.profile = deepClone(profile)
modal.componentInstance.profileProvider = provider modal.componentInstance.profileProvider = provider
const result = await modal.result
const result = await modal.result.catch(() => null)
if (!result) {
return
}
// Fully replace the config // Fully replace the config
for (const k in profile) { for (const k in profile) {
@@ -207,7 +211,7 @@ export class ProfilesSettingsTabComponent extends BaseComponent {
} }
isProfileVisible (profile: PartialProfile<Profile>): boolean { isProfileVisible (profile: PartialProfile<Profile>): boolean {
return !this.filter || profile.name.toLowerCase().includes(this.filter.toLowerCase()) return !this.filter || (profile.name + '$' + (this.getDescription(profile) ?? '')).toLowerCase().includes(this.filter.toLowerCase())
} }
iconIsSVG (icon?: string): boolean { iconIsSVG (icon?: string): boolean {

View File

@@ -6,45 +6,66 @@
| Application | Application
ng-template(ngbNavContent) ng-template(ngbNavContent)
.content-box .content-box
.tabby-logo.mt-3 .row
h1.tabby-title Tabby .col-12.col-md-6
sup α .logo-area
.tabby-logo.mt-3
.text-center h1.tabby-title Tabby
.text-muted {{homeBase.appVersion}} sup α
.text-muted {{homeBase.appVersion}}
.mb-5.mt-3 button.btn.btn-secondary.mt-3.mb-2(
button.btn.btn-secondary.mr-3.mb-2((click)='homeBase.openGitHub()') *ngIf='!updateAvailable && hostApp.platform !== Platform.Web',
i.fab.fa-github (click)='checkForUpdates()',
span GitHub [disabled]='checkingForUpdate'
button.btn.btn-secondary.mr-3.mb-2((click)='homeBase.reportBug()')
i.fas.fa-bug
span Report a problem
button.btn.btn-secondary.mr-3.mb-2(
(click)='showReleaseNotes()',
)
i.fas.fa-book
span What's new
button.btn.btn-secondary.mr-3.mb-2(
*ngIf='!updateAvailable && hostApp.platform !== Platform.Web',
(click)='checkForUpdates()',
[disabled]='checkingForUpdate'
)
i.fas.fa-sync(
[class.fa-spin]='checkingForUpdate'
) )
span Check for updates i.fas.fa-sync(
[class.fa-spin]='checkingForUpdate'
)
span Check for updates
button.btn.btn-info.mr-3.mb-2( button.btn.btn-info.mt-3.mb-2(
*ngIf='updateAvailable', *ngIf='updateAvailable',
(click)='updater.update()', (click)='updater.update()',
) )
i.fas.fa-sync i.fas.fa-sync
span Update span Update
.col-12.col-md-6
.list-group.list-group-light.mb-5
button.list-group-item.list-group-item-action.link-card((click)='homeBase.reportBug()')
i.fas.fa-fw.fa-bug
div
div Report a problem
small.text-muted Generate a pre-filled GitHub issue
button.list-group-item.list-group-item-action.link-card((click)='homeBase.openDiscussions()')
i.fas.fa-fw.fa-comments
div
div Ask a question
small.text-muted On GitHub Discussions
button.list-group-item.list-group-item-action.link-card((click)='homeBase.openGitHub()')
i.fab.fa-fw.fa-github
div
div GitHub
small.text-muted Source code
button.list-group-item.list-group-item-action.link-card((click)='showReleaseNotes()')
i.fas.fa-fw.fa-book
div
div What's new
small.text-muted Show release notes
button.list-group-item.list-group-item-action.link-card((click)='homeBase.openTwitter()')
i.fab.fa-fw.fa-twitter
div
div Subscribe to updates
small.text-muted Tabby news and updates on Twitter
h3 Application settings
.form-line(*ngIf='platform.isShellIntegrationSupported()') .form-line(*ngIf='platform.isShellIntegrationSupported()')
.header .header
.title Shell integration .title Shell integration

View File

@@ -9,6 +9,24 @@
flex: none; flex: none;
} }
.logo-area {
.tabby-logo {
margin: 0 0 0 -8px;
width: 60px;
height: 60px;
}
.tabby-title {
text-align: left;
}
}
.link-card {
display: flex;
line-height: 1;
align-items: center;
}
> .content { > .content {
display: flex; display: flex;
min-height: 0; min-height: 0;
@@ -16,7 +34,7 @@
> .nav { > .nav {
padding: 20px 10px; padding: 20px 10px;
width: 212px; width: 222px;
flex: none; flex: none;
overflow-y: auto; overflow-y: auto;
flex-wrap: nowrap; flex-wrap: nowrap;

View File

@@ -5,7 +5,6 @@ import { WindowSettingsTabComponent } from './components/windowSettingsTab.compo
import { VaultSettingsTabComponent } from './components/vaultSettingsTab.component' import { VaultSettingsTabComponent } from './components/vaultSettingsTab.component'
import { ConfigSyncSettingsTabComponent } from './components/configSyncSettingsTab.component' import { ConfigSyncSettingsTabComponent } from './components/configSyncSettingsTab.component'
import { ProfilesSettingsTabComponent } from './components/profilesSettingsTab.component' import { ProfilesSettingsTabComponent } from './components/profilesSettingsTab.component'
import { ConfigSyncService } from './services/configSync.service'
/** @hidden */ /** @hidden */
@Injectable() @Injectable()
@@ -66,14 +65,7 @@ export class ConfigSyncSettingsTabProvider extends SettingsTabProvider {
icon = 'cloud' icon = 'cloud'
title = 'Config sync' title = 'Config sync'
constructor (
private configSync: ConfigSyncService,
) { super() }
getComponentType (): any { getComponentType (): any {
if (!this.configSync.isAvailable()) {
return null
}
return ConfigSyncSettingsTabComponent return ConfigSyncSettingsTabComponent
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "tabby-ssh", "name": "tabby-ssh",
"version": "1.0.162-nightly.0", "version": "1.0.165-nightly.0",
"description": "SSH connections for Tabby", "description": "SSH connections for Tabby",
"keywords": [ "keywords": [
"tabby-builtin-plugin" "tabby-builtin-plugin"
@@ -29,7 +29,7 @@
}, },
"dependencies": { "dependencies": {
"run-script-os": "^1.1.3", "run-script-os": "^1.1.3",
"socksv5": "^0.0.6" "@luminati-io/socksv5": "^0.0.7"
}, },
"peerDependencies": { "peerDependencies": {
"@angular/animations": "^9.1.9", "@angular/animations": "^9.1.9",

View File

@@ -30,6 +30,8 @@ export interface SSHProfileOptions extends LoginScriptsOptions {
algorithms?: Record<string, string[]> algorithms?: Record<string, string[]>
proxyCommand?: string proxyCommand?: string
forwardedPorts?: ForwardedPortConfig[] forwardedPorts?: ForwardedPortConfig[]
socksProxyHost?: string
socksProxyPort?: number
} }
export enum PortForwardType { export enum PortForwardType {
@@ -44,10 +46,15 @@ export interface ForwardedPortConfig {
port: number port: number
targetAddress: string targetAddress: string
targetPort: number targetPort: number
description: string
} }
export const ALGORITHM_BLACKLIST = [ export let ALGORITHM_BLACKLIST = [
// cause native crashes in node crypto, use EC instead // cause native crashes in node crypto, use EC instead
'diffie-hellman-group-exchange-sha256', 'diffie-hellman-group-exchange-sha256',
'diffie-hellman-group-exchange-sha1', 'diffie-hellman-group-exchange-sha1',
] ]
if (!process.env.TABBY_ENABLE_SSH_ALG_BLACKLIST) {
ALGORITHM_BLACKLIST = []
}

View File

@@ -2,7 +2,7 @@
strong Keyboard-interactive auth strong Keyboard-interactive auth
.ml-2 {{prompt.name}} .ml-2 {{prompt.name}}
.prompt-text {{prompt.prompts[step]}} .prompt-text {{prompt.prompts[step].prompt}}
input.form-control.mt-2( input.form-control.mt-2(
#input, #input,

View File

@@ -15,7 +15,7 @@ export class KeyboardInteractiveAuthComponent {
@ViewChild('input') input: ElementRef @ViewChild('input') input: ElementRef
isPassword (): boolean { isPassword (): boolean {
return this.prompt.prompts[this.step].toLowerCase().includes('password') return this.prompt.prompts[this.step].prompt.toLowerCase().includes('password') || !this.prompt.prompts[this.step].echo
} }
previous (): void { previous (): void {

View File

@@ -16,7 +16,7 @@
div(*ngIf='!sftp') Connecting div(*ngIf='!sftp') Connecting
div(*ngIf='sftp') div(*ngIf='sftp')
div(*ngIf='fileList === null') Loading div(*ngIf='fileList === null') Loading
.list-group.list-group-flush(*ngIf='fileList !== null') .list-group.list-group-light(*ngIf='fileList !== null')
.list-group-item.list-group-item-action.d-flex.align-items-center( .list-group-item.list-group-item-action.d-flex.align-items-center(
*ngIf='path !== "/"', *ngIf='path !== "/"',
(click)='goUp()' (click)='goUp()'

View File

@@ -1,15 +1,20 @@
.list-group.mb-3 .list-group.mb-3
.list-group-item.d-flex.align-items-center(*ngFor='let fw of model') .list-group-item.d-flex.align-items-center(*ngFor='let fw of model')
strong(*ngIf='fw.type === PortForwardType.Local') Local div
strong(*ngIf='fw.type === PortForwardType.Remote') Remote .ms-2.d-flex.align-items-center
strong(*ngIf='fw.type === PortForwardType.Dynamic') Dynamic strong(*ngIf='fw.type === PortForwardType.Local') Local
.ml-3 {{fw.host}}:{{fw.port}} strong(*ngIf='fw.type === PortForwardType.Remote') Remote
.ml-2 &rarr; strong(*ngIf='fw.type === PortForwardType.Dynamic') Dynamic
.ml-2(*ngIf='fw.type !== PortForwardType.Dynamic') {{fw.targetAddress}}:{{fw.targetPort}} .ml-3 {{fw.host}}:{{fw.port}}
.ml-2(*ngIf='fw.type === PortForwardType.Dynamic') SOCKS proxy .ml-2 &rarr;
.ml-2(*ngIf='fw.type !== PortForwardType.Dynamic') {{fw.targetAddress}}:{{fw.targetPort}}
.ml-2(*ngIf='fw.type === PortForwardType.Dynamic') SOCKS proxy
div {{fw.description}}
button.btn.btn-link.hover-reveal.ml-auto((click)='remove(fw)') button.btn.btn-link.hover-reveal.ml-auto((click)='remove(fw)')
i.fas.fa-trash-alt i.fas.fa-trash-alt
h5 Add a port forward
.input-group.mb-2(*ngIf='newForward.type === PortForwardType.Dynamic') .input-group.mb-2(*ngIf='newForward.type === PortForwardType.Dynamic')
input.form-control(type='text', [(ngModel)]='newForward.host') input.form-control(type='text', [(ngModel)]='newForward.host')
.input-group-append .input-group-append
@@ -31,6 +36,9 @@
.input-group-text : .input-group-text :
input.form-control(type='number', [(ngModel)]='newForward.targetPort') input.form-control(type='number', [(ngModel)]='newForward.targetPort')
.input-group.mb-2
input.form-control(type='text', placeholder='Description', [(ngModel)]='newForward.description')
.d-flex .d-flex
.btn-group.mr-auto( .btn-group.mr-auto(
[(ngModel)]='newForward.type', [(ngModel)]='newForward.type',

View File

@@ -26,6 +26,7 @@ export class SSHPortForwardingConfigComponent {
port: 8000, port: 8000,
targetAddress: '127.0.0.1', targetAddress: '127.0.0.1',
targetPort: 80, targetPort: 80,
description: '',
} }
} }
@@ -40,5 +41,6 @@ export class SSHPortForwardingConfigComponent {
remove (fw: ForwardedPortConfig) { remove (fw: ForwardedPortConfig) {
this.forwardRemoved.emit(fw) this.forwardRemoved.emit(fw)
this.newForward = fw
} }
} }

View File

@@ -1,5 +1,5 @@
.modal-header .modal-header(*ngIf='session.forwardedPorts.length')
h5.m-0 Port forwarding h5.m-0 Forwarded ports
.modal-body.pt-0 .modal-body.pt-0
ssh-port-forwarding-config( ssh-port-forwarding-config(

View File

@@ -2,15 +2,48 @@ ul.nav-tabs(ngbNav, #nav='ngbNav')
li(ngbNavItem) li(ngbNavItem)
a(ngbNavLink) General a(ngbNavLink) General
ng-template(ngbNavContent) ng-template(ngbNavContent)
.d-flex.w-100(*ngIf='!useProxyCommand') .d-flex.w-100.mt-3
.form-group.w-100.mr-4 .form-group.mr-2(
ngbDropdown
)
label Connection
button.btn.btn-secondary.d-block(ngbDropdownToggle) {{getConnectionDropdownTitle()}}
div(ngbDropdownMenu)
button.dropdown-item(
(click)='connectionMode = "direct"',
) Direct
button.dropdown-item(
*ngIf='hostApp.platform !== Platform.Web',
(click)='connectionMode = "proxyCommand"',
)
div Proxy command
.text-muted Command's stdin/stdout is used instead of a network connection
button.dropdown-item(
(click)='connectionMode = "jumpHost"',
)
div Jump host
.text-muted Connect to a different host first and use it as a proxy
button.dropdown-item(
(click)='connectionMode = "socksProxy"',
)
div SOCKS proxy
.text-muted Connect through a proxy server
.form-group.w-100(*ngIf='connectionMode === "proxyCommand"')
label Proxy command
input.form-control(
type='text',
[(ngModel)]='profile.options.proxyCommand',
)
.form-group.w-100.mr-2(*ngIf='connectionMode !== "proxyCommand"')
label Host label Host
input.form-control( input.form-control(
type='text', type='text',
[(ngModel)]='profile.options.host', [(ngModel)]='profile.options.host',
) )
.form-group .form-group(*ngIf='connectionMode !== "proxyCommand"')
label Port label Port
input.form-control( input.form-control(
type='number', type='number',
@@ -18,8 +51,28 @@ ul.nav-tabs(ngbNav, #nav='ngbNav')
[(ngModel)]='profile.options.port', [(ngModel)]='profile.options.port',
) )
.alert.alert-info(*ngIf='useProxyCommand') .form-group(*ngIf='connectionMode === "jumpHost"')
.mr-auto Using a proxy command instead of a network connection label Jump host
select.form-control([(ngModel)]='profile.options.jumpHost')
option([ngValue]='null') Select
option([ngValue]='x.id', *ngFor='let x of jumpHosts') {{x.name}}
.d-flex.w-100(*ngIf='connectionMode === "socksProxy"')
.form-group.w-100.mr-2
label SOCKS proxy host
input.form-control(
type='text',
[(ngModel)]='profile.options.socksProxyHost',
)
.form-group
label SOCKS proxy port
input.form-control(
type='number',
placeholder='5000',
[(ngModel)]='profile.options.socksProxyPort',
)
.form-group .form-group
label Username label Username
@@ -93,13 +146,6 @@ ul.nav-tabs(ngbNav, #nav='ngbNav')
li(ngbNavItem) li(ngbNavItem)
a(ngbNavLink) Advanced a(ngbNavLink) Advanced
ng-template(ngbNavContent) ng-template(ngbNavContent)
.form-line(*ngIf='!useProxyCommand')
.header
.title Jump host
select.form-control([(ngModel)]='profile.options.jumpHost')
option(value='') None
option([ngValue]='x.id', *ngFor='let x of jumpHosts') {{x.name}}
.form-line(ng:if='hostApp.platform !== Platform.Web') .form-line(ng:if='hostApp.platform !== Platform.Web')
.header .header
.title X11 forwarding .title X11 forwarding
@@ -143,19 +189,6 @@ ul.nav-tabs(ngbNav, #nav='ngbNav')
[(ngModel)]='profile.options.readyTimeout', [(ngModel)]='profile.options.readyTimeout',
) )
.form-line(*ngIf='!profile.options.jumpHost && hostApp.platform !== Platform.Web')
.header
.title Use a proxy command
.description Command's stdin/stdout is used instead of a network connection
toggle([(ngModel)]='useProxyCommand')
.form-group(*ngIf='useProxyCommand && !profile.options.jumpHost')
label Proxy command
input.form-control(
type='text',
[(ngModel)]='profile.options.proxyCommand',
)
li(ngbNavItem) li(ngbNavItem)
a(ngbNavLink) Ciphers a(ngbNavLink) Ciphers
ng-template(ngbNavContent) ng-template(ngbNavContent)

View File

@@ -16,7 +16,8 @@ export class SSHProfileSettingsComponent {
Platform = Platform Platform = Platform
profile: SSHProfile profile: SSHProfile
hasSavedPassword: boolean hasSavedPassword: boolean
useProxyCommand: boolean
connectionMode: 'direct'|'proxyCommand'|'jumpHost'|'socksProxy' = 'direct'
supportedAlgorithms = supportedAlgorithms supportedAlgorithms = supportedAlgorithms
algorithms: Record<string, Record<string, boolean>> = {} algorithms: Record<string, Record<string, boolean>> = {}
@@ -43,7 +44,14 @@ export class SSHProfileSettingsComponent {
this.profile.options.auth = this.profile.options.auth ?? null this.profile.options.auth = this.profile.options.auth ?? null
this.profile.options.privateKeys ??= [] this.profile.options.privateKeys ??= []
this.useProxyCommand = !!this.profile.options.proxyCommand if (this.profile.options.proxyCommand) {
this.connectionMode = 'proxyCommand'
} else if (this.profile.options.jumpHost) {
this.connectionMode = 'jumpHost'
} else if (this.profile.options.socksProxyHost) {
this.connectionMode = 'socksProxy'
}
if (this.profile.options.user) { if (this.profile.options.user) {
try { try {
this.hasSavedPassword = !!await this.passwordStorage.loadPassword(this.profile) this.hasSavedPassword = !!await this.passwordStorage.loadPassword(this.profile)
@@ -90,9 +98,18 @@ export class SSHProfileSettingsComponent {
.map(([key, _]) => key) .map(([key, _]) => key)
this.profile.options.algorithms![k].sort() this.profile.options.algorithms![k].sort()
} }
if (!this.useProxyCommand) {
if (this.connectionMode !== 'jumpHost') {
this.profile.options.jumpHost = undefined
}
if (this.connectionMode !== 'proxyCommand') {
this.profile.options.proxyCommand = undefined this.profile.options.proxyCommand = undefined
} }
if (this.connectionMode !== 'socksProxy') {
this.profile.options.socksProxyHost = undefined
this.profile.options.socksProxyPort = undefined
}
this.loginScriptsSettings?.save() this.loginScriptsSettings?.save()
} }
@@ -104,4 +121,13 @@ export class SSHProfileSettingsComponent {
onForwardRemoved (fw: ForwardedPortConfig) { onForwardRemoved (fw: ForwardedPortConfig) {
this.profile.options.forwardedPorts = this.profile.options.forwardedPorts?.filter(x => x !== fw) this.profile.options.forwardedPorts = this.profile.options.forwardedPorts?.filter(x => x !== fw)
} }
getConnectionDropdownTitle () {
return {
direct: 'Direct',
proxyCommand: 'Proxy command',
jumpHost: 'Jump host',
socksProxy: 'SOCKS proxy',
}[this.connectionMode]
}
} }

View File

@@ -37,6 +37,8 @@ export class SSHProfilesService extends ProfileProvider<SSHProfile> {
proxyCommand: null, proxyCommand: null,
forwardedPorts: [], forwardedPorts: [],
scripts: [], scripts: [],
socksProxyHost: null,
socksProxyPort: null,
}, },
} }
@@ -73,7 +75,7 @@ export class SSHProfilesService extends ProfileProvider<SSHProfile> {
}] }]
} }
async getNewTabParameters (profile: PartialProfile<SSHProfile>): Promise<NewTabParameters<SSHTabComponent>> { async getNewTabParameters (profile: SSHProfile): Promise<NewTabParameters<SSHTabComponent>> {
return { return {
type: SSHTabComponent, type: SSHTabComponent,
inputs: { profile }, inputs: { profile },

View File

@@ -1,4 +1,5 @@
import * as shellQuote from 'shell-quote' import * as shellQuote from 'shell-quote'
import socksv5 from '@luminati-io/socksv5'
import { Duplex } from 'stream' import { Duplex } from 'stream'
import { Injectable } from '@angular/core' import { Injectable } from '@angular/core'
import { spawn } from 'child_process' import { spawn } from 'child_process'
@@ -28,8 +29,8 @@ export class SSHService {
return this.detectedWinSCPPath ?? this.config.store.ssh.winSCPPath return this.detectedWinSCPPath ?? this.config.store.ssh.winSCPPath
} }
async getWinSCPURI (profile: SSHProfile, cwd?: string): Promise<string> { async getWinSCPURI (profile: SSHProfile, cwd?: string, username?: string): Promise<string> {
let uri = `scp://${profile.options.user}` let uri = `scp://${username ?? profile.options.user}`
const password = await this.passwordStorage.loadPassword(profile) const password = await this.passwordStorage.loadPassword(profile)
if (password) { if (password) {
uri += ':' + encodeURIComponent(password) uri += ':' + encodeURIComponent(password)
@@ -43,7 +44,7 @@ export class SSHService {
if (!path) { if (!path) {
return return
} }
const args = [await this.getWinSCPURI(session.profile)] const args = [await this.getWinSCPURI(session.profile, undefined, session.authUsername ?? undefined)]
if (session.activePrivateKey) { if (session.activePrivateKey) {
args.push('/privatekey') args.push('/privatekey')
args.push(session.activePrivateKey) args.push(session.activePrivateKey)
@@ -52,6 +53,61 @@ export class SSHService {
} }
} }
export class SocksProxyStream extends Duplex {
private client: Duplex|null
private header: Buffer|null
constructor (private profile: SSHProfile) {
super({
allowHalfOpen: false,
})
}
async start (): Promise<void> {
this.client = await new Promise((resolve, reject) => {
const connector = socksv5.connect({
host: this.profile.options.host,
port: this.profile.options.port,
proxyHost: this.profile.options.socksProxyHost ?? '127.0.0.1',
proxyPort: this.profile.options.socksProxyPort ?? 5000,
auths: [socksv5.auth.None()],
}, s => {
resolve(s)
this.header = s.read()
this.push(this.header)
})
connector.on('error', (err) => {
reject(err)
this.destroy(err)
})
})
this.client?.on('data', data => {
if (data !== this.header) {
// socksv5 doesn't reliably emit the first data event
this.push(data)
this.header = null
}
})
this.client?.on('close', (err) => {
this.destroy(err)
})
}
_read (size: number): void {
this.client?.read(size)
}
_write (chunk: Buffer, _encoding: string, callback: (error?: Error | null) => void): void {
this.client?.write(chunk, callback)
}
_destroy (error: Error|null, callback: (error: Error|null) => void): void {
this.client?.destroy()
callback(error)
}
}
export class ProxyCommandStream extends Duplex { export class ProxyCommandStream extends Duplex {
private process: ChildProcess private process: ChildProcess

View File

@@ -1,4 +1,4 @@
import socksv5 from 'socksv5' import socksv5 from '@luminati-io/socksv5'
import { Server, Socket, createServer } from 'net' import { Server, Socket, createServer } from 'net'
import { ForwardedPortConfig, PortForwardType } from '../api' import { ForwardedPortConfig, PortForwardType } from '../api'
@@ -9,6 +9,7 @@ export class ForwardedPort implements ForwardedPortConfig {
port: number port: number
targetAddress: string targetAddress: string
targetPort: number targetPort: number
description: string
private listener: Server|null = null private listener: Server|null = null

View File

@@ -12,7 +12,7 @@ import { BaseSession } from 'tabby-terminal'
import { Socket } from 'net' import { Socket } from 'net'
import { Client, ClientChannel, SFTPWrapper } from 'ssh2' import { Client, ClientChannel, SFTPWrapper } from 'ssh2'
import { Subject, Observable } from 'rxjs' import { Subject, Observable } from 'rxjs'
import { ProxyCommandStream } from '../services/ssh.service' import { ProxyCommandStream, SocksProxyStream } from '../services/ssh.service'
import { PasswordStorageService } from '../services/passwordStorage.service' import { PasswordStorageService } from '../services/passwordStorage.service'
import { promisify } from 'util' import { promisify } from 'util'
import { SFTPSession } from './sftp' import { SFTPSession } from './sftp'
@@ -22,6 +22,11 @@ import { X11Socket } from './x11'
const WINDOWS_OPENSSH_AGENT_PIPE = '\\\\.\\pipe\\openssh-ssh-agent' const WINDOWS_OPENSSH_AGENT_PIPE = '\\\\.\\pipe\\openssh-ssh-agent'
export interface Prompt {
prompt: string
echo?: boolean
}
interface AuthMethod { interface AuthMethod {
type: 'none'|'publickey'|'agent'|'password'|'keyboard-interactive'|'hostbased' type: 'none'|'publickey'|'agent'|'password'|'keyboard-interactive'|'hostbased'
name?: string name?: string
@@ -34,7 +39,7 @@ export class KeyboardInteractivePrompt {
constructor ( constructor (
public name: string, public name: string,
public instruction: string, public instruction: string,
public prompts: string[], public prompts: Prompt[],
private callback: (_: string[]) => void, private callback: (_: string[]) => void,
) { } ) { }
@@ -50,18 +55,19 @@ export class SSHSession extends BaseSession {
forwardedPorts: ForwardedPort[] = [] forwardedPorts: ForwardedPort[] = []
jumpStream: any jumpStream: any
proxyCommandStream: ProxyCommandStream|null = null proxyCommandStream: ProxyCommandStream|null = null
socksProxyStream: SocksProxyStream|null = null
savedPassword?: string savedPassword?: string
get serviceMessage$ (): Observable<string> { return this.serviceMessage } get serviceMessage$ (): Observable<string> { return this.serviceMessage }
get keyboardInteractivePrompt$ (): Observable<KeyboardInteractivePrompt> { return this.keyboardInteractivePrompt } get keyboardInteractivePrompt$ (): Observable<KeyboardInteractivePrompt> { return this.keyboardInteractivePrompt }
agentPath?: string agentPath?: string
activePrivateKey: string|null = null activePrivateKey: string|null = null
authUsername: string|null = null
private remainingAuthMethods: AuthMethod[] = [] private remainingAuthMethods: AuthMethod[] = []
private serviceMessage = new Subject<string>() private serviceMessage = new Subject<string>()
private keyboardInteractivePrompt = new Subject<KeyboardInteractivePrompt>() private keyboardInteractivePrompt = new Subject<KeyboardInteractivePrompt>()
private keychainPasswordUsed = false private keychainPasswordUsed = false
private authUsername: string|null = null
private passwordStorage: PasswordStorageService private passwordStorage: PasswordStorageService
private ngbModal: NgbModal private ngbModal: NgbModal
@@ -212,7 +218,7 @@ export class SSHSession extends BaseSession {
this.emitKeyboardInteractivePrompt(new KeyboardInteractivePrompt( this.emitKeyboardInteractivePrompt(new KeyboardInteractivePrompt(
name, name,
instructions, instructions,
prompts.map(x => x.prompt), prompts,
finish, finish,
)) ))
})) }))
@@ -231,6 +237,11 @@ export class SSHSession extends BaseSession {
}) })
try { try {
if (this.profile.options.socksProxyHost) {
this.emitServiceMessage(colors.bgBlue.black(' Proxy ') + ` Using ${this.profile.options.socksProxyHost}:${this.profile.options.socksProxyPort}`)
this.socksProxyStream = new SocksProxyStream(this.profile)
await this.socksProxyStream.start()
}
if (this.profile.options.proxyCommand) { if (this.profile.options.proxyCommand) {
this.emitServiceMessage(colors.bgBlue.black(' Proxy command ') + ` Using ${this.profile.options.proxyCommand}`) this.emitServiceMessage(colors.bgBlue.black(' Proxy command ') + ` Using ${this.profile.options.proxyCommand}`)
this.proxyCommandStream = new ProxyCommandStream(this.profile.options.proxyCommand) this.proxyCommandStream = new ProxyCommandStream(this.profile.options.proxyCommand)
@@ -262,7 +273,7 @@ export class SSHSession extends BaseSession {
ssh.connect({ ssh.connect({
host: this.profile.options.host.trim(), host: this.profile.options.host.trim(),
port: this.profile.options.port ?? 22, port: this.profile.options.port ?? 22,
sock: this.proxyCommandStream ?? this.jumpStream, sock: this.proxyCommandStream ?? this.jumpStream ?? this.socksProxyStream,
username: this.authUsername ?? undefined, username: this.authUsername ?? undefined,
tryKeyboard: true, tryKeyboard: true,
agent: this.agentPath, agent: this.agentPath,
@@ -279,9 +290,7 @@ export class SSHSession extends BaseSession {
algorithms, algorithms,
authHandler: (methodsLeft, partialSuccess, callback) => { authHandler: (methodsLeft, partialSuccess, callback) => {
this.zone.run(async () => { this.zone.run(async () => {
const a = await this.handleAuth(methodsLeft) callback(await this.handleAuth(methodsLeft))
console.warn(a)
callback(a)
}) })
}, },
}) })
@@ -362,7 +371,7 @@ export class SSHSession extends BaseSession {
this.ssh.on('x11', async (details, accept, reject) => { this.ssh.on('x11', async (details, accept, reject) => {
this.logger.info(`Incoming X11 connection from ${details.srcIP}:${details.srcPort}`) this.logger.info(`Incoming X11 connection from ${details.srcIP}:${details.srcPort}`)
const displaySpec = process.env.DISPLAY ?? 'localhost:0' const displaySpec = (this.config.store.ssh.x11Display || process.env.DISPLAY) ?? 'localhost:0'
this.logger.debug(`Trying display ${displaySpec}`) this.logger.debug(`Trying display ${displaySpec}`)
const socket = new X11Socket() const socket = new X11Socket()

View File

@@ -6,8 +6,8 @@ export class X11Socket {
private socket: Socket | null = null private socket: Socket | null = null
static resolveDisplaySpec (spec?: string|null): SocketConnectOpts { static resolveDisplaySpec (spec?: string|null): SocketConnectOpts {
// eslint-disable-next-line prefer-const // eslint-disable-next-line prefer-const, @typescript-eslint/no-unused-vars
let [xHost, xDisplay] = /^(.+):(\d+)(?:.(\d+))$/.exec(spec ?? process.env.DISPLAY ?? 'localhost:0') ?? [] let [_, xHost, xDisplay] = /^(.+):(\d+)(?:.(\d+))$/.exec(spec ?? process.env.DISPLAY ?? 'localhost:0') ?? []
if (process.platform === 'win32') { if (process.platform === 'win32') {
xHost ??= 'localhost' xHost ??= 'localhost'
} else { } else {

View File

@@ -2,6 +2,13 @@
# yarn lockfile v1 # yarn lockfile v1
"@luminati-io/socksv5@^0.0.7":
version "0.0.7"
resolved "https://registry.yarnpkg.com/@luminati-io/socksv5/-/socksv5-0.0.7.tgz#87414177d473c97aaefa907a3fe454d62d2fceca"
integrity sha512-paEEbcstjMZb2SvFHsSUOzimkx80/pFmMG5T3XR6Keb4NeBfYWEAtlVeiF39OrHRf9AjpNxahhwzdCAlLXZ4Hw==
dependencies:
ipv6 "*"
"@types/node@*", "@types/node@16.0.1": "@types/node@*", "@types/node@16.0.1":
version "16.0.1" version "16.0.1"
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.0.1.tgz#70cedfda26af7a2ca073fdcc9beb2fff4aa693f8" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.0.1.tgz#70cedfda26af7a2ca073fdcc9beb2fff4aa693f8"
@@ -15,9 +22,9 @@
"@types/node" "*" "@types/node" "*"
"@types/ssh2@^0.5.46": "@types/ssh2@^0.5.46":
version "0.5.48" version "0.5.49"
resolved "https://registry.yarnpkg.com/@types/ssh2/-/ssh2-0.5.48.tgz#0d9e8654a76eaaf4cfeaeb88d74c4489cfcf7aea" resolved "https://registry.yarnpkg.com/@types/ssh2/-/ssh2-0.5.49.tgz#40014f780e3b7e6e667503df414fc884089c76e4"
integrity sha512-cmQu0gp/6RtDXe1r2xXGgi0V0TeCdueDSRMEvBX8cTRT/sSREkUpgCYZLyh+iI8Ql+VNV8Az9toQoYa/IdgHbQ== integrity sha512-ffxhQhJqgTzrw8NxHTgkaDtAmAj2qxCyoves7ztpRgqvzbHcZTpTcm+ATWuuCbPQzxnnF4F3SGGTLGEWTZpwqA==
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
"@types/ssh2-streams" "*" "@types/ssh2-streams" "*"
@@ -215,13 +222,6 @@ safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
socksv5@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/socksv5/-/socksv5-0.0.6.tgz#1327235ff7e8de21ac434a0a579dc69c3f071061"
integrity sha1-EycjX/fo3iGsQ0oKV53GnD8HEGE=
dependencies:
ipv6 "*"
sprintf@0.1.x: sprintf@0.1.x:
version "0.1.5" version "0.1.5"
resolved "https://registry.yarnpkg.com/sprintf/-/sprintf-0.1.5.tgz#8f83e39a9317c1a502cb7db8050e51c679f6edcf" resolved "https://registry.yarnpkg.com/sprintf/-/sprintf-0.1.5.tgz#8f83e39a9317c1a502cb7db8050e51c679f6edcf"

View File

@@ -1,6 +1,6 @@
{ {
"name": "tabby-telnet", "name": "tabby-telnet",
"version": "1.0.162-nightly.0", "version": "1.0.165-nightly.0",
"description": "Telnet/socket connections for Tabby", "description": "Telnet/socket connections for Tabby",
"keywords": [ "keywords": [
"tabby-builtin-plugin" "tabby-builtin-plugin"

View File

@@ -55,7 +55,7 @@ export class TelnetProfilesService extends ProfileProvider<TelnetProfile> {
] ]
} }
async getNewTabParameters (profile: PartialProfile<TelnetProfile>): Promise<NewTabParameters<TelnetTabComponent>> { async getNewTabParameters (profile: TelnetProfile): Promise<NewTabParameters<TelnetTabComponent>> {
return { return {
type: TelnetTabComponent, type: TelnetTabComponent,
inputs: { profile }, inputs: { profile },

View File

@@ -1,5 +1,4 @@
Tabby Terminal Plugin # Tabby Terminal Plugin
------------------------
* terminal tabs * terminal tabs
* terminal frontends * terminal frontends

View File

@@ -1,6 +1,6 @@
{ {
"name": "tabby-terminal", "name": "tabby-terminal",
"version": "1.0.162-nightly.0", "version": "1.0.165-nightly.0",
"description": "Tabby's terminal emulation core", "description": "Tabby's terminal emulation core",
"keywords": [ "keywords": [
"tabby-builtin-plugin" "tabby-builtin-plugin"

View File

@@ -298,6 +298,7 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
this.frontend.resize$.pipe(first()).subscribe(async ({ columns, rows }) => { this.frontend.resize$.pipe(first()).subscribe(async ({ columns, rows }) => {
this.size = { columns, rows } this.size = { columns, rows }
this.frontendReady.next() this.frontendReady.next()
this.frontendReady.complete()
this.config.enabledServices(this.decorators).forEach(decorator => { this.config.enabledServices(this.decorators).forEach(decorator => {
try { try {
@@ -554,6 +555,7 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
} }
}) })
this.output.complete() this.output.complete()
this.frontendReady.complete()
super.destroy() super.destroy()
if (this.session?.open) { if (this.session?.open) {
@@ -565,13 +567,27 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
this.termContainerSubscriptions.cancelAll() this.termContainerSubscriptions.cancelAll()
} }
protected async handleRightClick (event: MouseEvent): Promise<void> { private rightMouseDownTime = 0
protected async handleRightMouseDown (event: MouseEvent): Promise<void> {
event.preventDefault() event.preventDefault()
event.stopPropagation() event.stopPropagation()
this.rightMouseDownTime = Date.now()
if (this.config.store.terminal.rightClick === 'menu') { if (this.config.store.terminal.rightClick === 'menu') {
this.platform.popupContextMenu(await this.buildContextMenu(), event) this.platform.popupContextMenu(await this.buildContextMenu(), event)
} else if (this.config.store.terminal.rightClick === 'paste') { }
this.paste() }
protected async handleRightMouseUp (event: MouseEvent): Promise<void> {
event.preventDefault()
event.stopPropagation()
if (this.config.store.terminal.rightClick === 'paste') {
const duration = Date.now() - this.rightMouseDownTime
if (duration < 250) {
this.paste()
} else {
this.platform.popupContextMenu(await this.buildContextMenu(), event)
}
} }
} }
@@ -611,7 +627,13 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
return return
} }
if (event.which === 3 || event.which === 1 && event.ctrlKey) { if (event.which === 3 || event.which === 1 && event.ctrlKey) {
this.handleRightClick(event) this.handleRightMouseDown(event)
return
}
}
if (event.type === 'mouseup') {
if (event.which === 3 || event.which === 1 && event.ctrlKey) {
this.handleRightMouseUp(event)
return return
} }
} }

View File

@@ -1,168 +1,203 @@
h3.mb-3 Terminal div
h3.mb-3 Rendering
.form-line(*ngIf='hostApp.platform !== Platform.Web') .form-line(*ngIf='hostApp.platform !== Platform.Web')
.header .header
.title Frontend .title Frontend
.description Switches terminal frontend implementation (experimental) .description Switches terminal frontend implementation (experimental)
select.form-control( select.form-control(
[(ngModel)]='config.store.terminal.frontend', [(ngModel)]='config.store.terminal.frontend',
(ngModelChange)='config.save()', (ngModelChange)='config.save()',
) )
option(value='xterm') xterm option(value='xterm') xterm
option(value='xterm-webgl') xterm (WebGL) option(value='xterm-webgl') xterm (WebGL)
.form-line div.mt-4
.header h3 Keyboard
.title Terminal bell
.btn-group(
[(ngModel)]='config.store.terminal.bell',
(ngModelChange)='config.save()',
ngbRadioGroup
)
label.btn.btn-secondary(ngbButtonLabel)
input(
type='radio',
ngbButton,
[value]='"off"'
)
| Off
label.btn.btn-secondary(ngbButtonLabel)
input(
type='radio',
ngbButton,
[value]='"visual"'
)
| Visual
label.btn.btn-secondary(ngbButtonLabel)
input(
type='radio',
ngbButton,
[value]='"audible"'
)
| Audible
.alert.alert-info.d-flex.align-items-center(*ngIf='config.store.terminal.bell != "audible" && (config.store.terminal.profile || "").startsWith("wsl")') .form-line
.mr-auto WSL terminal bell can only be muted via Volume Mixer .header
button.btn.btn-secondary((click)='openWSLVolumeMixer()') Show Mixer .title Use {{altKeyName}} as the Meta key
.description Lets the shell handle Meta key instead of OS
toggle(
[(ngModel)]='config.store.terminal.altIsMeta',
(ngModelChange)='config.save()',
)
.form-line .form-line
.header .header
.title Right click .title Scroll on input
.btn-group( .description Scrolls the terminal to the bottom on user input
[(ngModel)]='config.store.terminal.rightClick', toggle(
(ngModelChange)='config.save()', [(ngModel)]='config.store.terminal.scrollOnInput',
ngbRadioGroup (ngModelChange)='config.save()',
) )
label.btn.btn-secondary(ngbButtonLabel)
input(
type='radio',
ngbButton,
value='off'
)
| Off
label.btn.btn-secondary(ngbButtonLabel)
input(
type='radio',
ngbButton,
value='menu'
)
| Context menu
label.btn.btn-secondary(ngbButtonLabel)
input(
type='radio',
ngbButton,
value='paste'
)
| Paste
.form-line div.mt-4
.header h3 Mouse
.title Paste on middle-click
toggle( .form-line
[(ngModel)]='config.store.terminal.pasteOnMiddleClick', .header
(ngModelChange)='config.save()', .title Right click
) .description(*ngIf='config.store.terminal.rightClick == "paste"') Long-click for context menu
.btn-group(
[(ngModel)]='config.store.terminal.rightClick',
(ngModelChange)='config.save()',
ngbRadioGroup
)
label.btn.btn-secondary(ngbButtonLabel)
input(
type='radio',
ngbButton,
value='off'
)
| Off
label.btn.btn-secondary(ngbButtonLabel)
input(
type='radio',
ngbButton,
value='menu'
)
| Context menu
label.btn.btn-secondary(ngbButtonLabel)
input(
type='radio',
ngbButton,
value='paste'
)
| Paste
.form-line(*ngIf='hostApp.platform !== Platform.Web') .form-line
.header .header
.title Auto-open a terminal on app start .title Paste on middle-click
toggle( toggle(
[(ngModel)]='config.store.terminal.autoOpen', [(ngModel)]='config.store.terminal.pasteOnMiddleClick',
(ngModelChange)='config.save()', (ngModelChange)='config.save()',
) )
.form-line .form-line
.header .header
.title Restore terminal tabs on app start .title Word separators
.description Double-click selection will stop at these characters
input.form-control(
type='text',
placeholder=' ()[]{}\'"',
[(ngModel)]='config.store.terminal.wordSeparator',
(ngModelChange)='config.save()',
)
toggle( .form-line
[(ngModel)]='config.store.recoverTabs', .header
(ngModelChange)='config.save()', .title Require a key to click links
) .description When enabled, links are only clickable while holding this key
.form-line select.form-control(
.header [(ngModel)]='config.store.clickableLinks.modifier',
.title Bracketed paste (requires shell support) (ngModelChange)='config.save()',
.description Prevents accidental execution of pasted commands )
toggle( option([value]='null') None
[(ngModel)]='config.store.terminal.bracketedPaste', option(value='ctrlKey') Ctrl
(ngModelChange)='config.save()', option(value='altKey') {{altKeyName}}
) option(value='shiftKey') Shift
option(value='metaKey') {{metaKeyName}}
.form-line div.mt-4
.header h3 Clipboard
.title Copy on select
toggle(
[(ngModel)]='config.store.terminal.copyOnSelect',
(ngModelChange)='config.save()',
)
.form-line .form-line
.header .header
.title Scroll on input .title Copy on select
.description Scrolls the terminal to the bottom on user input toggle(
toggle( [(ngModel)]='config.store.terminal.copyOnSelect',
[(ngModel)]='config.store.terminal.scrollOnInput', (ngModelChange)='config.save()',
(ngModelChange)='config.save()', )
)
.form-line .form-line
.header .header
.title Use Alt key as the Meta key .title Bracketed paste (requires shell support)
.description Lets the shell handle Meta key instead of OS .description Prevents accidental execution of pasted commands
toggle( toggle(
[(ngModel)]='config.store.terminal.altIsMeta', [(ngModel)]='config.store.terminal.bracketedPaste',
(ngModelChange)='config.save()', (ngModelChange)='config.save()',
) )
.form-line .form-line
.header .header
.title Word separators .title Warn on multi-line paste
.description Double-click selection will stop at these characters .description Show a confirmation box when pasting multiple lines
input.form-control( toggle(
type='text', [(ngModel)]='config.store.terminal.warnOnMultilinePaste',
placeholder=' ()[]{}\'"', (ngModelChange)='config.save()',
[(ngModel)]='config.store.terminal.wordSeparator', )
(ngModelChange)='config.save()',
)
.form-line div.mt-4
.header h3 Sound
.title Warn on multi-line paste
.description Show a confirmation box when pasting multiple lines
toggle(
[(ngModel)]='config.store.terminal.warnOnMultilinePaste',
(ngModelChange)='config.save()',
)
.form-line(*ngIf='hostApp.platform === Platform.Windows') .form-line
.header .header
.title Set Tabby as %COMSPEC% .title Terminal bell
.description Allows opening .bat files in tabs, but breaks some shells .btn-group(
toggle( [(ngModel)]='config.store.terminal.bell',
[(ngModel)]='config.store.terminal.setComSpec', (ngModelChange)='config.save()',
(ngModelChange)='config.save()', ngbRadioGroup
) )
label.btn.btn-secondary(ngbButtonLabel)
input(
type='radio',
ngbButton,
[value]='"off"'
)
| Off
label.btn.btn-secondary(ngbButtonLabel)
input(
type='radio',
ngbButton,
[value]='"visual"'
)
| Visual
label.btn.btn-secondary(ngbButtonLabel)
input(
type='radio',
ngbButton,
[value]='"audible"'
)
| Audible
.alert.alert-info.d-flex.align-items-center(*ngIf='config.store.terminal.bell != "audible" && (config.store.terminal.profile || "").startsWith("wsl")')
.mr-auto WSL terminal bell can only be muted via Volume Mixer
button.btn.btn-secondary((click)='openWSLVolumeMixer()') Show Mixer
div.mt-4
h3 Startup
.form-line(*ngIf='hostApp.platform !== Platform.Web')
.header
.title Auto-open a terminal on app start
toggle(
[(ngModel)]='config.store.terminal.autoOpen',
(ngModelChange)='config.save()',
)
.form-line
.header
.title Restore terminal tabs on app start
toggle(
[(ngModel)]='config.store.recoverTabs',
(ngModelChange)='config.save()',
)
div.mt-4(*ngIf='hostApp.platform === Platform.Windows')
h3 Windows
.form-line
.header
.title Set Tabby as %COMSPEC%
.description Allows opening .bat files in tabs, but breaks some shells
toggle(
[(ngModel)]='config.store.terminal.setComSpec',
(ngModelChange)='config.save()',
)

View File

@@ -1,5 +1,5 @@
import { Component, HostBinding } from '@angular/core' import { Component, HostBinding } from '@angular/core'
import { ConfigService, HostAppService, Platform, PlatformService } from 'tabby-core' import { ConfigService, HostAppService, Platform, PlatformService, altKeyName, metaKeyName } from 'tabby-core'
/** @hidden */ /** @hidden */
@Component({ @Component({
@@ -7,6 +7,8 @@ import { ConfigService, HostAppService, Platform, PlatformService } from 'tabby-
}) })
export class TerminalSettingsTabComponent { export class TerminalSettingsTabComponent {
Platform = Platform Platform = Platform
altKeyName = altKeyName
metaKeyName = metaKeyName
@HostBinding('class.content-box') true @HostBinding('class.content-box') true

View File

@@ -1,6 +1,6 @@
{ {
"name": "tabby-web-demo", "name": "tabby-web-demo",
"version": "1.0.162-nightly.0", "version": "1.0.165-nightly.0",
"main": "dist/index.js", "main": "dist/index.js",
"typings": "dist/index.d.ts", "typings": "dist/index.d.ts",
"scripts": { "scripts": {

View File

@@ -1,6 +1,6 @@
{ {
"name": "tabby-web", "name": "tabby-web",
"version": "1.0.162-nightly.0", "version": "1.0.165-nightly.0",
"description": "Web-specific bindings", "description": "Web-specific bindings",
"keywords": [ "keywords": [
"tabby-builtin-plugin" "tabby-builtin-plugin"

View File

@@ -17,5 +17,8 @@
"resolutions": { "resolutions": {
"**/util": "^0.12.0" "**/util": "^0.12.0"
}, },
"version": "1.0.162-nightly.0" "scripts": {
"postinstall": "patch-package"
},
"version": "1.0.165-nightly.0"
} }

View File

@@ -84,7 +84,7 @@ Tabby.registerModule('crypto', {
}, },
}) })
Tabby.registerMock('dns', {}) Tabby.registerMock('dns', {})
Tabby.registerMock('socksv5', {}) Tabby.registerMock('@luminati-io/socksv5', {})
Tabby.registerMock('util', require('util/')) Tabby.registerMock('util', require('util/'))
Tabby.registerMock('keytar', { Tabby.registerMock('keytar', {
getPassword: () => null, getPassword: () => null,

View File

@@ -109,7 +109,7 @@ module.exports = options => {
'os', 'os',
'path', 'path',
'readline', 'readline',
'socksv5', '@luminati-io/socksv5',
'stream', 'stream',
'windows-native-registry', 'windows-native-registry',
'windows-process-tree', 'windows-process-tree',

332
yarn.lock
View File

@@ -172,6 +172,11 @@
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.0.0-beta2.tgz#d66c6e9aad085d003f2cf88244f6adce16e07f78" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.0.0-beta2.tgz#d66c6e9aad085d003f2cf88244f6adce16e07f78"
integrity sha512-od2COSiBZ70dB5YgZuZEJ3Jy3RHFUhKKjN4dBxNVtmC8DYlyuI4q9wUSzmpLWXQVnRTADRoOLywA9E6SRaS6YQ== integrity sha512-od2COSiBZ70dB5YgZuZEJ3Jy3RHFUhKKjN4dBxNVtmC8DYlyuI4q9wUSzmpLWXQVnRTADRoOLywA9E6SRaS6YQ==
"@gar/promisify@^1.0.1":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210"
integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==
"@humanwhocodes/config-array@^0.5.0": "@humanwhocodes/config-array@^0.5.0":
version "0.5.0" version "0.5.0"
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9"
@@ -238,6 +243,14 @@
"@nodelib/fs.scandir" "2.1.5" "@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0" fastq "^1.6.0"
"@npmcli/fs@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.0.0.tgz#589612cfad3a6ea0feafcb901d29c63fd52db09f"
integrity sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==
dependencies:
"@gar/promisify" "^1.0.1"
semver "^7.3.5"
"@npmcli/move-file@^1.0.1": "@npmcli/move-file@^1.0.1":
version "1.1.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674"
@@ -412,10 +425,12 @@
"@types/node" "*" "@types/node" "*"
"@types/responselike" "*" "@types/responselike" "*"
"@types/debug@^4.1.5": "@types/debug@^4.1.6":
version "4.1.5" version "4.1.7"
resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82"
integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==
dependencies:
"@types/ms" "*"
"@types/deep-equal@1.0.1": "@types/deep-equal@1.0.1":
version "1.0.1" version "1.0.1"
@@ -516,6 +531,11 @@
resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256" resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256"
integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==
"@types/ms@*":
version "0.7.31"
resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197"
integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==
"@types/node@*", "@types/node@16.0.1": "@types/node@*", "@types/node@16.0.1":
version "16.0.1" version "16.0.1"
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.0.1.tgz#70cedfda26af7a2ca073fdcc9beb2fff4aa693f8" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.0.1.tgz#70cedfda26af7a2ca073fdcc9beb2fff4aa693f8"
@@ -566,10 +586,10 @@
resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz" resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz"
integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==
"@types/yargs@^16.0.2": "@types/yargs@^17.0.1":
version "16.0.4" version "17.0.7"
resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.7.tgz#44a484c634761da4391477515a98772b82b5060f"
integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== integrity sha512-OvLKmpKdea1aWtqHv9bxVVcMoT6syAeK+198dfETIFkAevYRGwqh4H+KFxfjUETZuUuE5sQCAFwdOdoHUdo8eg==
dependencies: dependencies:
"@types/yargs-parser" "*" "@types/yargs-parser" "*"
@@ -1014,15 +1034,15 @@ ansistyles@~0.1.3:
resolved "https://registry.npmjs.org/ansistyles/-/ansistyles-0.1.3.tgz" resolved "https://registry.npmjs.org/ansistyles/-/ansistyles-0.1.3.tgz"
integrity sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk= integrity sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=
app-builder-bin@3.5.13: app-builder-bin@3.7.1:
version "3.5.13" version "3.7.1"
resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-3.5.13.tgz#6dd7f4de34a4e408806f99b8c7d6ef1601305b7e" resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-3.7.1.tgz#cb0825c5e12efc85b196ac3ed9c89f076c61040e"
integrity sha512-ighVe9G+bT1ENGdp9ecO1P+94vv/f+FUwaI+XkNzeg9bYF8Oi3BQ+mJuxS00UgyHs8luuOzjzC+qnAtdb43Mpg== integrity sha512-ql93vEUq6WsstGXD+SBLSIQw6SNnhbDEM0swzgugytMxLp3rT24Ag/jcC80ZHxiPRTdew1niuR7P3/FCrDqIjw==
app-builder-lib@22.11.7: app-builder-lib@22.14.5:
version "22.11.7" version "22.14.5"
resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-22.11.7.tgz#c0ad1119ebfbf4189a8280ad693625f5e684dca6" resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-22.14.5.tgz#a61a50b132b858e98fdc70b6b88994ae99b4f96d"
integrity sha512-pS9/cR4/TnNZVAHZECiSvvwTBzbwblj7KBBZkMKDG57nibq0I1XY8zAaYeHFdlYTyrRcz9JUXbAqJKezya7UFQ== integrity sha512-k3VwKP4kpsnUaXoUkm1s4zaSHPHIMFnN4kPMU9yXaKmE1LfHHqBaEah5bXeTAX5V/BC41wFdg8CF5vOjvgy8Rg==
dependencies: dependencies:
"7zip-bin" "~5.1.1" "7zip-bin" "~5.1.1"
"@develar/schema-utils" "~2.6.5" "@develar/schema-utils" "~2.6.5"
@@ -1030,12 +1050,14 @@ app-builder-lib@22.11.7:
"@malept/flatpak-bundler" "^0.4.0" "@malept/flatpak-bundler" "^0.4.0"
async-exit-hook "^2.0.1" async-exit-hook "^2.0.1"
bluebird-lst "^1.0.9" bluebird-lst "^1.0.9"
builder-util "22.11.7" builder-util "22.14.5"
builder-util-runtime "8.7.7" builder-util-runtime "8.9.1"
chromium-pickle-js "^0.2.0" chromium-pickle-js "^0.2.0"
debug "^4.3.2" debug "^4.3.2"
ejs "^3.1.6" ejs "^3.1.6"
electron-publish "22.11.7" electron-osx-sign "^0.5.0"
electron-publish "22.14.5"
form-data "^4.0.0"
fs-extra "^10.0.0" fs-extra "^10.0.0"
hosted-git-info "^4.0.2" hosted-git-info "^4.0.2"
is-ci "^3.0.0" is-ci "^3.0.0"
@@ -1432,34 +1454,27 @@ buffer@^5.1.0:
base64-js "^1.3.1" base64-js "^1.3.1"
ieee754 "^1.1.13" ieee754 "^1.1.13"
builder-util-runtime@8.7.6: builder-util-runtime@8.9.1:
version "8.7.6" version "8.9.1"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.6.tgz#4b43c96db2bd494ced7694bcd7674934655e8324" resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.9.1.tgz#25f066b3fbc20b3e6236a9b956b1ebb0e33ff66a"
integrity sha512-rj9AIY7CzLSuTOXpToiaQkruYh6UEQ+kYnd5UET22ch8MGClEtIZKXHG14qEiXEr2x4EOKDMxkcTa+9TYaE+ug== integrity sha512-c8a8J3wK6BIVLW7ls+7TRK9igspTbzWmUqxFbgK0m40Ggm6efUbxtWVCGIjc+dtchyr5qAMAUL6iEGRdS/6vwg==
dependencies: dependencies:
debug "^4.3.2" debug "^4.3.2"
sax "^1.2.4" sax "^1.2.4"
builder-util-runtime@8.7.7: builder-util@22.14.5:
version "8.7.7" version "22.14.5"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.7.tgz#6c83cc3abe7a7a5c8b4ec8878f68adc828c07f0d" resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-22.14.5.tgz#42a18608d2a566c0846e91266464776c8bfb0cc9"
integrity sha512-RUfoXzVrmFFI0K/Oft0CtP1LpTIOlBeLJatt5DePTI0KlxE156am4SGUpqtbbdqZNm++LkV9mX4olBDcXyGPow== integrity sha512-zqIHDFJwmA7jV7SC9aI+33MWwT2mWoijH+Ol9IntNAwuuRXoS+7XeJwnhLBXOhcDBzXT4kDzHnRk4JKeaygEYA==
dependencies:
debug "^4.3.2"
sax "^1.2.4"
builder-util@22.11.7:
version "22.11.7"
resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-22.11.7.tgz#ae9707afa6a31feafa13c274ac83b4fe28ef1467"
integrity sha512-ihqUe5ey82LM9qqQe0/oIcaSm9w+B9UjcsWJZxJliTBsbU+sErOpDFpHW+sim0veiTF/EIcGUh9HoduWw+l9FA==
dependencies: dependencies:
"7zip-bin" "~5.1.1" "7zip-bin" "~5.1.1"
"@types/debug" "^4.1.5" "@types/debug" "^4.1.6"
"@types/fs-extra" "^9.0.11" "@types/fs-extra" "^9.0.11"
app-builder-bin "3.5.13" app-builder-bin "3.7.1"
bluebird-lst "^1.0.9" bluebird-lst "^1.0.9"
builder-util-runtime "8.7.7" builder-util-runtime "8.9.1"
chalk "^4.1.1" chalk "^4.1.1"
cross-spawn "^7.0.3"
debug "^4.3.2" debug "^4.3.2"
fs-extra "^10.0.0" fs-extra "^10.0.0"
is-ci "^3.0.0" is-ci "^3.0.0"
@@ -1478,11 +1493,12 @@ builtins@^1.0.3:
resolved "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz" resolved "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz"
integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og=
cacache@^15.0.5: cacache@^15.2.0:
version "15.2.0" version "15.3.0"
resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.2.0.tgz#73af75f77c58e72d8c630a7a2858cb18ef523389" resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb"
integrity sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw== integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==
dependencies: dependencies:
"@npmcli/fs" "^1.0.0"
"@npmcli/move-file" "^1.0.1" "@npmcli/move-file" "^1.0.1"
chownr "^2.0.0" chownr "^2.0.0"
fs-minipass "^2.0.0" fs-minipass "^2.0.0"
@@ -1662,7 +1678,7 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2:
escape-string-regexp "^1.0.5" escape-string-regexp "^1.0.5"
supports-color "^5.3.0" supports-color "^5.3.0"
chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2:
version "4.1.2" version "4.1.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
@@ -1902,7 +1918,7 @@ columnify@~1.5.4:
strip-ansi "^3.0.0" strip-ansi "^3.0.0"
wcwidth "^1.0.0" wcwidth "^1.0.0"
combined-stream@^1.0.5, combined-stream@^1.0.6, combined-stream@~1.0.5, combined-stream@~1.0.6: combined-stream@^1.0.5, combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.5, combined-stream@~1.0.6:
version "1.0.8" version "1.0.8"
resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
@@ -1936,10 +1952,15 @@ commander@^7.0.0, commander@^7.2.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
compare-versions@^3.6.0: compare-version@^0.1.2:
version "3.6.0" version "0.1.2"
resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080"
integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=
compare-versions@^4:
version "4.1.1"
resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-4.1.1.tgz#d881fc9f47d6eb2b8f63109dc5e82dae39c3680c"
integrity sha512-jHQA7zMUpbO+FhPz/kADChZVSk3edtD7c3WkEAjleBtwgAl0ji6wGrYxryaBhViGgq0A+Pb6JPhjhg9jpth4mQ==
concat-map@0.0.1: concat-map@0.0.1:
version "0.0.1" version "0.0.1"
@@ -2210,7 +2231,7 @@ debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2:
dependencies: dependencies:
ms "2.1.2" ms "2.1.2"
debug@^2.1.3, debug@^2.2.0, debug@^2.6.9: debug@^2.1.3, debug@^2.2.0, debug@^2.6.8, debug@^2.6.9:
version "2.6.9" version "2.6.9"
resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
@@ -2366,14 +2387,14 @@ dir-glob@^3.0.1:
dependencies: dependencies:
path-type "^4.0.0" path-type "^4.0.0"
dmg-builder@22.11.7: dmg-builder@22.14.5:
version "22.11.7" version "22.14.5"
resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-22.11.7.tgz#5956008c18d40ee72c0ea01ffea9590dbf51df89" resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-22.14.5.tgz#137c0b55e639badcc0b119eb060e6fa4ed61d948"
integrity sha512-+I+XfP2DODHB6PwFANgpH/WMzzCA5r5XoMvbFCIYjQjJpXlO0XnqQaamzFl2vh/Wz/Qt0d0lJMgRy8gKR3MGdQ== integrity sha512-1GvFGQE332bvPamcMwZDqWqfWfJTyyDLOsHMcGi0zs+Jh7JOn6/zuBkHJIWHdsj2QJbhzLVyd2/ZqttOKv7I8w==
dependencies: dependencies:
app-builder-lib "22.11.7" app-builder-lib "22.14.5"
builder-util "22.11.7" builder-util "22.14.5"
builder-util-runtime "8.7.6" builder-util-runtime "8.9.1"
fs-extra "^10.0.0" fs-extra "^10.0.0"
iconv-lite "^0.6.2" iconv-lite "^0.6.2"
js-yaml "^4.1.0" js-yaml "^4.1.0"
@@ -2484,17 +2505,17 @@ ejs@^3.1.6:
dependencies: dependencies:
jake "^10.6.1" jake "^10.6.1"
electron-builder@^22.11.7: electron-builder@^22.14.5:
version "22.11.7" version "22.14.5"
resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-22.11.7.tgz#cd97a0d9f6e6d388112e66b4376de431cca4d596" resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-22.14.5.tgz#3a25547bd4fe3728d4704da80956a794c5c31496"
integrity sha512-yQExSLt7Hbz/P8lLkZDdE/OnJJ7NCX+uiQcV+XIH0TeEZcD87ZnSqBBzGUN5akySU4BXXlrVZKeUsXACWrm5Kw== integrity sha512-N73hSbXFz6Mz5Z6h6C5ly6CB+dUN6k1LuCDJjI8VF47bMXv/QE0HE+Kkb0GPKqTqM7Hsk/yIYX+kHCfSkR5FGg==
dependencies: dependencies:
"@types/yargs" "^16.0.2" "@types/yargs" "^17.0.1"
app-builder-lib "22.11.7" app-builder-lib "22.14.5"
builder-util "22.11.7" builder-util "22.14.5"
builder-util-runtime "8.7.7" builder-util-runtime "8.9.1"
chalk "^4.1.1" chalk "^4.1.1"
dmg-builder "22.11.7" dmg-builder "22.14.5"
fs-extra "^10.0.0" fs-extra "^10.0.0"
is-ci "^3.0.0" is-ci "^3.0.0"
lazy-val "^1.0.5" lazy-val "^1.0.5"
@@ -2593,23 +2614,35 @@ electron-notarize@^1.1.1:
debug "^4.1.1" debug "^4.1.1"
fs-extra "^9.0.1" fs-extra "^9.0.1"
electron-publish@22.11.7: electron-osx-sign@^0.5.0:
version "22.11.7" version "0.5.0"
resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-22.11.7.tgz#4126cbb08ccf082a2aa7fef89ee629b3a4b8ae9a" resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz#fc258c5e896859904bbe3d01da06902c04b51c3a"
integrity sha512-A4EhRRNBVz4SPzUlBrPO6BmuyDeI0pyprggPAV9rQ+SDVSnSB/WKPot9JwWMyArkGj3AUUTMNVT6hwZhMvhfqw== integrity sha512-icoRLHzFz/qxzDh/N4Pi2z4yVHurlsCAYQvsCSG7fCedJ4UJXBS6PoQyGH71IfcqKupcKeK7HX/NkyfG+v6vlQ==
dependencies:
bluebird "^3.5.0"
compare-version "^0.1.2"
debug "^2.6.8"
isbinaryfile "^3.0.2"
minimist "^1.2.0"
plist "^3.0.1"
electron-publish@22.14.5:
version "22.14.5"
resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-22.14.5.tgz#34bcdce671f0e651330db20040d6919c77c94bd6"
integrity sha512-h+NANRdaA0PqGF15GKvorseWPzh1PXa/zx4I37//PIokW8eKIov8ky23foUSb55ZFWUHGpxQJux7y2NCfBtQeg==
dependencies: dependencies:
"@types/fs-extra" "^9.0.11" "@types/fs-extra" "^9.0.11"
builder-util "22.11.7" builder-util "22.14.5"
builder-util-runtime "8.7.7" builder-util-runtime "8.9.1"
chalk "^4.1.1" chalk "^4.1.1"
fs-extra "^10.0.0" fs-extra "^10.0.0"
lazy-val "^1.0.5" lazy-val "^1.0.5"
mime "^2.5.2" mime "^2.5.2"
electron-rebuild@^3.2.3: electron-rebuild@^3.2.5:
version "3.2.3" version "3.2.5"
resolved "https://registry.yarnpkg.com/electron-rebuild/-/electron-rebuild-3.2.3.tgz#2c0b06b7b1a5240fec96f1d368d04222e2590c3d" resolved "https://registry.yarnpkg.com/electron-rebuild/-/electron-rebuild-3.2.5.tgz#a9e82b4259aac33ad449f6959de68ded2c5679f8"
integrity sha512-9oxNmKlDCaf651c+yJWCDIBpF6A9aY+wQtasLEeR5AsPYPuOKEX6xHnC2+WgCLOC94JEpCZznecyC84fbwZq4A== integrity sha512-U9dKi10V9w/BdIVB8a8dTKYLK3Q1d2WZ+Yo5qfM3XX/O4jI7KpnwgvWgGoVv0jTWPC2NlebF00ffWS/8NfUAtA==
dependencies: dependencies:
"@malept/cross-spawn-promise" "^2.0.0" "@malept/cross-spawn-promise" "^2.0.0"
colors "^1.3.3" colors "^1.3.3"
@@ -2618,10 +2651,11 @@ electron-rebuild@^3.2.3:
fs-extra "^10.0.0" fs-extra "^10.0.0"
got "^11.7.0" got "^11.7.0"
lzma-native "^8.0.1" lzma-native "^8.0.1"
node-abi "^2.19.2" node-abi "^3.0.0"
node-api-version "^0.1.4" node-api-version "^0.1.4"
node-gyp "^8.1.0" node-gyp "^8.4.0"
ora "^5.1.0" ora "^5.1.0"
semver "^7.3.5"
tar "^6.0.5" tar "^6.0.5"
yargs "^17.0.1" yargs "^17.0.1"
@@ -3190,6 +3224,15 @@ forever-agent@~0.6.1:
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
form-data@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
mime-types "^2.1.12"
form-data@~2.1.1: form-data@~2.1.1:
version "2.1.4" version "2.1.4"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
@@ -4355,6 +4398,13 @@ isarray@~1.0.0:
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
isbinaryfile@^3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80"
integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==
dependencies:
buffer-alloc "^1.2.0"
isbinaryfile@^4.0.8: isbinaryfile@^4.0.8:
version "4.0.8" version "4.0.8"
resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf"
@@ -4658,12 +4708,7 @@ lazy-property@~1.0.0:
resolved "https://registry.npmjs.org/lazy-property/-/lazy-property-1.0.0.tgz" resolved "https://registry.npmjs.org/lazy-property/-/lazy-property-1.0.0.tgz"
integrity sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc= integrity sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc=
lazy-val@^1.0.4: lazy-val@^1.0.4, lazy-val@^1.0.5:
version "1.0.4"
resolved "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz"
integrity sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==
lazy-val@^1.0.5:
version "1.0.5" version "1.0.5"
resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d"
integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==
@@ -4949,13 +4994,13 @@ make-fetch-happen@^2.4.13:
socks-proxy-agent "^3.0.0" socks-proxy-agent "^3.0.0"
ssri "^4.1.6" ssri "^4.1.6"
make-fetch-happen@^8.0.14: make-fetch-happen@^9.1.0:
version "8.0.14" version "9.1.0"
resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz#aaba73ae0ab5586ad8eaa68bd83332669393e222" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968"
integrity sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ== integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==
dependencies: dependencies:
agentkeepalive "^4.1.3" agentkeepalive "^4.1.3"
cacache "^15.0.5" cacache "^15.2.0"
http-cache-semantics "^4.1.0" http-cache-semantics "^4.1.0"
http-proxy-agent "^4.0.1" http-proxy-agent "^4.0.1"
https-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0"
@@ -4966,8 +5011,9 @@ make-fetch-happen@^8.0.14:
minipass-fetch "^1.3.2" minipass-fetch "^1.3.2"
minipass-flush "^1.0.5" minipass-flush "^1.0.5"
minipass-pipeline "^1.2.4" minipass-pipeline "^1.2.4"
negotiator "^0.6.2"
promise-retry "^2.0.1" promise-retry "^2.0.1"
socks-proxy-agent "^5.0.0" socks-proxy-agent "^6.0.0"
ssri "^8.0.0" ssri "^8.0.0"
map-age-cleaner@^0.1.1: map-age-cleaner@^0.1.1:
@@ -5237,12 +5283,7 @@ mute-stream@~0.0.4:
resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz" resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz"
integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
nan@^2.13.2, nan@^2.14.1: nan@^2.13.2, nan@^2.14.1, nan@^2.15.0:
version "2.14.2"
resolved "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz"
integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==
nan@^2.15.0:
version "2.15.0" version "2.15.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee"
integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==
@@ -5257,6 +5298,11 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
negotiator@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
neo-async@^2.6.2: neo-async@^2.6.2:
version "2.6.2" version "2.6.2"
resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz"
@@ -5289,7 +5335,7 @@ no-case@^3.0.4:
lower-case "^2.0.2" lower-case "^2.0.2"
tslib "^2.0.3" tslib "^2.0.3"
node-abi@^2.19.2, node-abi@^2.30.0: node-abi@^2.30.0, node-abi@^3.0.0:
version "2.30.0" version "2.30.0"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.0.tgz#8be53bf3e7945a34eea10e0fc9a5982776cf550b" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.0.tgz#8be53bf3e7945a34eea10e0fc9a5982776cf550b"
integrity sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg== integrity sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==
@@ -5355,20 +5401,20 @@ node-gyp@^7.1.0:
tar "^6.0.2" tar "^6.0.2"
which "^2.0.2" which "^2.0.2"
node-gyp@^8.1.0: node-gyp@^8.4.0:
version "8.1.0" version "8.4.0"
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.1.0.tgz#81f43283e922d285c886fb0e0f520a7fd431d8c2" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.0.tgz#6e1112b10617f0f8559c64b3f737e8109e5a8338"
integrity sha512-o2elh1qt7YUp3lkMwY3/l4KF3j/A3fI/Qt4NH+CQQgPJdqGE9y7qnP84cjIWN27Q0jJkrSAhCVDg+wBVNBYdBg== integrity sha512-Bi/oCm5bH6F+FmzfUxJpPaxMEyIhszULGR3TprmTeku8/dMFcdTcypk120NeZqEt54r1BrgEKtm2jJiuIKE28Q==
dependencies: dependencies:
env-paths "^2.2.0" env-paths "^2.2.0"
glob "^7.1.4" glob "^7.1.4"
graceful-fs "^4.2.6" graceful-fs "^4.2.6"
make-fetch-happen "^8.0.14" make-fetch-happen "^9.1.0"
nopt "^5.0.0" nopt "^5.0.0"
npmlog "^4.1.2" npmlog "^4.1.2"
rimraf "^3.0.2" rimraf "^3.0.2"
semver "^7.3.5" semver "^7.3.5"
tar "^6.1.0" tar "^6.1.2"
which "^2.0.2" which "^2.0.2"
node-gyp@~3.6.2: node-gyp@~3.6.2:
@@ -5395,13 +5441,13 @@ node-releases@^1.1.71:
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe"
integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==
node-sass@^6.0.1: node-sass@^7.0.0:
version "6.0.1" version "7.0.0"
resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-6.0.1.tgz#cad1ccd0ce63e35c7181f545d8b986f3a9a887fe" resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-7.0.0.tgz#33ee7c2df299d51f682f13d79f3d2a562225788e"
integrity sha512-f+Rbqt92Ful9gX0cGtdYwjTrWAaGURgaK5rZCWOgCNyGWusFYHhbqCCBoFBeat+HKETOU02AyTxNhJV0YZf2jQ== integrity sha512-6yUnsD3L8fVbgMX6nKQqZkjRcG7a/PpmF0pEyeWf+BgbTj2ToJlCYrnUifL2KbjV5gIY22I3oppahBWA3B+jUg==
dependencies: dependencies:
async-foreach "^0.1.3" async-foreach "^0.1.3"
chalk "^1.1.1" chalk "^4.1.2"
cross-spawn "^7.0.3" cross-spawn "^7.0.3"
gaze "^1.0.0" gaze "^1.0.0"
get-stdin "^4.0.1" get-stdin "^4.0.1"
@@ -5410,7 +5456,7 @@ node-sass@^6.0.1:
meow "^9.0.0" meow "^9.0.0"
nan "^2.13.2" nan "^2.13.2"
node-gyp "^7.1.0" node-gyp "^7.1.0"
npmlog "^4.0.0" npmlog "^5.0.0"
request "^2.88.0" request "^2.88.0"
sass-graph "2.2.5" sass-graph "2.2.5"
stdout-stream "^1.4.0" stdout-stream "^1.4.0"
@@ -5657,7 +5703,7 @@ npm@5.1.0:
wrappy "~1.0.2" wrappy "~1.0.2"
write-file-atomic "~2.1.0" write-file-atomic "~2.1.0"
"npmlog@0 || 1 || 2 || 3 || 4", "npmlog@2 || ^3.1.0 || ^4.0.0", npmlog@^4.0.0, npmlog@^4.1.2, npmlog@~4.1.2: "npmlog@0 || 1 || 2 || 3 || 4", "npmlog@2 || ^3.1.0 || ^4.0.0", npmlog@^4.1.2, npmlog@~4.1.2:
version "4.1.2" version "4.1.2"
resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz"
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
@@ -5667,7 +5713,7 @@ npm@5.1.0:
gauge "~2.7.3" gauge "~2.7.3"
set-blocking "~2.0.0" set-blocking "~2.0.0"
npmlog@5.0.1: npmlog@5.0.1, npmlog@^5.0.0:
version "5.0.1" version "5.0.1"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0"
integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==
@@ -7278,10 +7324,10 @@ shebang-regex@^3.0.0:
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
shell-quote@^1.7.2: shell-quote@^1.7.3:
version "1.7.2" version "1.7.3"
resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123"
integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==
shelljs@0.8.4: shelljs@0.8.4:
version "0.8.4" version "0.8.4"
@@ -7402,14 +7448,14 @@ socks-proxy-agent@^3.0.0:
agent-base "^4.0.1" agent-base "^4.0.1"
socks "^1.1.10" socks "^1.1.10"
socks-proxy-agent@^5.0.0: socks-proxy-agent@^6.0.0:
version "5.0.1" version "6.1.0"
resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.0.tgz#869cf2d7bd10fea96c7ad3111e81726855e285c3"
integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== integrity sha512-57e7lwCN4Tzt3mXz25VxOErJKXlPfXmkMLnk310v/jwW20jWRVcgsOit+xNkN3eIEdB47GwnfAEBLacZ/wVIKg==
dependencies: dependencies:
agent-base "^6.0.2" agent-base "^6.0.2"
debug "4" debug "^4.3.1"
socks "^2.3.3" socks "^2.6.1"
socks@^1.1.10: socks@^1.1.10:
version "1.1.10" version "1.1.10"
@@ -7419,7 +7465,7 @@ socks@^1.1.10:
ip "^1.1.4" ip "^1.1.4"
smart-buffer "^1.0.13" smart-buffer "^1.0.13"
socks@^2.3.3: socks@^2.6.1:
version "2.6.1" version "2.6.1"
resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e"
integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA== integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==
@@ -7869,10 +7915,10 @@ tar@^2.0.0, tar@~2.2.1:
fstream "^1.0.12" fstream "^1.0.12"
inherits "2" inherits "2"
tar@^6.0.2, tar@^6.0.5, tar@^6.1.0: tar@^6.0.2, tar@^6.0.5, tar@^6.1.2:
version "6.1.7" version "6.1.11"
resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.7.tgz#c566d1107d38b09e92983a68db5534fc7f6cab42" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
integrity sha512-PBoRkOJU0X3lejJ8GaRCsobjXTgFofRDSPdSUhRSdlwJfifRlQBwGXitDItdGFu0/h0XDMCkig0RN1iT7DBxhA== integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==
dependencies: dependencies:
chownr "^2.0.0" chownr "^2.0.0"
fs-minipass "^2.0.0" fs-minipass "^2.0.0"
@@ -8185,10 +8231,10 @@ typedarray@^0.0.6:
resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
typedoc@^0.22.7: typedoc@^0.22.10:
version "0.22.7" version "0.22.10"
resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.7.tgz#e5e095ab14676296f4b12ac3355321eae650e447" resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.10.tgz#221e1a2b17bcb71817ef027dc4c4969d572e7620"
integrity sha512-ndxxp+tU1Wczvdxp4u2/PvT1qjD6hdFdSdehpORHjE+JXmMkl2bftXCR0upHmsnesBG7VCcr8vfgloGHIH8glQ== integrity sha512-hQYZ4WtoMZ61wDC6w10kxA42+jclWngdmztNZsDvIz7BMJg7F2xnT+uYsUa7OluyKossdFj9E9Ye4QOZKTy8SA==
dependencies: dependencies:
glob "^7.2.0" glob "^7.2.0"
lunr "^2.3.9" lunr "^2.3.9"
@@ -8443,10 +8489,10 @@ vscode-textmate@5.2.0:
resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e"
integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==
watchpack@^2.2.0: watchpack@^2.3.0:
version "2.2.0" version "2.3.0"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.2.0.tgz#47d78f5415fe550ecd740f99fe2882323a58b1ce" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.0.tgz#a41bca3da6afaff31e92a433f4c856a0c25ea0c4"
integrity sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA== integrity sha512-MnN0Q1OsvB/GGHETrFeZPQaOelWh/7O+EiFlj8sM9GPjtQkis7k01aAxrg/18kTfoIVcLL+haEVFlXDaSRwKRw==
dependencies: dependencies:
glob-to-regexp "^0.4.1" glob-to-regexp "^0.4.1"
graceful-fs "^4.1.2" graceful-fs "^4.1.2"
@@ -8499,15 +8545,15 @@ webpack-merge@^5.7.3:
clone-deep "^4.0.1" clone-deep "^4.0.1"
wildcard "^2.0.0" wildcard "^2.0.0"
webpack-sources@^3.2.0: webpack-sources@^3.2.2:
version "3.2.0" version "3.2.2"
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.0.tgz#b16973bcf844ebcdb3afde32eda1c04d0b90f89d" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.2.tgz#d88e3741833efec57c4c789b6010db9977545260"
integrity sha512-fahN08Et7P9trej8xz/Z7eRu8ltyiygEo/hnRi9KqBUs80KeDcnf96ZJo++ewWd84fEf3xSX9bp4ZS9hbw0OBw== integrity sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==
webpack@^5.61.0: webpack@^5.64.4:
version "5.61.0" version "5.64.4"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.61.0.tgz#fa827f0ee9bdfd141dd73c3e891e955ebd52fe7f" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.64.4.tgz#e1454b6a13009f57cc2c78e08416cd674622937b"
integrity sha512-fPdTuaYZ/GMGFm4WrPi2KRCqS1vDp773kj9S0iI5Uc//5cszsFEDgHNaX4Rj1vobUiU1dFIV3mA9k1eHeluFpw== integrity sha512-LWhqfKjCLoYJLKJY8wk2C3h77i8VyHowG3qYNZiIqD6D0ZS40439S/KVuc/PY48jp2yQmy0mhMknq8cys4jFMw==
dependencies: dependencies:
"@types/eslint-scope" "^3.7.0" "@types/eslint-scope" "^3.7.0"
"@types/estree" "^0.0.50" "@types/estree" "^0.0.50"
@@ -8531,8 +8577,8 @@ webpack@^5.61.0:
schema-utils "^3.1.0" schema-utils "^3.1.0"
tapable "^2.1.1" tapable "^2.1.1"
terser-webpack-plugin "^5.1.3" terser-webpack-plugin "^5.1.3"
watchpack "^2.2.0" watchpack "^2.3.0"
webpack-sources "^3.2.0" webpack-sources "^3.2.2"
which-boxed-primitive@^1.0.1, which-boxed-primitive@^1.0.2: which-boxed-primitive@^1.0.1, which-boxed-primitive@^1.0.2:
version "1.0.2" version "1.0.2"