Compare commits
244 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
0c601592e3 | ||
![]() |
d644c299ae | ||
![]() |
6119c2b73d | ||
![]() |
ccf4f05437 | ||
![]() |
5110808069 | ||
![]() |
ba61a7f359 | ||
![]() |
f2aef8d6d5 | ||
![]() |
8587cd31dd | ||
![]() |
8a8e7cd99f | ||
![]() |
ddb01b3722 | ||
![]() |
66bb03a463 | ||
![]() |
5f88a02647 | ||
![]() |
538df37f5e | ||
![]() |
aba5e9dcfa | ||
![]() |
c7589acc87 | ||
![]() |
39786e023e | ||
![]() |
7900134f67 | ||
![]() |
d080adc19d | ||
![]() |
4f189f6839 | ||
![]() |
87ed979588 | ||
![]() |
e90db7f07f | ||
![]() |
5249a9076a | ||
![]() |
cfc9333c02 | ||
![]() |
81aa747d83 | ||
![]() |
0e9723cb3b | ||
![]() |
899484a5d9 | ||
![]() |
4c2feb1b35 | ||
![]() |
d6d75b8c53 | ||
![]() |
6eff3902ca | ||
![]() |
8f71f29007 | ||
![]() |
b6fd909d67 | ||
![]() |
9500fa8770 | ||
![]() |
f92d9c85cb | ||
![]() |
04533a683b | ||
![]() |
08a38bbf61 | ||
![]() |
5f94e84542 | ||
![]() |
bdcd2720c4 | ||
![]() |
4784a076fa | ||
![]() |
07c522385f | ||
![]() |
d039d76cff | ||
![]() |
f91754ce7c | ||
![]() |
5911794b20 | ||
![]() |
f640bf9443 | ||
![]() |
9f50d8506c | ||
![]() |
361f6c2fe5 | ||
![]() |
8cac38e1ef | ||
![]() |
75757d027e | ||
![]() |
0c8b6e56da | ||
![]() |
5be4a12ee5 | ||
![]() |
433c7d33d9 | ||
![]() |
b755346ac0 | ||
![]() |
4c663e4a20 | ||
![]() |
a34e4c236d | ||
![]() |
b2b91f0cfd | ||
![]() |
bbb02f4e64 | ||
![]() |
3eaf46e09d | ||
![]() |
fc02d27056 | ||
![]() |
0fe7d81a5f | ||
![]() |
59dbe6ba83 | ||
![]() |
860a577ddb | ||
![]() |
2edb9cc5b8 | ||
![]() |
5bc13965e1 | ||
![]() |
2ca93fdb98 | ||
![]() |
aa62ca9a6e | ||
![]() |
1928cda394 | ||
![]() |
64f8e033c4 | ||
![]() |
23280c2143 | ||
![]() |
d2ec08e3f8 | ||
![]() |
b186f986ac | ||
![]() |
dbf91228fe | ||
![]() |
b58198b82b | ||
![]() |
eca92760f3 | ||
![]() |
d4815ca827 | ||
![]() |
4c19122acb | ||
![]() |
6bdbca4e19 | ||
![]() |
bb47a5d76f | ||
![]() |
f308fd481d | ||
![]() |
34adf767eb | ||
![]() |
2c6a26b01a | ||
![]() |
e596553dbf | ||
![]() |
990b1b8623 | ||
![]() |
9856249c88 | ||
![]() |
7818f0642f | ||
![]() |
bcea319eb8 | ||
![]() |
246ae9fe77 | ||
![]() |
b4a678640e | ||
![]() |
8692c17ea4 | ||
![]() |
59ee098fde | ||
![]() |
cd09043558 | ||
![]() |
be8f8eec70 | ||
![]() |
85fb2c5725 | ||
![]() |
2baede4675 | ||
![]() |
176992a629 | ||
![]() |
905e7ffc43 | ||
![]() |
8ff130ebfd | ||
![]() |
064bcb31d8 | ||
![]() |
25e4e5e8b4 | ||
![]() |
e3018086fb | ||
![]() |
f3908da0a6 | ||
![]() |
2e57ffb169 | ||
![]() |
bda8199e5d | ||
![]() |
a6cbb64f59 | ||
![]() |
8b1efaeb53 | ||
![]() |
fa767adf52 | ||
![]() |
096a6128c9 | ||
![]() |
a5fa022792 | ||
![]() |
2922df08f4 | ||
![]() |
700aae3ab0 | ||
![]() |
cad6b4d1ee | ||
![]() |
2b57061949 | ||
![]() |
ca5b0a95d9 | ||
![]() |
0e3b486e22 | ||
![]() |
f3e5ad4a2a | ||
![]() |
ad2ab61927 | ||
![]() |
e2464cf3b1 | ||
![]() |
4c2959b4c4 | ||
![]() |
4718e9ff22 | ||
![]() |
8899e57f81 | ||
![]() |
14098177e4 | ||
![]() |
3c68e2bd29 | ||
![]() |
bebec4f638 | ||
![]() |
f16f00cc7e | ||
![]() |
b01b25b084 | ||
![]() |
39389f77d0 | ||
![]() |
a1dbcdbae3 | ||
![]() |
92f5b5a4ae | ||
![]() |
f379159a70 | ||
![]() |
ec850344fc | ||
![]() |
8a0a9700aa | ||
![]() |
7cd51d5611 | ||
![]() |
eda7b42edb | ||
![]() |
981ab25a91 | ||
![]() |
f0dded8eb5 | ||
![]() |
1f0e7e44cc | ||
![]() |
95c31d99c0 | ||
![]() |
e3db0dfbab | ||
![]() |
559ebf0852 | ||
![]() |
0e8abae46f | ||
![]() |
bfe034d77f | ||
![]() |
50a1656f61 | ||
![]() |
f70780f618 | ||
![]() |
712bd0cd04 | ||
![]() |
123d544cd1 | ||
![]() |
414966732c | ||
![]() |
58de0773f4 | ||
![]() |
22505195ec | ||
![]() |
ea2c9b3d9f | ||
![]() |
f39405640f | ||
![]() |
436b366743 | ||
![]() |
c3719f896d | ||
![]() |
654e5f4453 | ||
![]() |
fa54deb091 | ||
![]() |
346dbdf7bb | ||
![]() |
f246eb7736 | ||
![]() |
f7454c8064 | ||
![]() |
271f8d155c | ||
![]() |
6b93c2609e | ||
![]() |
2c342a7d44 | ||
![]() |
5b18f88b90 | ||
![]() |
d0ae5e42f4 | ||
![]() |
59d642434a | ||
![]() |
f2d6931f1a | ||
![]() |
2fb73b0951 | ||
![]() |
f3312852a9 | ||
![]() |
781a4a76c0 | ||
![]() |
475ff14f78 | ||
![]() |
b6698138b6 | ||
![]() |
6251d7737c | ||
![]() |
06e700c6a2 | ||
![]() |
ff65e2abb4 | ||
![]() |
a16c397843 | ||
![]() |
da2ba0ec49 | ||
![]() |
9d8e19622f | ||
![]() |
f820a2a631 | ||
![]() |
da089fc46a | ||
![]() |
937243a9d9 | ||
![]() |
a2de29e5ac | ||
![]() |
25cdf6d6bf | ||
![]() |
b5cf66c232 | ||
![]() |
7be3904123 | ||
![]() |
3109ea0220 | ||
![]() |
63297cb6a6 | ||
![]() |
ed480a2954 | ||
![]() |
3da6f6ffa6 | ||
![]() |
881d5d599d | ||
![]() |
b0b4614610 | ||
![]() |
f0e96b5f8b | ||
![]() |
6fed2cb9c0 | ||
![]() |
8e2ffa1654 | ||
![]() |
c25d4bd768 | ||
![]() |
9f8f2966d9 | ||
![]() |
5c976948dd | ||
![]() |
ff4b137088 | ||
![]() |
e3214e38d3 | ||
![]() |
4b1553abc7 | ||
![]() |
2fc457dd78 | ||
![]() |
3621ea934c | ||
![]() |
b275dac08a | ||
![]() |
47e1bfc810 | ||
![]() |
37e9ba48b1 | ||
![]() |
a54d537536 | ||
![]() |
0c2b221c06 | ||
![]() |
e3375741af | ||
![]() |
d82a88bcc6 | ||
![]() |
f7cab00e4d | ||
![]() |
7f733b8029 | ||
![]() |
d6291c8af4 | ||
![]() |
563852c024 | ||
![]() |
1941d9b748 | ||
![]() |
3473be99bf | ||
![]() |
10cb6a81c7 | ||
![]() |
cb65906290 | ||
![]() |
7a83d85884 | ||
![]() |
35f0d6908a | ||
![]() |
2c2d100c27 | ||
![]() |
ab623a7a91 | ||
![]() |
e2e606602b | ||
![]() |
cd3149b601 | ||
![]() |
50748db958 | ||
![]() |
8049dc7332 | ||
![]() |
f468796877 | ||
![]() |
c093780230 | ||
![]() |
c67e44cc9d | ||
![]() |
db45d0c87a | ||
![]() |
4107a01a01 | ||
![]() |
5e378844a1 | ||
![]() |
623496ff52 | ||
![]() |
5082814023 | ||
![]() |
9836b7aefb | ||
![]() |
cb9681ef41 | ||
![]() |
7527b8ac2d | ||
![]() |
da081ba706 | ||
![]() |
e6063da813 | ||
![]() |
e6b4cb94bd | ||
![]() |
56b843c007 | ||
![]() |
a26b30f0bc | ||
![]() |
4a1d8cdd0d | ||
![]() |
7a0920b87c | ||
![]() |
26199ebb76 | ||
![]() |
e3e01558b2 | ||
![]() |
1852486818 | ||
![]() |
d7ea394a15 | ||
![]() |
c4a1d8aa56 | ||
![]() |
31b203f81a |
@@ -451,6 +451,51 @@
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Me1onRind",
|
||||
"name": "zZ",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/19531270?v=4",
|
||||
"profile": "https://github.com/Me1onRind",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "tainoNZ",
|
||||
"name": "Aaron Davison",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/49261322?v=4",
|
||||
"profile": "https://github.com/tainoNZ",
|
||||
"contributions": [
|
||||
"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,
|
||||
|
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
23
.github/ISSUE_TEMPLATE/issue-report.md
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
---
|
||||
name: Issue report
|
||||
about: Report a problem
|
||||
title: ''
|
||||
labels: 'T: Bug'
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!--
|
||||
Before submitting an issue, make sure that:
|
||||
* You're running the latest Tabby version: https://github.com/Eugeny/tabby/releases
|
||||
* You've searched the existing issues: https://github.com/Eugeny/tabby/issues
|
||||
* Your problem is not caused by third-party plugins (disable _third-party_ plugins, restart and try to reproduce the problem).
|
||||
|
||||
*Reports are accepted in English ONLY.*
|
||||
-->
|
||||
|
||||
**Describe the problem**:
|
||||
[A clear and concise description of what the bug is.]
|
||||
|
||||
**To Reproduce**:
|
||||
[Steps to reproduce the behavior]
|
30
.github/workflows/build.yml
vendored
@@ -11,9 +11,9 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Installing Node
|
||||
uses: actions/setup-node@v2.4.0
|
||||
uses: actions/setup-node@v2.5.0
|
||||
with:
|
||||
node-version: 14
|
||||
node-version: 16
|
||||
|
||||
- name: Install deps
|
||||
run: |
|
||||
@@ -46,9 +46,9 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Installing Node
|
||||
uses: actions/setup-node@v2.4.0
|
||||
uses: actions/setup-node@v2.5.0
|
||||
with:
|
||||
node-version: 14
|
||||
node-version: 16
|
||||
|
||||
- name: Install deps
|
||||
run: |
|
||||
@@ -129,7 +129,7 @@ jobs:
|
||||
path: artifact-zip
|
||||
|
||||
Linux-Build:
|
||||
runs-on: ubuntu-18.04
|
||||
runs-on: ubuntu-18.04 # build against an older glibc for compatibility
|
||||
needs: Lint
|
||||
|
||||
steps:
|
||||
@@ -139,21 +139,20 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Install Node
|
||||
uses: actions/setup-node@v2.4.0
|
||||
uses: actions/setup-node@v2.5.0
|
||||
with:
|
||||
node-version: 14
|
||||
node-version: 16
|
||||
|
||||
- name: Install deps
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install bsdtar zsh
|
||||
sudo apt-get install libarchive-tools zsh
|
||||
npm i -g yarn@1.19.1
|
||||
cd app
|
||||
yarn
|
||||
cd ..
|
||||
rm app/node_modules/.yarn-integrity
|
||||
yarn
|
||||
npm run patch
|
||||
|
||||
- name: Build native deps
|
||||
run: scripts/build-native.js
|
||||
@@ -244,7 +243,7 @@ jobs:
|
||||
path: artifact-web
|
||||
|
||||
Windows-Build:
|
||||
runs-on: windows-2016
|
||||
runs-on: windows-2022
|
||||
needs: Lint
|
||||
|
||||
steps:
|
||||
@@ -254,9 +253,14 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Installing Node
|
||||
uses: actions/setup-node@v2.4.0
|
||||
uses: actions/setup-node@v2.5.0
|
||||
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
|
||||
shell: powershell
|
||||
@@ -274,7 +278,7 @@ jobs:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }}
|
||||
WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}
|
||||
# DEBUG: electron-builder,electron-builder:*
|
||||
DEBUG: electron-builder,electron-builder:*
|
||||
|
||||
- name: Build packages without signing
|
||||
run: node scripts/build-windows.js
|
||||
|
70
.github/workflows/codeql-analysis.yml
vendored
Normal file
@@ -0,0 +1,70 @@
|
||||
# For most projects, this workflow file will not need changing; you simply need
|
||||
# to commit it to your repository.
|
||||
#
|
||||
# You may wish to alter this file to override the set of languages analyzed,
|
||||
# or to provide custom queries or build logic.
|
||||
#
|
||||
# ******** NOTE ********
|
||||
# We have attempted to detect the languages in your repository. Please check
|
||||
# the `language` matrix defined below to confirm you have the correct set of
|
||||
# supported CodeQL languages.
|
||||
#
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [ master ]
|
||||
schedule:
|
||||
- cron: '26 7 * * 4'
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'javascript' ]
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
||||
# Learn more about CodeQL language support at https://git.io/codeql-language-support
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
#- run: |
|
||||
# make bootstrap
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
14
.github/workflows/docs.yml
vendored
@@ -2,7 +2,7 @@ name: Docs
|
||||
on: push
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-18.04
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.actor != 'dependabot[bot]' }}
|
||||
|
||||
steps:
|
||||
@@ -12,14 +12,12 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Installing Node
|
||||
uses: actions/setup-node@v2.4.0
|
||||
uses: actions/setup-node@v2.5.0
|
||||
with:
|
||||
node-version: 14
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
eval $(ssh-agent -s)
|
||||
ssh-add <(echo "$DOCS_PRIVATE_KEY")
|
||||
yarn cache clean
|
||||
cd app
|
||||
yarn
|
||||
@@ -28,7 +26,13 @@ jobs:
|
||||
yarn
|
||||
yarn run build:typings
|
||||
yarn run docs
|
||||
rsync -e "ssh -o StrictHostKeyChecking=no" -arv docs/api/ root@ajenti.org:/srv/terminus-docs/
|
||||
|
||||
env:
|
||||
DOCS_PRIVATE_KEY: ${{ secrets.DOCS_PRIVATE_KEY }}
|
||||
|
||||
- uses: FirebaseExtended/action-hosting-deploy@v0
|
||||
with:
|
||||
repoToken: '${{ secrets.GITHUB_TOKEN }}'
|
||||
firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_TABBY_DOCS }}'
|
||||
channelId: live
|
||||
projectId: tabby-docs
|
||||
|
@@ -38,14 +38,14 @@
|
||||
|
||||
# 목차 <!-- omit in toc -->
|
||||
|
||||
- [Tabby는 무엇인가](#about)
|
||||
- [터미널 기능](#terminal)
|
||||
- [SSH 클라이언트](#ssh)
|
||||
- [시리얼 터미널](#serial)
|
||||
- [포터블](#portable)
|
||||
- [플러그인](#plugins)
|
||||
- [테마](#themes)
|
||||
- [기여](#contributing)
|
||||
- [Tabby는 무엇인가](#tabby는-무엇인가)
|
||||
- [터미널 기능](#터미널-기능)
|
||||
- [SSH 클라이언트](#ssh-클라이언트)
|
||||
- [시리얼 터미널](#시리얼-터미널)
|
||||
- [포터블](#포터블)
|
||||
- [플러그인](#플러그인)
|
||||
- [테마](#테마)
|
||||
- [기여](#기여)
|
||||
|
||||
<a name="about"></a>
|
||||
|
||||
@@ -109,6 +109,8 @@
|
||||
* [save-output](https://github.com/Eugeny/tabby-save-output) - 터미널 출력을 파일에 기록
|
||||
* [sync-config](https://github.com/starxg/terminus-sync-config) - 구성을 Gist 또는 Gitee에 동기화
|
||||
* [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>
|
||||
# 테마
|
||||
@@ -130,7 +132,7 @@
|
||||
|
||||
Pull requests and plugins are welcome!
|
||||
|
||||
프로젝트 배치 방법에 대한 자세한 내용과 매우 간단한 플러그인 개발 튜토리얼은 [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) 및 [API docs](http://ajenti.org/terminus-docs/)를 참조하십시오.
|
||||
프로젝트 배치 방법에 대한 자세한 내용과 매우 간단한 플러그인 개발 튜토리얼은 [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) 및 [API docs](https://docs.tabby.sh/)를 참조하십시오.
|
||||
|
||||
---
|
||||
<a name="contributors"></a>
|
||||
|
14
README.md
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
<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> <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> <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> <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> <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://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 align="center">
|
||||
@@ -40,6 +40,7 @@ This README is also available in: <a href="./README.ko-KR.md">Korean</a>
|
||||
* Doesn't choke on fast-flowing outputs
|
||||
* Proper shell experience on Windows including tab completion (via Clink)
|
||||
* Integrated encrypted container for SSH secrets and configuration
|
||||
* SSH, SFTP and Telnet client available as a [web app](https://tabby.sh/app) (also [self-hosted](https://github.com/Eugeny/tabby-web)).
|
||||
|
||||
# Contents <!-- omit in toc -->
|
||||
|
||||
@@ -114,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
|
||||
* [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
|
||||
* [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>
|
||||
# Themes
|
||||
@@ -135,7 +138,7 @@ Plugins and themes can be installed directly from the Settings view inside Tabby
|
||||
|
||||
Pull requests and plugins are welcome!
|
||||
|
||||
See [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) and [API docs](http://ajenti.org/terminus-docs/) for information of how the project is laid out, and a very brief plugin development tutorial.
|
||||
See [HACKING.md](https://github.com/Eugeny/tabby/blob/master/HACKING.md) and [API docs](https://docs.tabby.sh/) for information of how the project is laid out, and a very brief plugin development tutorial.
|
||||
|
||||
---
|
||||
<a name="contributors"></a>
|
||||
@@ -209,6 +212,13 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
||||
<td align="center"><a href="https://github.com/al-wi"><img src="https://avatars.githubusercontent.com/u/11092199?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alexander Wiedemann</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=al-wi" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://www.notion.so/3d45c6bd2cbd4f938873a4bd12e23375"><img src="https://avatars.githubusercontent.com/u/59506394?v=4?s=100" width="100px;" alt=""/><br /><sub><b>장보연</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=BoYeonJang" title="Documentation">📖</a></td>
|
||||
</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/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>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
|
@@ -1,5 +1,5 @@
|
||||
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 { exec } from 'mz/child_process'
|
||||
import * as path from 'path'
|
||||
@@ -23,6 +23,7 @@ export class Application {
|
||||
private windows: Window[] = []
|
||||
private globalHotkey$ = new Subject<void>()
|
||||
private quitRequested = false
|
||||
private configStore: any
|
||||
userPluginsPath: string
|
||||
|
||||
constructor () {
|
||||
@@ -32,6 +33,7 @@ export class Application {
|
||||
|
||||
ipcMain.on('app:config-change', (_event, config) => {
|
||||
this.broadcast('host:config-change', config)
|
||||
this.configStore = config
|
||||
})
|
||||
|
||||
ipcMain.on('app:register-global-hotkey', (_event, specs) => {
|
||||
@@ -54,16 +56,24 @@ export class Application {
|
||||
})
|
||||
|
||||
;(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()
|
||||
this.configStore = loadConfig()
|
||||
if (process.platform === 'linux') {
|
||||
app.commandLine.appendSwitch('no-sandbox')
|
||||
if (((configData.appearance || {}).opacity || 1) !== 1) {
|
||||
if (((this.configStore.appearance || {}).opacity || 1) !== 1) {
|
||||
app.commandLine.appendSwitch('enable-transparent-visuals')
|
||||
app.disableHardwareAcceleration()
|
||||
}
|
||||
if (this.configStore.hacks?.disableGPU) {
|
||||
app.commandLine.appendSwitch('disable-gpu')
|
||||
app.disableHardwareAcceleration()
|
||||
}
|
||||
}
|
||||
|
||||
this.userPluginsPath = path.join(
|
||||
@@ -78,9 +88,8 @@ export class Application {
|
||||
app.commandLine.appendSwitch('disable-http-cache')
|
||||
app.commandLine.appendSwitch('max-active-webgl-contexts', '9000')
|
||||
app.commandLine.appendSwitch('lang', 'EN')
|
||||
app.allowRendererProcessReuse = false
|
||||
|
||||
for (const flag of configData.flags || [['force_discrete_gpu', '0']]) {
|
||||
for (const flag of this.configStore.flags || [['force_discrete_gpu', '0']]) {
|
||||
app.commandLine.appendSwitch(flag[0], flag[1])
|
||||
}
|
||||
|
||||
@@ -100,6 +109,9 @@ export class Application {
|
||||
async newWindow (options?: WindowOptions): Promise<Window> {
|
||||
const window = new Window(this, options)
|
||||
this.windows.push(window)
|
||||
if (this.windows.length === 1){
|
||||
window.makeMain()
|
||||
}
|
||||
window.visible$.subscribe(visible => {
|
||||
if (visible) {
|
||||
this.disableTray()
|
||||
@@ -109,16 +121,28 @@ export class Application {
|
||||
})
|
||||
window.closed$.subscribe(() => {
|
||||
this.windows = this.windows.filter(x => x !== window)
|
||||
if (!this.windows.some(x => x.isMainWindow)) {
|
||||
this.windows[0]?.makeMain()
|
||||
this.windows[0]?.present()
|
||||
}
|
||||
})
|
||||
if (process.platform === 'darwin') {
|
||||
this.setupMenu()
|
||||
}
|
||||
await window.ready
|
||||
window.present()
|
||||
return window
|
||||
}
|
||||
|
||||
onGlobalHotkey (): void {
|
||||
if (this.windows.some(x => x.isFocused() && x.isVisible())) {
|
||||
let isPresent = this.windows.some(x => x.isFocused() && x.isVisible())
|
||||
const isDockedOnTop = this.windows.some(x => x.isDockedOnTop())
|
||||
if (isDockedOnTop) {
|
||||
// if docked and on top, hide even if not focused right now
|
||||
isPresent = this.windows.some(x => x.isVisible())
|
||||
}
|
||||
|
||||
if (isPresent) {
|
||||
for (const window of this.windows) {
|
||||
window.hide()
|
||||
}
|
||||
@@ -187,7 +211,7 @@ export class Application {
|
||||
|
||||
focus (): void {
|
||||
for (const window of this.windows) {
|
||||
window.show()
|
||||
window.present()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -257,7 +281,6 @@ export class Application {
|
||||
{
|
||||
label: 'View',
|
||||
submenu: [
|
||||
{ role: 'reload' },
|
||||
{ role: 'toggleDevTools' },
|
||||
{ type: 'separator' },
|
||||
{ role: 'togglefullscreen' },
|
||||
@@ -285,6 +308,10 @@ export class Application {
|
||||
},
|
||||
]
|
||||
|
||||
if (process.env.TABBY_DEV) {
|
||||
template[2].submenu['unshift']({ role: 'reload' })
|
||||
}
|
||||
|
||||
Menu.setApplicationMenu(Menu.buildFromTemplate(template))
|
||||
}
|
||||
}
|
||||
|
@@ -25,7 +25,7 @@ export function parseArgs (argv: string[], cwd: string): any {
|
||||
type: 'string',
|
||||
})
|
||||
})
|
||||
.version('version', '', app.getVersion())
|
||||
.version(app.getVersion())
|
||||
.option('debug', {
|
||||
alias: 'd',
|
||||
describe: 'Show DevTools on start',
|
||||
@@ -35,11 +35,6 @@ export function parseArgs (argv: string[], cwd: string): any {
|
||||
describe: 'Start minimized',
|
||||
type: 'boolean',
|
||||
})
|
||||
.option('version', {
|
||||
alias: 'v',
|
||||
describe: 'Show version and exit',
|
||||
type: 'boolean',
|
||||
})
|
||||
.help('help')
|
||||
.parse()
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
import * as LRU from 'lru-cache'
|
||||
import LRU from 'lru-cache'
|
||||
import * as fs from 'fs'
|
||||
const lru = new LRU({ max: 256, maxAge: 250 })
|
||||
const origLstat = fs.realpathSync.bind(fs)
|
||||
|
@@ -90,6 +90,7 @@ class PTYDataQueue {
|
||||
export class PTY {
|
||||
private pty: nodePTY.IPty
|
||||
private outputQueue: PTYDataQueue
|
||||
exited = false
|
||||
|
||||
constructor (private id: string, private app: Application, ...args: any[]) {
|
||||
this.pty = (nodePTY as any).spawn(...args)
|
||||
@@ -101,7 +102,10 @@ export class PTY {
|
||||
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 {
|
||||
@@ -144,7 +148,7 @@ export class PTYManager {
|
||||
})
|
||||
|
||||
ipcMain.on('pty:exists', (event, id) => {
|
||||
event.returnValue = !!this.ptys[id]
|
||||
event.returnValue = this.ptys[id] && !this.ptys[id].exited
|
||||
})
|
||||
|
||||
ipcMain.on('pty:get-pid', (event, id) => {
|
||||
|
@@ -3,10 +3,11 @@ import * as glasstron from 'glasstron'
|
||||
import { Subject, Observable, debounceTime } from 'rxjs'
|
||||
import { BrowserWindow, app, ipcMain, Rectangle, Menu, screen, BrowserWindowConstructorOptions, TouchBar, nativeImage } from 'electron'
|
||||
import ElectronConfig = require('electron-config')
|
||||
import { enable as enableRemote } from '@electron/remote/main'
|
||||
import * as os from 'os'
|
||||
import * as path from 'path'
|
||||
import macOSRelease from 'macos-release'
|
||||
import * as compareVersions from 'compare-versions'
|
||||
import { compare as compareVersions } from 'compare-versions'
|
||||
|
||||
import type { Application } from './app'
|
||||
import { parseArgs } from './cli'
|
||||
@@ -14,7 +15,7 @@ import { loadConfig } from './config'
|
||||
|
||||
let DwmEnableBlurBehindWindow: any = null
|
||||
if (process.platform === 'win32') {
|
||||
DwmEnableBlurBehindWindow = require('windows-blurbehind').DwmEnableBlurBehindWindow
|
||||
DwmEnableBlurBehindWindow = require('@tabby-gang/windows-blurbehind').DwmEnableBlurBehindWindow
|
||||
}
|
||||
|
||||
export interface WindowOptions {
|
||||
@@ -26,12 +27,13 @@ abstract class GlasstronWindow extends BrowserWindow {
|
||||
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`)
|
||||
|
||||
export class Window {
|
||||
ready: Promise<void>
|
||||
isMainWindow = false
|
||||
private visible = new Subject<boolean>()
|
||||
private closed = new Subject<void>()
|
||||
private window?: GlasstronWindow
|
||||
@@ -42,6 +44,8 @@ export class Window {
|
||||
private disableVibrancyWhileDragging = false
|
||||
private configStore: any
|
||||
private touchBarControl: any
|
||||
private isFluentVibrancy = false
|
||||
private dockHidden = false
|
||||
|
||||
get visible$ (): Observable<boolean> { return this.visible }
|
||||
get closed$ (): Observable<void> { return this.closed }
|
||||
@@ -65,7 +69,6 @@ export class Window {
|
||||
nodeIntegration: true,
|
||||
preload: path.join(__dirname, 'sentry.js'),
|
||||
backgroundThrottling: false,
|
||||
enableRemoteModule: true,
|
||||
contextIsolation: false,
|
||||
},
|
||||
maximizable: true,
|
||||
@@ -126,6 +129,8 @@ export class Window {
|
||||
}
|
||||
})
|
||||
|
||||
enableRemote(this.window.webContents)
|
||||
|
||||
this.window.loadURL(`file://${app.getAppPath()}/dist/index.html`, { extraHeaders: 'pragma: no-cache\n' })
|
||||
|
||||
this.window.webContents.setVisualZoomLevelLimits(1, 1)
|
||||
@@ -156,6 +161,11 @@ export class Window {
|
||||
})
|
||||
}
|
||||
|
||||
makeMain (): void {
|
||||
this.isMainWindow = true
|
||||
this.window.webContents.send('host:became-main-window')
|
||||
}
|
||||
|
||||
setVibrancy (enabled: boolean, type?: string, userRequested?: boolean): void {
|
||||
if (userRequested ?? true) {
|
||||
this.lastVibrancy = { enabled, type }
|
||||
@@ -165,6 +175,7 @@ export class Window {
|
||||
this.window.blurType = enabled ? type === 'fluent' ? 'acrylic' : 'blurbehind' : null
|
||||
try {
|
||||
this.window.setBlur(enabled)
|
||||
this.isFluentVibrancy = enabled && type === 'fluent'
|
||||
} catch (error) {
|
||||
console.error('Failed to set window blur', error)
|
||||
}
|
||||
@@ -179,11 +190,6 @@ export class Window {
|
||||
}
|
||||
}
|
||||
|
||||
show (): void {
|
||||
this.window.show()
|
||||
this.window.moveTop()
|
||||
}
|
||||
|
||||
focus (): void {
|
||||
this.window.focus()
|
||||
}
|
||||
@@ -195,6 +201,7 @@ export class Window {
|
||||
this.window.webContents.send(event, ...args)
|
||||
if (event === 'host:config-change') {
|
||||
this.configStore = args[0]
|
||||
this.enableDockedWindowStyles(this.isDockedOnTop())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -210,45 +217,69 @@ export class Window {
|
||||
return this.window.isVisible()
|
||||
}
|
||||
|
||||
hide (): void {
|
||||
isDockedOnTop (): boolean {
|
||||
return this.isMainWindow && this.configStore.appearance?.dock && this.configStore.appearance?.dock !== 'off' && (this.configStore.appearance?.dockAlwaysOnTop ?? true)
|
||||
}
|
||||
|
||||
async hide (): Promise<void> {
|
||||
if (process.platform === 'darwin') {
|
||||
// Lose focus
|
||||
Menu.sendActionToFirstResponder('hide:')
|
||||
}
|
||||
this.window.blur()
|
||||
if (process.platform !== 'darwin') {
|
||||
this.window.hide()
|
||||
}
|
||||
}
|
||||
|
||||
present (): void {
|
||||
if (!this.window.isVisible()) {
|
||||
// unfocused, invisible
|
||||
this.window.show()
|
||||
this.window.focus()
|
||||
} else {
|
||||
if (!this.configStore.appearance?.dock || this.configStore.appearance?.dock === 'off') {
|
||||
// not docked, visible
|
||||
setTimeout(() => {
|
||||
this.window.show()
|
||||
this.window.focus()
|
||||
})
|
||||
} else {
|
||||
if (this.configStore.appearance?.dockAlwaysOnTop) {
|
||||
// docked, visible, on top
|
||||
this.window.hide()
|
||||
} else {
|
||||
// docked, visible, not on top
|
||||
this.window.focus()
|
||||
}
|
||||
if (this.isDockedOnTop()) {
|
||||
await this.enableDockedWindowStyles(false)
|
||||
}
|
||||
}
|
||||
this.window.blur()
|
||||
this.window.hide()
|
||||
}
|
||||
|
||||
async show (): Promise<void> {
|
||||
await this.enableDockedWindowStyles(this.isDockedOnTop())
|
||||
this.window.show()
|
||||
this.window.focus()
|
||||
}
|
||||
|
||||
async present (): Promise<void> {
|
||||
await this.show()
|
||||
this.window.moveTop()
|
||||
}
|
||||
|
||||
passCliArguments (argv: string[], cwd: string, secondInstance: boolean): void {
|
||||
this.send('cli', parseArgs(argv, cwd), cwd, secondInstance)
|
||||
}
|
||||
|
||||
private async enableDockedWindowStyles (enabled: boolean) {
|
||||
if (process.platform === 'darwin') {
|
||||
if (enabled) {
|
||||
if (!this.dockHidden) {
|
||||
app.dock.hide()
|
||||
this.dockHidden = true
|
||||
}
|
||||
this.window.setAlwaysOnTop(true, 'screen-saver', 1)
|
||||
if (!this.window.isVisibleOnAllWorkspaces()) {
|
||||
this.window.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true })
|
||||
}
|
||||
if (this.window.fullScreenable) {
|
||||
this.window.setFullScreenable(false)
|
||||
}
|
||||
} else {
|
||||
if (this.dockHidden) {
|
||||
await app.dock.show()
|
||||
this.dockHidden = false
|
||||
}
|
||||
if (this.window.isAlwaysOnTop()) {
|
||||
this.window.setAlwaysOnTop(false)
|
||||
}
|
||||
if (this.window.isVisibleOnAllWorkspaces()) {
|
||||
this.window.setVisibleOnAllWorkspaces(false)
|
||||
}
|
||||
if (!this.window.fullScreenable) {
|
||||
this.window.setFullScreenable(true)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private setupWindowManagement () {
|
||||
this.window.on('show', () => {
|
||||
this.visible.next(true)
|
||||
@@ -310,7 +341,7 @@ export class Window {
|
||||
config: this.configStore,
|
||||
executable: app.getPath('exe'),
|
||||
windowID: this.window.id,
|
||||
isFirstWindow: this.window.id === 1,
|
||||
isMainWindow: this.isMainWindow,
|
||||
userPluginsPath: this.application.userPluginsPath,
|
||||
})
|
||||
})
|
||||
@@ -357,8 +388,7 @@ export class Window {
|
||||
if (this.window.isMinimized()) {
|
||||
this.window.restore()
|
||||
}
|
||||
this.window.show()
|
||||
this.window.moveTop()
|
||||
this.present()
|
||||
})
|
||||
|
||||
ipcMain.on('window-close', event => {
|
||||
@@ -385,7 +415,7 @@ export class Window {
|
||||
|
||||
let moveEndedTimeout: any = null
|
||||
const onBoundsChange = () => {
|
||||
if (!this.lastVibrancy?.enabled || !this.disableVibrancyWhileDragging) {
|
||||
if (!this.lastVibrancy?.enabled || !this.disableVibrancyWhileDragging || !this.isFluentVibrancy) {
|
||||
return
|
||||
}
|
||||
this.setVibrancy(false, undefined, false)
|
||||
@@ -398,6 +428,18 @@ export class Window {
|
||||
}
|
||||
this.window.on('move', onBoundsChange)
|
||||
this.window.on('resize', onBoundsChange)
|
||||
|
||||
ipcMain.on('window-set-traffic-light-position', (_event, x, y) => {
|
||||
this.window.setTrafficLightPosition({ x, y })
|
||||
})
|
||||
|
||||
ipcMain.on('window-set-opacity', (_event, opacity) => {
|
||||
this.window.setOpacity(opacity)
|
||||
})
|
||||
|
||||
ipcMain.on('window-set-progress-bar', (_event, value) => {
|
||||
this.window.setProgressBar(value, { mode: value < 0 ? 'none' : 'normal' })
|
||||
})
|
||||
}
|
||||
|
||||
private destroy () {
|
||||
|
@@ -10,18 +10,19 @@
|
||||
"main": "dist/main.js",
|
||||
"version": "1.0.0-alpha.1",
|
||||
"scripts": {
|
||||
"postinstall": "patch-package",
|
||||
"build": "webpack --progress --color --display-modules",
|
||||
"watch": "webpack --progress --color --watch"
|
||||
},
|
||||
"dependencies": {
|
||||
"@angular/cdk": "^12.2.0",
|
||||
"@electron/remote": "1.2.0",
|
||||
"@angular/cdk": "^12.2.9",
|
||||
"@electron/remote": "2.0.1",
|
||||
"@tabby-gang/node-pty": "^0.11.0-beta.200",
|
||||
"any-promise": "^1.3.0",
|
||||
"electron-config": "2.0.0",
|
||||
"electron-debug": "^3.2.0",
|
||||
"electron-promise-ipc": "^2.2.4",
|
||||
"electron-updater": "^4.3.9",
|
||||
"electron-updater": "^4.6.1",
|
||||
"fontmanager-redux": "1.1.0",
|
||||
"glasstron": "0.0.7",
|
||||
"js-yaml": "4.1.0",
|
||||
@@ -29,23 +30,23 @@
|
||||
"mz": "^2.7.0",
|
||||
"native-process-working-directory": "^1.0.2",
|
||||
"npm": "6",
|
||||
"rxjs": "^7.2.0",
|
||||
"rxjs": "^7.4.0",
|
||||
"source-map-support": "^0.5.20",
|
||||
"v8-compile-cache": "^2.3.0",
|
||||
"yargs": "^17.1.0"
|
||||
"yargs": "^17.2.1"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@tabby-gang/windows-blurbehind": "^3.0.0",
|
||||
"macos-native-processlist": "^2.0.0",
|
||||
"serialport": "^9.2.1",
|
||||
"windows-blurbehind": "^1.0.1",
|
||||
"serialport": "^10.0.0",
|
||||
"windows-native-registry": "^3.1.0",
|
||||
"windows-process-tree": "^0.3.0"
|
||||
"windows-process-tree": "^0.3.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/mz": "2.7.4",
|
||||
"@types/node": "16.0.1",
|
||||
"ngx-filesize": "^2.0.16",
|
||||
"node-abi": "^3.1.0"
|
||||
"patch-package": "^6.4.7"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"tabby-community-color-schemes": "*",
|
||||
|
14
app/patches/@serialport+bindings+10.0.0.patch
Normal file
@@ -0,0 +1,14 @@
|
||||
diff --git a/node_modules/@serialport/bindings/src/serialport.cpp b/node_modules/@serialport/bindings/src/serialport.cpp
|
||||
index c48e150..00a5f5a 100644
|
||||
--- a/node_modules/@serialport/bindings/src/serialport.cpp
|
||||
+++ b/node_modules/@serialport/bindings/src/serialport.cpp
|
||||
@@ -269,7 +269,8 @@ Napi::Value Drain(const Napi::CallbackInfo& info) {
|
||||
}
|
||||
|
||||
inline SerialPortParity ToParityEnum(const Napi::String& napistr) {
|
||||
- const char* str = napistr.Utf8Value().c_str();
|
||||
+ auto tmp = napistr.Utf8Value();
|
||||
+ const char* str = tmp.c_str();
|
||||
size_t count = strlen(str);
|
||||
SerialPortParity parity = SERIALPORT_PARITY_NONE;
|
||||
if (!strncasecmp(str, "none", count)) {
|
@@ -2,6 +2,7 @@ body {
|
||||
min-height: 100vh;
|
||||
overflow: hidden;
|
||||
background: #1D272D;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
.modal-dialog, .modal-backdrop, .no-drag {
|
||||
@@ -16,13 +17,17 @@ body {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
flex-wrap: nowrap;
|
||||
a, button {
|
||||
&.btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
flex-wrap: nowrap;
|
||||
|
||||
& > svg {
|
||||
pointer-events: none;
|
||||
& > svg {
|
||||
pointer-events: none;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -163,6 +168,10 @@ ngb-typeahead-window {
|
||||
margin: -7px 0;
|
||||
}
|
||||
|
||||
.content-box {
|
||||
max-width: 600px;
|
||||
}
|
||||
|
||||
|
||||
// Windows high contrast mode
|
||||
@media screen and (forced-colors: active) {
|
||||
|
6
app/src/pluginBlacklist.ts
Normal 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
|
||||
]
|
@@ -2,6 +2,7 @@ import * as fs from 'mz/fs'
|
||||
import * as path from 'path'
|
||||
import * as remote from '@electron/remote'
|
||||
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
|
||||
|
||||
@@ -109,7 +110,7 @@ export async function findPlugins (): Promise<PluginInfo[]> {
|
||||
})
|
||||
}
|
||||
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 })
|
||||
}
|
||||
}
|
||||
|
@@ -6,6 +6,7 @@
|
||||
"declaration": false,
|
||||
"noImplicitAny": false,
|
||||
"removeComments": false,
|
||||
"esModuleInterop": true,
|
||||
"emitDecoratorMetadata": true,
|
||||
"experimentalDecorators": true,
|
||||
"sourceMap": true,
|
||||
|
@@ -3,11 +3,13 @@
|
||||
"baseUrl": "./lib",
|
||||
"module": "commonjs",
|
||||
"target": "es2017",
|
||||
"moduleResolution": "node",
|
||||
"declaration": false,
|
||||
"noImplicitAny": false,
|
||||
"removeComments": false,
|
||||
"emitDecoratorMetadata": true,
|
||||
"experimentalDecorators": true,
|
||||
"esModuleInterop": true,
|
||||
"sourceMap": true,
|
||||
"noUnusedParameters": true,
|
||||
"noImplicitReturns": true,
|
||||
|
@@ -51,7 +51,7 @@ module.exports = {
|
||||
'source-map-support': 'commonjs source-map-support',
|
||||
'windows-swca': 'commonjs windows-swca',
|
||||
'windows-native-registry': 'commonjs windows-native-registry',
|
||||
'windows-blurbehind': 'commonjs windows-blurbehind',
|
||||
'@tabby-gang/windows-blurbehind': 'commonjs @tabby-gang/windows-blurbehind',
|
||||
'yargs/yargs': 'commonjs yargs/yargs',
|
||||
},
|
||||
plugins: [
|
||||
|
485
app/yarn.lock
@@ -2,19 +2,19 @@
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@angular/cdk@^12.2.0":
|
||||
version "12.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-12.2.0.tgz#7c6de53522ef7cf911d86e187f3df2a90e8fee49"
|
||||
integrity sha512-Dts+KIMz6EdzQxaWBFcNwgWAHVPkI5pnOGMidKKVOmjezSUN6mhfBKq8emgsddJMRAqz/1VHMAEaRkp0VoBKiA==
|
||||
"@angular/cdk@^12.2.9":
|
||||
version "12.2.9"
|
||||
resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-12.2.9.tgz#f39e4d7cdb3568ad8e1d412e3500772e2d4c605c"
|
||||
integrity sha512-9Wgj69iGAZ4teQqW/zPbVg2RGna+m9i3v0zkWGx/+Uo95rikJCUZBQM4bfeOe+bSJrS77jV5EisBWG7ayNUSzQ==
|
||||
dependencies:
|
||||
tslib "^2.2.0"
|
||||
optionalDependencies:
|
||||
parse5 "^5.0.0"
|
||||
|
||||
"@electron/remote@1.2.0":
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-1.2.0.tgz#772eb4c3ac17aaba5a9cf05a09092f6277f5671f"
|
||||
integrity sha512-C774t2DFVJsa+dxU9Gc2nYzylRZoJ79I0Sxrh8T9cN69fBkntfGbyBEQiD9UfZopqL0CYLzk1anY2Ywhql6h1w==
|
||||
"@electron/remote@2.0.1":
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-2.0.1.tgz#810cbc595a21f0f94641eb2d7e8264063a3f84de"
|
||||
integrity sha512-bGX4/yB2bPZwXm1DsxgoABgH0Cz7oFtXJgkerB8VrStYdTyvhGAULzNLRn9rVmeAuC3VUDXaXpZIlZAZHpsLIA==
|
||||
|
||||
"@iarna/cli@^1.2.0":
|
||||
version "1.2.0"
|
||||
@@ -25,76 +25,76 @@
|
||||
update-notifier "^2.2.0"
|
||||
yargs "^8.0.2"
|
||||
|
||||
"@serialport/binding-abstract@^9.0.7":
|
||||
version "9.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/binding-abstract/-/binding-abstract-9.0.7.tgz#d2c7ecea0f100bdf20187bfc0d34ba90f5504e1e"
|
||||
integrity sha512-g1ncCMIG9rMsxo/28ObYmXZcHThlvtZygsCANmyMUuFS7SwXY4+PhcEnt2+ZcMkEDNRiOklT+ngtIVx5GGpt/A==
|
||||
"@serialport/binding-abstract@10.0.0":
|
||||
version "10.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/binding-abstract/-/binding-abstract-10.0.0.tgz#c5aea29de3721de80640e290f52217d00d927e4e"
|
||||
integrity sha512-1IwOMDOWqKO0csrTOv95Ah0Av012DZB8C0OF11SmE3eyh8ab1+y4/Yah/8byMAMG7TXw+2LqkNs1oZtOJGlY1Q==
|
||||
dependencies:
|
||||
debug "^4.3.1"
|
||||
debug "^4.3.2"
|
||||
|
||||
"@serialport/binding-mock@9.0.7":
|
||||
version "9.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/binding-mock/-/binding-mock-9.0.7.tgz#2fda427adc113320461f33f7426dfca73e8ad1de"
|
||||
integrity sha512-aR8H+htZwwZZkVb1MdbnNvGWw8eXVRqQ2qPhkbKyx0N/LY5aVIgCgT98Kt1YylLsG7SzNG+Jbhd4wzwEuPVT5Q==
|
||||
"@serialport/binding-mock@10.0.0":
|
||||
version "10.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/binding-mock/-/binding-mock-10.0.0.tgz#dc850c3e06f2be4b0c5e0461d2e12a2506cca573"
|
||||
integrity sha512-X+lJqU/GbXxxqA4b3T+YK9vQLtoNSjRF+hz1gyYHpNxDFX0dSLU1OVnQUZ2Zi8aa6IBdk/4DcuGN0tDNAlmtKg==
|
||||
dependencies:
|
||||
"@serialport/binding-abstract" "^9.0.7"
|
||||
debug "^4.3.1"
|
||||
"@serialport/binding-abstract" "10.0.0"
|
||||
debug "^4.3.2"
|
||||
|
||||
"@serialport/bindings@9.2.1":
|
||||
version "9.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/bindings/-/bindings-9.2.1.tgz#5e6b83222821f9b849512abdc8637386a6675355"
|
||||
integrity sha512-e1CvbvkuMptSjCKc/YwIGjEsSod7kGRpS5TciACQMOi2QQTD8XwVPim0izqVCBZko4n4b0dC6sG3EBkTkQIwnw==
|
||||
"@serialport/bindings@10.0.0":
|
||||
version "10.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/bindings/-/bindings-10.0.0.tgz#718b105adae977886967ab0edc68a067be9183f8"
|
||||
integrity sha512-t415A6clhsUX0dBRzN0NRN7Yb6y9U1jA4oGzxL2fWCy7XxQq8beI0GnMebEUaZDWKZ7IAVwGnAPUunk7QdlWlA==
|
||||
dependencies:
|
||||
"@serialport/binding-abstract" "^9.0.7"
|
||||
"@serialport/parser-readline" "^9.0.7"
|
||||
"@serialport/binding-abstract" "10.0.0"
|
||||
"@serialport/parser-readline" "10.0.0"
|
||||
bindings "^1.5.0"
|
||||
debug "^4.3.1"
|
||||
nan "^2.14.2"
|
||||
prebuild-install "^6.0.1"
|
||||
debug "^4.3.2"
|
||||
node-addon-api "4.2.0"
|
||||
prebuild-install "^7.0.0"
|
||||
|
||||
"@serialport/parser-byte-length@9.0.7":
|
||||
version "9.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/parser-byte-length/-/parser-byte-length-9.0.7.tgz#9e362bba70eeffcd2eb0804afeca4bb1dee59d5f"
|
||||
integrity sha512-evf7oOOSBMBn2AZZbgBFMRIyEzlsyQkhqaPm7IBCPTxMDXRf4tKkFYJHYZB0/6d1W4eI0meH079UqmSsh/uoDA==
|
||||
"@serialport/parser-byte-length@10.0.0":
|
||||
version "10.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/parser-byte-length/-/parser-byte-length-10.0.0.tgz#05ca2721a50dcdc93f68f3f1e72e10fd82362e84"
|
||||
integrity sha512-QmZw7oTt6LBHBFbMIPLIZM4WuXpMeK5EpCpXKFtw4a7+yF0yLPwz6uSV2Cf3SvunCfI3eWvucMKpgYNOvglsgA==
|
||||
|
||||
"@serialport/parser-cctalk@9.0.7":
|
||||
version "9.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/parser-cctalk/-/parser-cctalk-9.0.7.tgz#fa0e1539f067aced22a5ef7d64fdac14f1a6a4d3"
|
||||
integrity sha512-ert5jhMkeiTfr44TkbdySC09J8UwAsf/RxBucVN5Mz5enG509RggnkfFi4mfj3UCG2vZ7qsmM6gtZ62DshY02Q==
|
||||
"@serialport/parser-cctalk@10.0.0":
|
||||
version "10.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/parser-cctalk/-/parser-cctalk-10.0.0.tgz#de42e6952c086da3e384756502f9aaca0e97f881"
|
||||
integrity sha512-jCxzY2IPghNMaJ+GsUgSOoPCI2v1FZg7RvpSJ/b/igK+M/z/p7oRyWf1LqMyjZT7rP4Ha8ZfsQQy5qGzQ3kuzw==
|
||||
|
||||
"@serialport/parser-delimiter@9.0.7", "@serialport/parser-delimiter@^9.0.7":
|
||||
version "9.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/parser-delimiter/-/parser-delimiter-9.0.7.tgz#7bef2447d4282dd00dc659719b310edeb30ff294"
|
||||
integrity sha512-Vb2NPeXPZ/28M4m5x4OAHFd8jRAeddNCgvL+Q+H/hqFPY1w47JcMLchC7pigRW8Cnt1fklmzfwdNQ8Fb+kMkxQ==
|
||||
"@serialport/parser-delimiter@10.0.0":
|
||||
version "10.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/parser-delimiter/-/parser-delimiter-10.0.0.tgz#43eb2e3b4c4cf8633eb1200b3af5488ba9a7ecb6"
|
||||
integrity sha512-s7j+RIxxmyb7xJ3WVcf+IfjFqyoh7k7Edqwqvk2sQLU6UOBNAktNQDHIM/vksQ9QkjJjvl8rIo0YznfBkWbZOQ==
|
||||
|
||||
"@serialport/parser-inter-byte-timeout@9.0.7":
|
||||
version "9.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/parser-inter-byte-timeout/-/parser-inter-byte-timeout-9.0.7.tgz#55b315b49d8ad37f981ba69bb9443f25c96aec17"
|
||||
integrity sha512-lUZ3cwgUluBvJ1jf+0LQsqoiPYAokDO6+fRCw9HCfnrF/OS60Gm4rxuyo2uQIueqZkJ7NIFP+ibKsULrA47AEA==
|
||||
"@serialport/parser-inter-byte-timeout@10.0.0":
|
||||
version "10.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/parser-inter-byte-timeout/-/parser-inter-byte-timeout-10.0.0.tgz#07fe7c42e77c9a6379daa6939de55fef99c06ce4"
|
||||
integrity sha512-ygax3PHuPxi58D3/crCDENSFagvG5EsWjXj6AQRUisExPAAiD02RbZaRqTZluFvDbzMJ/29YJdcdIqnllzGVsw==
|
||||
|
||||
"@serialport/parser-readline@9.0.7", "@serialport/parser-readline@^9.0.7":
|
||||
version "9.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/parser-readline/-/parser-readline-9.0.7.tgz#8b096028170fb2644bcf0f997d534a344cfd00e6"
|
||||
integrity sha512-ydoLbgVQQPxWrwbe3Fhh4XnZexbkEQAC6M/qgRTzjnKvTjrD61CJNxLc3vyDaAPI9bJIhTiI7eTX3JB5jJv8Hg==
|
||||
"@serialport/parser-readline@10.0.0":
|
||||
version "10.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/parser-readline/-/parser-readline-10.0.0.tgz#a87b0d92864e917e07010477057b66efe92d3af9"
|
||||
integrity sha512-NI3oRY1+fLg94CZm887rgj4V6KyxaJmbmoRgua9bqRv7v/o0SqN9lSQwdYLHQVHpf03zTX9ziuoCV8w5CI3DQQ==
|
||||
dependencies:
|
||||
"@serialport/parser-delimiter" "^9.0.7"
|
||||
"@serialport/parser-delimiter" "10.0.0"
|
||||
|
||||
"@serialport/parser-ready@9.0.7":
|
||||
version "9.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/parser-ready/-/parser-ready-9.0.7.tgz#d9eb9801c6003fdb1450c557f3e256a188a9f3be"
|
||||
integrity sha512-3qYhI4cNUPAYqVYvdwV57Y+PVRl4dJf1fPBtMoWtwDgwopsAXTR93WCs49WuUq9JCyNW+8Hrfqv8x8eNAD5Dqg==
|
||||
"@serialport/parser-ready@10.0.0":
|
||||
version "10.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/parser-ready/-/parser-ready-10.0.0.tgz#eae67e9c0806f5b2d9750c1ef910a3cedb549119"
|
||||
integrity sha512-pmMjRVy0wwVSzRt27AtMV/FJdSL6CdKvLUNx+ziDL9Lt30n85ZzrSdYJOwOB63HVIMg8+JRgiyxKNLs+JgMK2g==
|
||||
|
||||
"@serialport/parser-regex@9.0.7":
|
||||
version "9.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/parser-regex/-/parser-regex-9.0.7.tgz#d8a02e3a169faa2f6604e8293832cc676b865f48"
|
||||
integrity sha512-5XF+FXbhqQ/5bVKM4NaGs1m+E9KjfmeCx/obwsKaUZognQF67jwoTfjJJWNP/21jKfxdl8XoCYjZjASl3XKRAw==
|
||||
"@serialport/parser-regex@10.0.0":
|
||||
version "10.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/parser-regex/-/parser-regex-10.0.0.tgz#a5dd648baf0952253a995bf0174ba2c19649e279"
|
||||
integrity sha512-kLvK6bbDtpnVMagCK95m08W+XaXXzJpDvjzrMNSAtpaL+yeBu4XlEhHpt9+9S/MOetbz4vgWdZx2buYyw9iiGQ==
|
||||
|
||||
"@serialport/stream@9.0.7":
|
||||
version "9.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/stream/-/stream-9.0.7.tgz#0bf023eb0233a714fcc5a86de09e381e466d9882"
|
||||
integrity sha512-c/h7HPAeFiryD9iTGlaSvPqHFHSZ0NMQHxC4rcmKS2Vu3qJuEtkBdTLABwsMp7iWEiSnI4KC3s7bHapaXP06FQ==
|
||||
"@serialport/stream@10.0.0":
|
||||
version "10.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/stream/-/stream-10.0.0.tgz#482580b9bdad468ac2a60c41c7fb933f7dc7436f"
|
||||
integrity sha512-KFBGWH6BEn4gXUYHEfbywplDX+sVhlL/Yzn/r7hn+qYnwVjhvQo8Vi35CPKESOUKnMKU48sGSUvNaOwU5znw2g==
|
||||
dependencies:
|
||||
debug "^4.3.1"
|
||||
debug "^4.3.2"
|
||||
|
||||
"@tabby-gang/node-pty@^0.11.0-beta.200":
|
||||
version "0.11.0-beta.200"
|
||||
@@ -103,6 +103,13 @@
|
||||
dependencies:
|
||||
nan "^2.14.0"
|
||||
|
||||
"@tabby-gang/windows-blurbehind@^3.0.0":
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@tabby-gang/windows-blurbehind/-/windows-blurbehind-3.0.0.tgz#48d409c2eb14a12c867b70de5ee4d6769ef45e8f"
|
||||
integrity sha512-ah6eJcoQZWOZfu9sd2pWlOJmfl1v+2EZQMeIp7MWvg+/16WS16UFNdnOtlV6AUiABHfZo2QKfCNUEuorCM+Q2A==
|
||||
dependencies:
|
||||
"@types/node" "^10.12.18"
|
||||
|
||||
"@types/mz@2.7.4":
|
||||
version "2.7.4"
|
||||
resolved "https://registry.yarnpkg.com/@types/mz/-/mz-2.7.4.tgz#f9d1535cb5171199b28ae6abd6ec29e856551401"
|
||||
@@ -115,10 +122,20 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.0.1.tgz#70cedfda26af7a2ca073fdcc9beb2fff4aa693f8"
|
||||
integrity sha512-hBOx4SUlEPKwRi6PrXuTGw1z6lz0fjsibcWCM378YxsSu/6+C30L6CR49zIBKHiwNWCYIcOLjg4OHKZaFeLAug==
|
||||
|
||||
"@types/semver@^7.3.5":
|
||||
version "7.3.8"
|
||||
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.8.tgz#508a27995498d7586dcecd77c25e289bfaf90c59"
|
||||
integrity sha512-D/2EJvAlCEtYFEYmmlGwbGXuK886HzyCc3nZX/tkFTQdEU8jZDAgiv08P162yB17y4ZXZoq7yFAnW4GDBb9Now==
|
||||
"@types/node@^10.12.18":
|
||||
version "10.17.60"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b"
|
||||
integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==
|
||||
|
||||
"@types/semver@^7.3.6":
|
||||
version "7.3.9"
|
||||
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc"
|
||||
integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==
|
||||
|
||||
"@yarnpkg/lockfile@^1.1.0":
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31"
|
||||
integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==
|
||||
|
||||
JSONStream@^1.3.4, JSONStream@^1.3.5:
|
||||
version "1.3.5"
|
||||
@@ -351,6 +368,13 @@ brace-expansion@^1.1.7:
|
||||
balanced-match "^1.0.0"
|
||||
concat-map "0.0.1"
|
||||
|
||||
braces@^3.0.1:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
|
||||
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
|
||||
dependencies:
|
||||
fill-range "^7.0.1"
|
||||
|
||||
buffer-from@^1.0.0:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
|
||||
@@ -364,10 +388,10 @@ buffer@^5.5.0:
|
||||
base64-js "^1.3.1"
|
||||
ieee754 "^1.1.13"
|
||||
|
||||
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==
|
||||
builder-util-runtime@8.9.1:
|
||||
version "8.9.1"
|
||||
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.9.1.tgz#25f066b3fbc20b3e6236a9b956b1ebb0e33ff66a"
|
||||
integrity sha512-c8a8J3wK6BIVLW7ls+7TRK9igspTbzWmUqxFbgK0m40Ggm6efUbxtWVCGIjc+dtchyr5qAMAUL6iEGRdS/6vwg==
|
||||
dependencies:
|
||||
debug "^4.3.2"
|
||||
sax "^1.2.4"
|
||||
@@ -441,7 +465,7 @@ caseless@~0.12.0:
|
||||
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz"
|
||||
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
|
||||
|
||||
chalk@^2.0.1:
|
||||
chalk@^2.0.1, chalk@^2.4.2:
|
||||
version "2.4.2"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
|
||||
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
|
||||
@@ -668,6 +692,17 @@ cross-spawn@^5.0.1:
|
||||
shebang-command "^1.2.0"
|
||||
which "^1.2.9"
|
||||
|
||||
cross-spawn@^6.0.5:
|
||||
version "6.0.5"
|
||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
|
||||
integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
|
||||
dependencies:
|
||||
nice-try "^1.0.4"
|
||||
path-key "^2.0.1"
|
||||
semver "^5.5.0"
|
||||
shebang-command "^1.2.0"
|
||||
which "^1.2.9"
|
||||
|
||||
crypto-random-string@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
|
||||
@@ -699,7 +734,7 @@ debug@^3.1.0:
|
||||
dependencies:
|
||||
ms "^2.1.1"
|
||||
|
||||
debug@^4.0.1, debug@^4.3.1, debug@^4.3.2:
|
||||
debug@^4.0.1, 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==
|
||||
@@ -728,6 +763,13 @@ decompress-response@^4.2.0:
|
||||
dependencies:
|
||||
mimic-response "^2.0.0"
|
||||
|
||||
decompress-response@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
|
||||
integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
|
||||
dependencies:
|
||||
mimic-response "^3.1.0"
|
||||
|
||||
deep-extend@^0.6.0:
|
||||
version "0.6.0"
|
||||
resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz"
|
||||
@@ -865,16 +907,16 @@ electron-promise-ipc@^2.2.4:
|
||||
serialize-error "^5.0.0"
|
||||
uuid "^3.0.1"
|
||||
|
||||
electron-updater@^4.3.9:
|
||||
version "4.3.9"
|
||||
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.3.9.tgz#247c660bafad7c07935e1b81acd3e9a5fd733154"
|
||||
integrity sha512-LCNfedSwZfS4Hza+pDyPR05LqHtGorCStaBgVpRnfKxOlZcvpYEX0AbMeH5XUtbtGRoH2V8osbbf2qKPNb7AsA==
|
||||
electron-updater@^4.6.1:
|
||||
version "4.6.1"
|
||||
resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.6.1.tgz#80ca805c4f51b2e682aac29d18fed75d6a533d32"
|
||||
integrity sha512-YsU1mHqXLrXXmBMsxhxy24PrbaB8rnpZDPmFa2gOkTYk/Ch13+R0fjsRSpPYvqtskVVY0ux8fu+HnUkVkqc7og==
|
||||
dependencies:
|
||||
"@types/semver" "^7.3.5"
|
||||
builder-util-runtime "8.7.5"
|
||||
"@types/semver" "^7.3.6"
|
||||
builder-util-runtime "8.9.1"
|
||||
fs-extra "^10.0.0"
|
||||
js-yaml "^4.1.0"
|
||||
lazy-val "^1.0.4"
|
||||
lazy-val "^1.0.5"
|
||||
lodash.escaperegexp "^4.1.2"
|
||||
lodash.isequal "^4.5.0"
|
||||
semver "^7.3.5"
|
||||
@@ -1034,6 +1076,13 @@ file-uri-to-path@1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.3.0.tgz#dff53cfb3f104c9e422f346d53be8dbcc971bf11"
|
||||
integrity sha512-ytx0ruGpDHKWVoiui6+BY/QMNngtDQ/pJaFwfBpQif0J63+E8DLdFyqS3NkKQn7vIruUEpoGD9JUJSg7Kp+I0g==
|
||||
|
||||
fill-range@^7.0.1:
|
||||
version "7.0.1"
|
||||
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
|
||||
integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
|
||||
dependencies:
|
||||
to-regex-range "^5.0.1"
|
||||
|
||||
find-npm-prefix@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz#8d8ce2c78b3b4b9e66c8acc6a37c231eb841cfdf"
|
||||
@@ -1053,6 +1102,13 @@ find-up@^3.0.0:
|
||||
dependencies:
|
||||
locate-path "^3.0.0"
|
||||
|
||||
find-yarn-workspace-root@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd"
|
||||
integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==
|
||||
dependencies:
|
||||
micromatch "^4.0.2"
|
||||
|
||||
flush-write-stream@^1.0.0:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
|
||||
@@ -1112,7 +1168,16 @@ fs-extra@^10.0.0:
|
||||
jsonfile "^6.0.1"
|
||||
universalify "^2.0.0"
|
||||
|
||||
fs-minipass@^1.2.5:
|
||||
fs-extra@^7.0.1:
|
||||
version "7.0.1"
|
||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
|
||||
integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
|
||||
dependencies:
|
||||
graceful-fs "^4.1.2"
|
||||
jsonfile "^4.0.0"
|
||||
universalify "^0.1.0"
|
||||
|
||||
fs-minipass@^1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
|
||||
integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
|
||||
@@ -1466,6 +1531,13 @@ is-ci@^1.0.10:
|
||||
dependencies:
|
||||
ci-info "^1.5.0"
|
||||
|
||||
is-ci@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
|
||||
integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
|
||||
dependencies:
|
||||
ci-info "^2.0.0"
|
||||
|
||||
is-cidr@^3.0.0:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-3.1.1.tgz#e92ef121bdec2782271a77ce487a8b8df3718ab7"
|
||||
@@ -1485,6 +1557,11 @@ is-date-object@^1.0.1:
|
||||
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
|
||||
integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
|
||||
|
||||
is-docker@^2.0.0:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
|
||||
integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
|
||||
|
||||
is-electron-renderer@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/is-electron-renderer/-/is-electron-renderer-2.0.1.tgz#a469d056f975697c58c98c6023eb0aa79af895a2"
|
||||
@@ -1525,6 +1602,11 @@ is-npm@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
|
||||
integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ=
|
||||
|
||||
is-number@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
|
||||
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
|
||||
|
||||
is-obj@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz"
|
||||
@@ -1571,6 +1653,13 @@ is-typedarray@~1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz"
|
||||
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
|
||||
|
||||
is-wsl@^2.1.1:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
|
||||
integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
|
||||
dependencies:
|
||||
is-docker "^2.0.0"
|
||||
|
||||
isarray@0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
|
||||
@@ -1628,6 +1717,13 @@ json-stringify-safe@~5.0.1:
|
||||
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
|
||||
integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
|
||||
|
||||
jsonfile@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
|
||||
integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
|
||||
optionalDependencies:
|
||||
graceful-fs "^4.1.6"
|
||||
|
||||
jsonfile@^6.0.1:
|
||||
version "6.1.0"
|
||||
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
|
||||
@@ -1670,6 +1766,13 @@ keytar@^7.7.0:
|
||||
node-addon-api "^3.0.0"
|
||||
prebuild-install "^6.0.0"
|
||||
|
||||
klaw-sync@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c"
|
||||
integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==
|
||||
dependencies:
|
||||
graceful-fs "^4.1.11"
|
||||
|
||||
latest-version@^3.0.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15"
|
||||
@@ -1682,7 +1785,7 @@ lazy-property@~1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147"
|
||||
integrity sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc=
|
||||
|
||||
lazy-val@^1.0.4:
|
||||
lazy-val@^1.0.5:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d"
|
||||
integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==
|
||||
@@ -1988,6 +2091,14 @@ mem@^1.1.0:
|
||||
dependencies:
|
||||
mimic-fn "^1.0.0"
|
||||
|
||||
micromatch@^4.0.2:
|
||||
version "4.0.4"
|
||||
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
|
||||
integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
|
||||
dependencies:
|
||||
braces "^3.0.1"
|
||||
picomatch "^2.2.3"
|
||||
|
||||
mime-db@1.44.0:
|
||||
version "1.44.0"
|
||||
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz"
|
||||
@@ -2010,6 +2121,11 @@ mimic-response@^2.0.0:
|
||||
resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz"
|
||||
integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==
|
||||
|
||||
mimic-response@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
|
||||
integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
|
||||
|
||||
minimatch@^3.0.4:
|
||||
version "3.0.4"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz"
|
||||
@@ -2022,7 +2138,7 @@ minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5:
|
||||
resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz"
|
||||
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
|
||||
|
||||
minipass@^2.3.5, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
|
||||
minipass@^2.3.5, minipass@^2.6.0, minipass@^2.9.0:
|
||||
version "2.9.0"
|
||||
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
|
||||
integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
|
||||
@@ -2030,7 +2146,7 @@ minipass@^2.3.5, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
|
||||
safe-buffer "^5.1.2"
|
||||
yallist "^3.0.0"
|
||||
|
||||
minizlib@^1.2.1:
|
||||
minizlib@^1.3.3:
|
||||
version "1.3.3"
|
||||
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
|
||||
integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
|
||||
@@ -2058,7 +2174,7 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
|
||||
resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz"
|
||||
integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
|
||||
|
||||
mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.0:
|
||||
mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.0:
|
||||
version "0.5.5"
|
||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
|
||||
integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
|
||||
@@ -2106,7 +2222,7 @@ mz@^2.7.0:
|
||||
object-assign "^4.0.1"
|
||||
thenify-all "^1.0.0"
|
||||
|
||||
nan@^2.13.2, nan@^2.14.0, nan@^2.14.2:
|
||||
nan@^2.13.2, nan@^2.14.0:
|
||||
version "2.14.2"
|
||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19"
|
||||
integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==
|
||||
@@ -2131,17 +2247,22 @@ ngx-filesize@^2.0.16:
|
||||
filesize ">= 4.0.0"
|
||||
tslib "^2.0.0"
|
||||
|
||||
nice-try@^1.0.4:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
|
||||
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
|
||||
|
||||
node-abi@^2.20.0, node-abi@^2.7.0:
|
||||
version "2.30.0"
|
||||
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.0.tgz#8be53bf3e7945a34eea10e0fc9a5982776cf550b"
|
||||
integrity sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==
|
||||
version "2.30.1"
|
||||
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf"
|
||||
integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==
|
||||
dependencies:
|
||||
semver "^5.4.1"
|
||||
|
||||
node-abi@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.1.0.tgz#9560f38fbe2309e87c61f4f103c9d95e0f961c32"
|
||||
integrity sha512-kVF+eIDzPPwPcJdoVhWboJvdCe+YF1+rkd7+LeYmA95179T0sVB5kKG8VADM/3sBnGWeAUBR8FzH+whlksJTrQ==
|
||||
node-abi@^3.3.0:
|
||||
version "3.5.0"
|
||||
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.5.0.tgz#26e8b7b251c3260a5ac5ba5aef3b4345a0229248"
|
||||
integrity sha512-LtHvNIBgOy5mO8mPEUtkCW/YCRWYEKshIvqhe1GHHyXEHEB5mgICyYnAcl4qan3uFeRROErKGzatFHPf6kDxWw==
|
||||
dependencies:
|
||||
semver "^7.3.5"
|
||||
|
||||
@@ -2150,6 +2271,11 @@ node-addon-api@3.0.0:
|
||||
resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.0.tgz"
|
||||
integrity sha512-sSHCgWfJ+Lui/u+0msF3oyCgvdkhxDbkCS6Q8uiJquzOimkJBvX6hl5aSSA7DR1XbMpdM8r7phjcF63sF4rkKg==
|
||||
|
||||
node-addon-api@4.2.0:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.2.0.tgz#117cbb5a959dff0992e1c586ae0393573e4d2a87"
|
||||
integrity sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q==
|
||||
|
||||
node-addon-api@^3.0.0, node-addon-api@^3.0.2, node-addon-api@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz"
|
||||
@@ -2509,6 +2635,14 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0, once@~1.4.0:
|
||||
dependencies:
|
||||
wrappy "1"
|
||||
|
||||
open@^7.4.2:
|
||||
version "7.4.2"
|
||||
resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321"
|
||||
integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==
|
||||
dependencies:
|
||||
is-docker "^2.0.0"
|
||||
is-wsl "^2.1.1"
|
||||
|
||||
opener@^1.5.2:
|
||||
version "1.5.2"
|
||||
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
|
||||
@@ -2528,7 +2662,7 @@ os-locale@^2.0.0:
|
||||
lcid "^1.0.0"
|
||||
mem "^1.1.0"
|
||||
|
||||
os-tmpdir@^1.0.0:
|
||||
os-tmpdir@^1.0.0, os-tmpdir@~1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
|
||||
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
|
||||
@@ -2651,6 +2785,25 @@ parse5@^5.0.0:
|
||||
resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178"
|
||||
integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==
|
||||
|
||||
patch-package@^6.4.7:
|
||||
version "6.4.7"
|
||||
resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148"
|
||||
integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ==
|
||||
dependencies:
|
||||
"@yarnpkg/lockfile" "^1.1.0"
|
||||
chalk "^2.4.2"
|
||||
cross-spawn "^6.0.5"
|
||||
find-yarn-workspace-root "^2.0.0"
|
||||
fs-extra "^7.0.1"
|
||||
is-ci "^2.0.0"
|
||||
klaw-sync "^6.0.0"
|
||||
minimist "^1.2.0"
|
||||
open "^7.4.2"
|
||||
rimraf "^2.6.3"
|
||||
semver "^5.6.0"
|
||||
slash "^2.0.0"
|
||||
tmp "^0.0.33"
|
||||
|
||||
path-exists@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz"
|
||||
@@ -2666,7 +2819,7 @@ path-is-inside@^1.0.1, path-is-inside@^1.0.2, path-is-inside@~1.0.2:
|
||||
resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
|
||||
integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
|
||||
|
||||
path-key@^2.0.0:
|
||||
path-key@^2.0.0, path-key@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
|
||||
integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
|
||||
@@ -2688,6 +2841,11 @@ performance-now@^2.1.0:
|
||||
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz"
|
||||
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
|
||||
|
||||
picomatch@^2.2.3:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
|
||||
integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
|
||||
|
||||
pify@^2.0.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
|
||||
@@ -2705,7 +2863,7 @@ pkg-up@^2.0.0:
|
||||
dependencies:
|
||||
find-up "^2.1.0"
|
||||
|
||||
prebuild-install@^6.0.0, prebuild-install@^6.0.1:
|
||||
prebuild-install@^6.0.0:
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.0.1.tgz#5902172f7a40eb67305b96c2a695db32636ee26d"
|
||||
integrity sha512-7GOJrLuow8yeiyv75rmvZyeMGzl8mdEX5gY69d6a6bHWmiPevwqFw+tQavhK0EYMaSg3/KD24cWqeQv1EWsqDQ==
|
||||
@@ -2726,6 +2884,25 @@ prebuild-install@^6.0.0, prebuild-install@^6.0.1:
|
||||
tunnel-agent "^0.6.0"
|
||||
which-pm-runs "^1.0.0"
|
||||
|
||||
prebuild-install@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.0.0.tgz#3c5ce3902f1cb9d6de5ae94ca53575e4af0c1574"
|
||||
integrity sha512-IvSenf33K7JcgddNz2D5w521EgO+4aMMjFt73Uk9FRzQ7P+QZPKrp7qPsDydsSwjGt3T5xRNnM1bj1zMTD5fTA==
|
||||
dependencies:
|
||||
detect-libc "^1.0.3"
|
||||
expand-template "^2.0.3"
|
||||
github-from-package "0.0.0"
|
||||
minimist "^1.2.3"
|
||||
mkdirp-classic "^0.5.3"
|
||||
napi-build-utils "^1.0.1"
|
||||
node-abi "^3.3.0"
|
||||
npmlog "^4.0.1"
|
||||
pump "^3.0.0"
|
||||
rc "^1.2.7"
|
||||
simple-get "^4.0.0"
|
||||
tar-fs "^2.0.0"
|
||||
tunnel-agent "^0.6.0"
|
||||
|
||||
prepend-http@^1.0.1:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
|
||||
@@ -3046,14 +3223,14 @@ run-queue@^1.0.0, run-queue@^1.0.3:
|
||||
dependencies:
|
||||
aproba "^1.1.1"
|
||||
|
||||
rxjs@^7.2.0:
|
||||
version "7.2.0"
|
||||
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.2.0.tgz#5cd12409639e9514a71c9f5f9192b2c4ae94de31"
|
||||
integrity sha512-aX8w9OpKrQmiPKfT1bqETtUr9JygIz6GZ+gql8v7CijClsP0laoFUdKzxFAoWuRdSlOdU2+crss+cMf+cqMTnw==
|
||||
rxjs@^7.4.0:
|
||||
version "7.4.0"
|
||||
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.4.0.tgz#a12a44d7eebf016f5ff2441b87f28c9a51cebc68"
|
||||
integrity sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==
|
||||
dependencies:
|
||||
tslib "~2.1.0"
|
||||
|
||||
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0:
|
||||
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1:
|
||||
version "5.2.1"
|
||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
|
||||
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
|
||||
@@ -3080,7 +3257,7 @@ semver-diff@^2.0.0:
|
||||
dependencies:
|
||||
semver "^5.0.3"
|
||||
|
||||
"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1:
|
||||
"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1:
|
||||
version "5.7.1"
|
||||
resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz"
|
||||
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
|
||||
@@ -3099,22 +3276,22 @@ serialize-error@^5.0.0:
|
||||
dependencies:
|
||||
type-fest "^0.8.0"
|
||||
|
||||
serialport@^9.2.1:
|
||||
version "9.2.1"
|
||||
resolved "https://registry.yarnpkg.com/serialport/-/serialport-9.2.1.tgz#9da02f6657ee9e2c8bd7642ff6c5c59a6a65d17e"
|
||||
integrity sha512-zX18SVSNRZvMrkxNvSnhqqag46MLQH517EaLSVv8PKSVnTFMzemRCfBdXbOY2XhtUqzpQq6ep2mR1t+AMhJssg==
|
||||
serialport@^10.0.0:
|
||||
version "10.0.0"
|
||||
resolved "https://registry.yarnpkg.com/serialport/-/serialport-10.0.0.tgz#75ec9fd25683dc1acb9d8e24433608f641b0b9e0"
|
||||
integrity sha512-fqOs6u4buZLbTpAPYZP4j2qwcOJ5Jxtg0x+llJFuMc4AVwrxx+iQc68/46aHCr+qJ2Wo2N86AZ/DDY5acSOODA==
|
||||
dependencies:
|
||||
"@serialport/binding-mock" "9.0.7"
|
||||
"@serialport/bindings" "9.2.1"
|
||||
"@serialport/parser-byte-length" "9.0.7"
|
||||
"@serialport/parser-cctalk" "9.0.7"
|
||||
"@serialport/parser-delimiter" "9.0.7"
|
||||
"@serialport/parser-inter-byte-timeout" "9.0.7"
|
||||
"@serialport/parser-readline" "9.0.7"
|
||||
"@serialport/parser-ready" "9.0.7"
|
||||
"@serialport/parser-regex" "9.0.7"
|
||||
"@serialport/stream" "9.0.7"
|
||||
debug "^4.3.1"
|
||||
"@serialport/binding-mock" "10.0.0"
|
||||
"@serialport/bindings" "10.0.0"
|
||||
"@serialport/parser-byte-length" "10.0.0"
|
||||
"@serialport/parser-cctalk" "10.0.0"
|
||||
"@serialport/parser-delimiter" "10.0.0"
|
||||
"@serialport/parser-inter-byte-timeout" "10.0.0"
|
||||
"@serialport/parser-readline" "10.0.0"
|
||||
"@serialport/parser-ready" "10.0.0"
|
||||
"@serialport/parser-regex" "10.0.0"
|
||||
"@serialport/stream" "10.0.0"
|
||||
debug "^4.3.2"
|
||||
|
||||
set-blocking@^2.0.0, set-blocking@~2.0.0:
|
||||
version "2.0.0"
|
||||
@@ -3159,6 +3336,20 @@ simple-get@^3.0.3:
|
||||
once "^1.3.1"
|
||||
simple-concat "^1.0.0"
|
||||
|
||||
simple-get@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.0.tgz#73fa628278d21de83dadd5512d2cc1f4872bd675"
|
||||
integrity sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==
|
||||
dependencies:
|
||||
decompress-response "^6.0.0"
|
||||
once "^1.3.1"
|
||||
simple-concat "^1.0.0"
|
||||
|
||||
slash@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
|
||||
integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
|
||||
|
||||
slide@^1.1.6, slide@~1.1.3, slide@~1.1.6:
|
||||
version "1.1.6"
|
||||
resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
|
||||
@@ -3430,17 +3621,17 @@ tar-stream@^2.1.4:
|
||||
readable-stream "^3.1.1"
|
||||
|
||||
tar@^4.4.10, tar@^4.4.12, tar@^4.4.13:
|
||||
version "4.4.13"
|
||||
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
|
||||
integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
|
||||
version "4.4.19"
|
||||
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3"
|
||||
integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==
|
||||
dependencies:
|
||||
chownr "^1.1.1"
|
||||
fs-minipass "^1.2.5"
|
||||
minipass "^2.8.6"
|
||||
minizlib "^1.2.1"
|
||||
mkdirp "^0.5.0"
|
||||
safe-buffer "^5.1.2"
|
||||
yallist "^3.0.3"
|
||||
chownr "^1.1.4"
|
||||
fs-minipass "^1.2.7"
|
||||
minipass "^2.9.0"
|
||||
minizlib "^1.3.3"
|
||||
mkdirp "^0.5.5"
|
||||
safe-buffer "^5.2.1"
|
||||
yallist "^3.1.1"
|
||||
|
||||
term-size@^1.2.0:
|
||||
version "1.2.0"
|
||||
@@ -3491,6 +3682,20 @@ tiny-relative-date@^1.3.0:
|
||||
resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz"
|
||||
integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==
|
||||
|
||||
tmp@^0.0.33:
|
||||
version "0.0.33"
|
||||
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
|
||||
integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
|
||||
dependencies:
|
||||
os-tmpdir "~1.0.2"
|
||||
|
||||
to-regex-range@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
|
||||
integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
|
||||
dependencies:
|
||||
is-number "^7.0.0"
|
||||
|
||||
tough-cookie@~2.5.0:
|
||||
version "2.5.0"
|
||||
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz"
|
||||
@@ -3562,6 +3767,11 @@ unique-string@^1.0.0:
|
||||
dependencies:
|
||||
crypto-random-string "^1.0.0"
|
||||
|
||||
universalify@^0.1.0:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
|
||||
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
|
||||
|
||||
universalify@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
|
||||
@@ -3696,11 +3906,6 @@ widest-line@^2.0.0:
|
||||
dependencies:
|
||||
string-width "^2.1.1"
|
||||
|
||||
windows-blurbehind@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/windows-blurbehind/-/windows-blurbehind-1.0.1.tgz#ff098713873304e38330b2c54cc41bb369b587b9"
|
||||
integrity sha512-1HzHfCiM1ayrbACJu5qE9zELV24uX/tINT6kxaZwLY3rtQAoeav6x9z7LFHWoLaGDN/sYbnK+9Vk0cz7fsk5HQ==
|
||||
|
||||
windows-native-registry@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/windows-native-registry/-/windows-native-registry-3.1.0.tgz#909ef3254519fdec57d2f149ac59a2c9dc84419a"
|
||||
@@ -3708,10 +3913,10 @@ windows-native-registry@^3.1.0:
|
||||
dependencies:
|
||||
node-addon-api "^3.1.0"
|
||||
|
||||
windows-process-tree@^0.3.0:
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/windows-process-tree/-/windows-process-tree-0.3.0.tgz#cf0d9291b22fba2a7f5a687c8272866e28fbcafd"
|
||||
integrity sha512-0bKI4gcd5MOsOpn2TdStCSlnjThtH6BdHrocekY9qCgTqgEtdaUs0B5BaqyzF9jXoTSwz38NMdE1F55o4fgv9Q==
|
||||
windows-process-tree@^0.3.2:
|
||||
version "0.3.2"
|
||||
resolved "https://registry.yarnpkg.com/windows-process-tree/-/windows-process-tree-0.3.2.tgz#8c39f39e7707e09fd74638a7ef644b5f389096d3"
|
||||
integrity sha512-x8Y4KOV8tUhhPiO0TH7wOMTZ677rw7VEwq+dTuHHiLTClkrNXWSY3XzP6ez3fs2Cab4FajrtmiqRs0jTMZHfyw==
|
||||
dependencies:
|
||||
nan "^2.13.2"
|
||||
|
||||
@@ -3799,7 +4004,7 @@ yallist@^2.1.2:
|
||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
|
||||
integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
|
||||
|
||||
yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
|
||||
yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
|
||||
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
|
||||
@@ -3846,10 +4051,10 @@ yargs@^14.2.3:
|
||||
y18n "^4.0.0"
|
||||
yargs-parser "^15.0.1"
|
||||
|
||||
yargs@^17.1.0:
|
||||
version "17.1.0"
|
||||
resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.1.0.tgz#0cd9827a0572c9a1795361c4d1530e53ada168cf"
|
||||
integrity sha512-SQr7qqmQ2sNijjJGHL4u7t8vyDZdZ3Ahkmo4sc1w5xI9TBX0QDdG/g4SFnxtWOsGLjwHQue57eFALfwFCnixgg==
|
||||
yargs@^17.2.1:
|
||||
version "17.2.1"
|
||||
resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.2.1.tgz#e2c95b9796a0e1f7f3bf4427863b42e0418191ea"
|
||||
integrity sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==
|
||||
dependencies:
|
||||
cliui "^7.0.2"
|
||||
escalade "^3.1.1"
|
||||
|
BIN
extras/UAC.exe
10
firebase.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"hosting": {
|
||||
"public": "docs/api",
|
||||
"ignore": [
|
||||
"firebase.json",
|
||||
"**/.*",
|
||||
"**/node_modules/**"
|
||||
]
|
||||
}
|
||||
}
|
57
package.json
@@ -7,36 +7,35 @@
|
||||
"@angular/forms": "^12.0.0",
|
||||
"@angular/platform-browser": "^12.0.0",
|
||||
"@angular/platform-browser-dynamic": "^12.0.0",
|
||||
"@fortawesome/fontawesome-free": "^5.15.4",
|
||||
"@fortawesome/fontawesome-free": "^6.0.0-beta.2",
|
||||
"@ng-bootstrap/ng-bootstrap": "^10.0.0",
|
||||
"@sentry/cli": "^1.67.2",
|
||||
"@sentry/cli": "^1.71.0",
|
||||
"@sentry/electron": "^2.5.4",
|
||||
"@tabby-gang/to-string-loader": "^1.1.7-beta.2",
|
||||
"@types/electron-config": "^3.2.2",
|
||||
"@types/deep-equal": "1.0.1",
|
||||
"deep-equal": "2.0.5",
|
||||
"@types/electron-config": "^3.2.2",
|
||||
"@types/electron-debug": "^2.1.0",
|
||||
"@types/fs-extra": "^9.0.12",
|
||||
"utils-decorators": "^1.8.3",
|
||||
"@types/js-yaml": "^4.0.2",
|
||||
"@types/js-yaml": "^4.0.4",
|
||||
"@types/node": "16.0.1",
|
||||
"@types/sortablejs": "^1.10.7",
|
||||
"@types/webpack-env": "^1.16.2",
|
||||
"@typescript-eslint/eslint-plugin": "^4.31.1",
|
||||
"@typescript-eslint/parser": "^4.28.5",
|
||||
"@typescript-eslint/eslint-plugin": "^4.33.0",
|
||||
"@typescript-eslint/parser": "^4.33.0",
|
||||
"apply-loader": "2.0.0",
|
||||
"axios": "^0.21.1",
|
||||
"clone-deep": "^4.0.1",
|
||||
"compare-versions": "^3.6.0",
|
||||
"core-js": "^3.15.2",
|
||||
"compare-versions": "^4",
|
||||
"core-js": "^3.18.2",
|
||||
"cross-env": "7.0.3",
|
||||
"css-loader": "^6.2.0",
|
||||
"electron": "13.2.2",
|
||||
"electron-builder": "22.10.5",
|
||||
"css-loader": "^6.5.1",
|
||||
"deep-equal": "2.0.5",
|
||||
"electron": "16.0.5",
|
||||
"electron-builder": "^22.14.5",
|
||||
"electron-download": "^4.1.1",
|
||||
"electron-installer-snap": "^5.1.0",
|
||||
"electron-notarize": "^1.1.1",
|
||||
"electron-rebuild": "^3.2.3",
|
||||
"electron-rebuild": "^3.2.5",
|
||||
"eslint": "^7.32.0",
|
||||
"file-loader": "^6.2.0",
|
||||
"graceful-fs": "^4.2.8",
|
||||
@@ -46,9 +45,9 @@
|
||||
"macos-release": "^3.0.1",
|
||||
"ngx-sortablejs": "^11.1.0",
|
||||
"ngx-toastr": "^14.0.0",
|
||||
"node-abi": "^3.1.0",
|
||||
"node-sass": "^6.0.1",
|
||||
"npmlog": "5.0.0",
|
||||
"node-abi": "^3.2.0",
|
||||
"node-sass": "^7.0.0",
|
||||
"npmlog": "5.0.1",
|
||||
"npx": "^10.2.2",
|
||||
"patch-package": "^6.4.7",
|
||||
"pug": "^3.0.2",
|
||||
@@ -57,31 +56,32 @@
|
||||
"pug-loader": "^2.4.0",
|
||||
"pug-static-loader": "2.0.0",
|
||||
"raw-loader": "4.0.2",
|
||||
"sass-loader": "^12.1.0",
|
||||
"shell-quote": "^1.7.2",
|
||||
"sass-loader": "^12.3.0",
|
||||
"shell-quote": "^1.7.3",
|
||||
"shelljs": "0.8.4",
|
||||
"slugify": "^1.6.0",
|
||||
"slugify": "^1.6.1",
|
||||
"sortablejs": "^1.14.0",
|
||||
"source-code-pro": "^2.38.0",
|
||||
"source-map-loader": "^3.0.0",
|
||||
"source-sans-pro": "3.6.0",
|
||||
"ssh2": "^1.4.0",
|
||||
"ssh2": "^1.5.0",
|
||||
"style-loader": "^3.2.1",
|
||||
"svg-inline-loader": "^0.8.2",
|
||||
"ts-loader": "^9.2.3",
|
||||
"tslib": "^2.3.1",
|
||||
"typedoc": "^0.22.3",
|
||||
"typedoc": "^0.22.10",
|
||||
"typescript": "^4.3.5",
|
||||
"utils-decorators": "^1.10.4",
|
||||
"val-loader": "4.0.0",
|
||||
"webpack": "^5.52.1",
|
||||
"webpack-bundle-analyzer": "^4.4.2",
|
||||
"webpack-cli": "^4.8.0",
|
||||
"webpack": "^5.64.4",
|
||||
"webpack-bundle-analyzer": "^4.5.0",
|
||||
"webpack-cli": "^4.9.1",
|
||||
"yaml-loader": "0.6.0",
|
||||
"zone.js": "^0.11.4"
|
||||
},
|
||||
"resolutions": {
|
||||
"lzma-native": "^8.0.0",
|
||||
"*/node-abi": "^2.30.0",
|
||||
"*/node-abi": "^3.5.0",
|
||||
"**/graceful-fs": "^4.2.4"
|
||||
},
|
||||
"scripts": {
|
||||
@@ -91,10 +91,9 @@
|
||||
"start": "cross-env TABBY_DEV=1 electron app --debug --inspect",
|
||||
"start:prod": "electron app --debug",
|
||||
"prod": "cross-env TABBY_DEV=1 electron app",
|
||||
"docs": "typedoc --emit --out docs/api --tsconfig tabby-core/src/tsconfig.typings.json tabby-core/src/index.ts && typedoc --emit --out docs/api/terminal --tsconfig tabby-terminal/tsconfig.typings.json tabby-terminal/src/index.ts && typedoc --emit --out docs/api/local --tsconfig tabby-local/tsconfig.typings.json tabby-local/src/index.ts && typedoc --emit --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",
|
||||
"postinstall": "node ./scripts/install-deps.js",
|
||||
"patch": "patch-package; cd web; patch-package"
|
||||
"postinstall": "patch-package && node ./scripts/install-deps.js"
|
||||
},
|
||||
"private": true
|
||||
}
|
||||
|
@@ -1,13 +0,0 @@
|
||||
diff --git a/node_modules/app-builder-lib/out/appInfo.js b/node_modules/app-builder-lib/out/appInfo.js
|
||||
index 25a159e..bfe0590 100644
|
||||
--- a/node_modules/app-builder-lib/out/appInfo.js
|
||||
+++ b/node_modules/app-builder-lib/out/appInfo.js
|
||||
@@ -165,7 +165,7 @@ class AppInfo {
|
||||
get linuxPackageName() {
|
||||
const name = this.name; // https://github.com/electron-userland/electron-builder/issues/2963
|
||||
|
||||
- return name.startsWith("@") ? this.sanitizedProductName : name;
|
||||
+ return 'tabby-terminal';
|
||||
}
|
||||
|
||||
get sanitizedName() {
|
15
patches/app-builder-lib+22.14.5.patch
Normal file
@@ -0,0 +1,15 @@
|
||||
diff --git a/node_modules/app-builder-lib/out/appInfo.js b/node_modules/app-builder-lib/out/appInfo.js
|
||||
index 363f32c..a0434a9 100644
|
||||
--- a/node_modules/app-builder-lib/out/appInfo.js
|
||||
+++ b/node_modules/app-builder-lib/out/appInfo.js
|
||||
@@ -100,9 +100,7 @@ class AppInfo {
|
||||
return this.info.metadata.name;
|
||||
}
|
||||
get linuxPackageName() {
|
||||
- const name = this.name;
|
||||
- // https://github.com/electron-userland/electron-builder/issues/2963
|
||||
- return name.startsWith("@") ? this.sanitizedProductName : name;
|
||||
+ return 'tabby-terminal'
|
||||
}
|
||||
get sanitizedName() {
|
||||
return filename_1.sanitizeFileName(this.name);
|
9
scripts/build-docs.js
Executable 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`)
|
||||
})
|
@@ -18,6 +18,7 @@ sh.cd('..')
|
||||
|
||||
sh.cd('web')
|
||||
sh.exec(`${npx} yarn install --force`)
|
||||
sh.exec(`${npx} patch-package`)
|
||||
sh.cd('..')
|
||||
|
||||
vars.allPackages.forEach(plugin => {
|
||||
|
@@ -2,11 +2,12 @@
|
||||
const sh = require('shelljs')
|
||||
const vars = require('./vars')
|
||||
const log = require('npmlog')
|
||||
const { execSync } = require('child_process')
|
||||
|
||||
vars.allPackages.forEach(plugin => {
|
||||
log.info('bump', plugin)
|
||||
sh.cd(plugin)
|
||||
sh.exec('npm --no-git-tag-version version ' + vars.version)
|
||||
sh.exec('npm publish')
|
||||
execSync('npm publish', { stdio: 'inherit' })
|
||||
sh.cd('..')
|
||||
})
|
||||
|
@@ -25,6 +25,14 @@ exports.builtinPlugins = [
|
||||
'tabby-electron',
|
||||
'tabby-local',
|
||||
'tabby-plugin-manager',
|
||||
'tabby-linkifier',
|
||||
]
|
||||
|
||||
exports.packagesWithDocs = [
|
||||
['.', 'tabby-core'],
|
||||
['terminal', 'tabby-terminal'],
|
||||
['local', 'tabby-local'],
|
||||
['settings', 'tabby-settings'],
|
||||
]
|
||||
|
||||
exports.allPackages = [
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "tabby-community-color-schemes",
|
||||
"version": "1.0.156",
|
||||
"version": "1.0.165-nightly.0",
|
||||
"description": "Community color schemes for Tabby",
|
||||
"keywords": [
|
||||
"tabby-builtin-plugin"
|
||||
|
@@ -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
|
||||
* toolbar UI
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "tabby-core",
|
||||
"version": "1.0.156",
|
||||
"version": "1.0.165-nightly.0",
|
||||
"description": "Tabby core",
|
||||
"keywords": [
|
||||
"tabby-builtin-plugin"
|
||||
@@ -17,10 +17,8 @@
|
||||
"author": "Eugene Pankov",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@types/js-yaml": "^4.0.0",
|
||||
"bootstrap": "^4.1.3",
|
||||
"deepmerge": "^4.1.1",
|
||||
"electron-updater": "^4.0.6",
|
||||
"js-yaml": "^4.0.0",
|
||||
"mixpanel": "^0.13.0",
|
||||
"ngx-filesize": "^2.0.16",
|
||||
|
@@ -1,7 +1,7 @@
|
||||
export { BaseComponent, SubscriptionContainer } from '../components/base.component'
|
||||
export { BaseTabComponent, BaseTabProcess } from '../components/baseTab.component'
|
||||
export { TabHeaderComponent } from '../components/tabHeader.component'
|
||||
export { SplitTabComponent, SplitContainer } from '../components/splitTab.component'
|
||||
export { SplitTabComponent, SplitContainer, SplitDirection, SplitOrientation } from '../components/splitTab.component'
|
||||
export { TabRecoveryProvider, RecoveryToken } from './tabRecovery'
|
||||
export { ToolbarButtonProvider, ToolbarButton } from './toolbarButtonProvider'
|
||||
export { ConfigProvider } from './configProvider'
|
||||
@@ -25,13 +25,14 @@ export { DockingService, Screen } from '../services/docking.service'
|
||||
export { Logger, ConsoleLogger, LogService } from '../services/log.service'
|
||||
export { HomeBaseService } from '../services/homeBase.service'
|
||||
export { HotkeysService } from '../services/hotkeys.service'
|
||||
export { KeyEventData, KeyName, Keystroke } from '../services/hotkeys.util'
|
||||
export { KeyEventData, KeyName, Keystroke, altKeyName, metaKeyName } from '../services/hotkeys.util'
|
||||
export { NotificationsService } from '../services/notifications.service'
|
||||
export { ThemesService } from '../services/themes.service'
|
||||
export { ProfilesService } from '../services/profiles.service'
|
||||
export { SelectorService } from '../services/selector.service'
|
||||
export { TabRecoveryService } from '../services/tabRecovery.service'
|
||||
export { TabsService, NewTabParameters, TabComponentType } from '../services/tabs.service'
|
||||
export { UpdaterService } from '../services/updater.service'
|
||||
export { VaultService, Vault, VaultSecret, VaultFileSecret, VAULT_SECRET_TYPE_FILE } from '../services/vault.service'
|
||||
export { VaultService, Vault, VaultSecret, VaultFileSecret, VAULT_SECRET_TYPE_FILE, StoredVault, VaultSecretKey } from '../services/vault.service'
|
||||
export { FileProvidersService } from '../services/fileProviders.service'
|
||||
export * from '../utils'
|
||||
|
@@ -16,7 +16,7 @@ export interface PluginInfo {
|
||||
export interface BootstrapData {
|
||||
config: Record<string, any>
|
||||
executable: string
|
||||
isFirstWindow: boolean
|
||||
isMainWindow: boolean
|
||||
windowID: number
|
||||
installedPlugins: PluginInfo[]
|
||||
userPluginsPath: string
|
||||
|
@@ -48,6 +48,9 @@ export abstract class FileTransfer {
|
||||
}
|
||||
|
||||
protected increaseProgress (bytes: number): void {
|
||||
if (!bytes) {
|
||||
return
|
||||
}
|
||||
this.completedBytes += bytes
|
||||
this.lastChunkSpeed = bytes * 1000 / (Date.now() - this.lastChunkStartTime)
|
||||
this.lastChunkStartTime = Date.now()
|
||||
|
@@ -44,7 +44,7 @@ export abstract class ProfileProvider<P extends Profile> {
|
||||
|
||||
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 {
|
||||
return null
|
||||
|
@@ -35,7 +35,7 @@ export class ButtonProvider extends ToolbarButtonProvider {
|
||||
icon: this.hostApp.platform === Platform.Web
|
||||
? require('./icons/plus.svg')
|
||||
: require('./icons/profiles.svg'),
|
||||
title: 'New tab with profile',
|
||||
title: 'Profiles and connections',
|
||||
click: () => this.activate(),
|
||||
},
|
||||
...this.profilesService.getRecentProfiles().map(profile => ({
|
||||
|
@@ -1,5 +1,6 @@
|
||||
title-bar(
|
||||
*ngIf='ready && !hostWindow.isFullscreen && config.store.appearance.frame == "full" && config.store.appearance.dock == "off"',
|
||||
(dblclick)='hostWindow.toggleMaximize()',
|
||||
[class.inset]='hostApp.platform == Platform.macOS && !hostWindow.isFullscreen'
|
||||
)
|
||||
|
||||
@@ -8,7 +9,7 @@ title-bar(
|
||||
[class.tabs-on-top]='config.store.appearance.tabsLocation == "top" || config.store.appearance.tabsLocation == "left"',
|
||||
[class.tabs-on-side]='hasVerticalTabs()',
|
||||
)
|
||||
.tab-bar
|
||||
.tab-bar((dblclick)='hostWindow.toggleMaximize()')
|
||||
.inset.background(*ngIf='hostApp.platform == Platform.macOS \
|
||||
&& !hostWindow.isFullscreen \
|
||||
&& config.store.appearance.frame == "thin" \
|
||||
@@ -56,15 +57,20 @@ title-bar(
|
||||
div([class.ml-3]='hasIcons(button.submenuItems)') {{item.title}}
|
||||
|
||||
.d-flex(
|
||||
*ngIf='activeTransfers.length > 0',
|
||||
ngbDropdown,
|
||||
[(open)]='activeTransfersDropdownOpen'
|
||||
container='body',
|
||||
#activeTransfersDropdown='ngbDropdown'
|
||||
)
|
||||
button.btn.btn-secondary.btn-tab-bar(
|
||||
*ngIf='activeTransfers.length > 0',
|
||||
title='File transfers',
|
||||
ngbDropdownToggle
|
||||
) !{require('../icons/download-solid.svg')}
|
||||
transfers-menu(ngbDropdownMenu, [(transfers)]='activeTransfers')
|
||||
) !{require('../icons/transfers.svg')}
|
||||
transfers-menu(
|
||||
ngbDropdownMenu,
|
||||
[(transfers)]='activeTransfers',
|
||||
(transfersChange)='onTransfersChange()'
|
||||
)
|
||||
|
||||
.drag-space.background([class.persistent]='config.store.appearance.frame == "thin" && hostApp.platform != Platform.macOS')
|
||||
|
||||
|
@@ -6,7 +6,6 @@
|
||||
overflow: hidden;
|
||||
user-select: none;
|
||||
-webkit-user-drag: none;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
will-change: transform;
|
||||
cursor: default;
|
||||
animation: 0.5s ease-out fadeIn;
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||
import { Component, Inject, Input, HostListener, HostBinding, ViewChildren } from '@angular/core'
|
||||
import { Component, Inject, Input, HostListener, HostBinding, ViewChildren, ViewChild } from '@angular/core'
|
||||
import { trigger, style, animate, transition, state } from '@angular/animations'
|
||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
||||
import { NgbDropdown, NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
||||
import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'
|
||||
|
||||
import { HostAppService, Platform } from '../api/hostApp'
|
||||
@@ -60,10 +60,10 @@ export class AppRootComponent {
|
||||
@HostBinding('class.platform-linux') platformClassLinux = process.platform === 'linux'
|
||||
@HostBinding('class.no-tabs') noTabs = true
|
||||
@ViewChildren(TabBodyComponent) tabBodies: TabBodyComponent[]
|
||||
@ViewChild('activeTransfersDropdown') activeTransfersDropdown: NgbDropdown
|
||||
unsortedTabs: BaseTabComponent[] = []
|
||||
updatesAvailable = false
|
||||
activeTransfers: FileTransfer[] = []
|
||||
activeTransfersDropdownOpen = false
|
||||
private logger: Logger
|
||||
|
||||
constructor (
|
||||
@@ -108,10 +108,13 @@ export class AppRootComponent {
|
||||
if (hotkey === 'move-tab-right') {
|
||||
this.app.moveSelectedTabRight()
|
||||
}
|
||||
if (hotkey === 'reopen-tab') {
|
||||
this.app.reopenLastTab()
|
||||
if (hotkey === 'duplicate-tab') {
|
||||
this.app.duplicateTab(this.app.activeTab)
|
||||
}
|
||||
}
|
||||
if (hotkey === 'reopen-tab') {
|
||||
this.app.reopenLastTab()
|
||||
}
|
||||
if (hotkey === 'toggle-fullscreen') {
|
||||
hostWindow.toggleFullscreen()
|
||||
}
|
||||
@@ -144,7 +147,7 @@ export class AppRootComponent {
|
||||
|
||||
platform.fileTransferStarted$.subscribe(transfer => {
|
||||
this.activeTransfers.push(transfer)
|
||||
this.activeTransfersDropdownOpen = true
|
||||
this.activeTransfersDropdown.open()
|
||||
})
|
||||
|
||||
config.ready$.toPromise().then(() => {
|
||||
@@ -197,6 +200,12 @@ export class AppRootComponent {
|
||||
this.app.emitTabsChanged()
|
||||
}
|
||||
|
||||
onTransfersChange () {
|
||||
if (this.activeTransfers.length === 0) {
|
||||
this.activeTransfersDropdown.close()
|
||||
}
|
||||
}
|
||||
|
||||
private getToolbarButtons (aboveZero: boolean): ToolbarButton[] {
|
||||
let buttons: ToolbarButton[] = []
|
||||
this.config.enabledServices(this.toolbarButtonProviders).forEach(provider => {
|
||||
|
@@ -29,3 +29,4 @@
|
||||
)
|
||||
.title.mr-2 {{getOptionText(option)}}
|
||||
.description.no-wrap.text-muted {{option.description}}
|
||||
.no-wrap.badge.badge-secondary.text-muted.ml-auto(*ngIf='selectedIndex == i') Enter
|
||||
|
@@ -7,11 +7,17 @@
|
||||
overflow: auto;
|
||||
border-top-left-radius: 0;
|
||||
border-top-right-radius: 0;
|
||||
padding: 10px 15px;
|
||||
}
|
||||
|
||||
.group-header {
|
||||
padding: 0 1rem;
|
||||
margin: 20px 0 10px;
|
||||
margin: 15px 0 10px;
|
||||
font-weight: bold;
|
||||
|
||||
&:first-child {
|
||||
margin-top: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.icon {
|
||||
@@ -30,4 +36,5 @@
|
||||
|
||||
input {
|
||||
border-radius: 0;
|
||||
border: none;
|
||||
}
|
||||
|
@@ -29,9 +29,11 @@ export class SelectorModalComponent<T> {
|
||||
@HostListener('keyup', ['$event']) onKeyUp (event: KeyboardEvent): void {
|
||||
if (event.key === 'ArrowUp') {
|
||||
this.selectedIndex--
|
||||
event.preventDefault()
|
||||
}
|
||||
if (event.key === 'ArrowDown') {
|
||||
this.selectedIndex++
|
||||
event.preventDefault()
|
||||
}
|
||||
if (event.key === 'Enter') {
|
||||
this.selectOption(this.filteredOptions[this.selectedIndex])
|
||||
|
@@ -306,6 +306,7 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
async ngAfterViewInit (): Promise<void> {
|
||||
if (this._recoveredState) {
|
||||
await this.recoverContainer(this.root, this._recoveredState, this._recoveredState.duplicate)
|
||||
this.updateTitle()
|
||||
this.layout()
|
||||
setTimeout(() => {
|
||||
if (this.hasFocus) {
|
||||
|
@@ -3,7 +3,7 @@ div
|
||||
h1.tabby-title Tabby
|
||||
sup α
|
||||
|
||||
.list-group.list-group-light.mb-4
|
||||
.list-group.mb-4
|
||||
a.list-group-item.list-group-item-action.d-flex(
|
||||
*ngFor='let button of getButtons(); trackBy: buttonsTrackBy',
|
||||
(click)='button.click()',
|
||||
|
@@ -88,8 +88,9 @@ export class TabHeaderComponent extends BaseComponent {
|
||||
return this.config.store.appearance.flexTabs
|
||||
}
|
||||
|
||||
@HostListener('dblclick') onDoubleClick (): void {
|
||||
@HostListener('dblclick', ['$event']) onDoubleClick ($event: MouseEvent): void {
|
||||
this.showRenameTabModal()
|
||||
$event.stopPropagation()
|
||||
}
|
||||
|
||||
@HostListener('mousedown', ['$event']) async onMouseDown ($event: MouseEvent) {
|
||||
|
@@ -51,3 +51,7 @@
|
||||
button {
|
||||
flex: none;
|
||||
}
|
||||
|
||||
svg {
|
||||
height: 14px;
|
||||
}
|
||||
|
@@ -3,7 +3,7 @@
|
||||
h3.m-0 Vault is locked
|
||||
.ml-auto(ngbDropdown, placement='bottom-right')
|
||||
button.btn.btn-link(ngbDropdownToggle, (click)='$event.stopPropagation()')
|
||||
span(*ngIf='rememberFor') Remember for {{rememberFor}} min
|
||||
span(*ngIf='rememberFor') Remember for {{getRememberForDisplay(rememberFor)}}
|
||||
span(*ngIf='!rememberFor') Do not remember
|
||||
div(ngbDropdownMenu)
|
||||
button.dropdown-item(
|
||||
@@ -12,7 +12,7 @@
|
||||
button.dropdown-item(
|
||||
*ngFor='let x of rememberOptions',
|
||||
(click)='rememberFor = x',
|
||||
) {{x}} min
|
||||
) {{getRememberForDisplay(x)}}
|
||||
|
||||
.input-group
|
||||
input.form-control.form-control-lg(
|
||||
|
@@ -8,7 +8,7 @@ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
|
||||
export class UnlockVaultModalComponent {
|
||||
passphrase: string
|
||||
rememberFor = 1
|
||||
rememberOptions = [1, 5, 15, 60]
|
||||
rememberOptions = [1, 5, 15, 60, 1440, 10080]
|
||||
@ViewChild('input') input: ElementRef
|
||||
|
||||
constructor (
|
||||
@@ -33,4 +33,14 @@ export class UnlockVaultModalComponent {
|
||||
cancel (): void {
|
||||
this.modalInstance.close(null)
|
||||
}
|
||||
|
||||
getRememberForDisplay (rememberOption: number): string {
|
||||
if (rememberOption >= 1440) {
|
||||
return `${Math.round(rememberOption/1440*10)/10} day`
|
||||
} else if (rememberOption >= 60) {
|
||||
return `${Math.round(rememberOption/60*10)/10} hour`
|
||||
} else {
|
||||
return `${rememberOption} min`
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -13,6 +13,7 @@ button {
|
||||
line-height: 0;
|
||||
text-align: center;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
&:not(:hover):not(:active) {
|
||||
background: transparent;
|
||||
@@ -21,4 +22,9 @@ button {
|
||||
&:focus {
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
svg {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
}
|
||||
}
|
||||
|
@@ -20,6 +20,7 @@ hotkeys:
|
||||
- 'Ctrl-Shift-PageDown'
|
||||
rearrange-panes:
|
||||
- 'Ctrl-Shift'
|
||||
duplicate-tab: []
|
||||
tab-1:
|
||||
- 'Alt-1'
|
||||
tab-2:
|
||||
@@ -75,4 +76,3 @@ hotkeys:
|
||||
- 'Ctrl-Alt-T'
|
||||
profile-selector:
|
||||
- 'Ctrl-Shift-T'
|
||||
pluginBlacklist: ['ssh']
|
||||
|
@@ -38,6 +38,7 @@ hotkeys:
|
||||
- '⌘-9'
|
||||
tab-10:
|
||||
- '⌘-0'
|
||||
duplicate-tab: []
|
||||
tab-11: []
|
||||
tab-12: []
|
||||
tab-13: []
|
||||
@@ -74,4 +75,3 @@ hotkeys:
|
||||
- '⌘-E'
|
||||
switch-profile:
|
||||
- '⌘-Shift-E'
|
||||
pluginBlacklist: ['ssh']
|
||||
|
@@ -21,6 +21,7 @@ hotkeys:
|
||||
- 'Ctrl-Shift-PageDown'
|
||||
rearrange-panes:
|
||||
- 'Ctrl-Shift'
|
||||
duplicate-tab: []
|
||||
tab-1:
|
||||
- 'Alt-1'
|
||||
tab-2:
|
||||
@@ -76,4 +77,3 @@ hotkeys:
|
||||
- 'Ctrl-Alt-T'
|
||||
profile-selector:
|
||||
- 'Ctrl-Shift-T'
|
||||
pluginBlacklist: []
|
||||
|
@@ -12,7 +12,7 @@ appearance:
|
||||
frame: thin
|
||||
css: '/* * { color: blue !important; } */'
|
||||
opacity: 1.0
|
||||
vibrancy: true
|
||||
vibrancy: false
|
||||
vibrancyType: 'blur'
|
||||
terminal:
|
||||
showBuiltinProfiles: true
|
||||
@@ -35,3 +35,6 @@ version: 1
|
||||
vault: null
|
||||
encrypted: false
|
||||
enableExperimentalFeatures: false
|
||||
pluginBlacklist: []
|
||||
hacks:
|
||||
disableGPU: false
|
||||
|
@@ -51,6 +51,10 @@ export class AppHotkeyProvider extends HotkeyProvider {
|
||||
id: 'rearrange-panes',
|
||||
name: 'Show pane labels (for rearranging)',
|
||||
},
|
||||
{
|
||||
id: 'duplicate-tab',
|
||||
name: 'Duplicate tab',
|
||||
},
|
||||
{
|
||||
id: 'tab-1',
|
||||
name: 'Tab 1',
|
||||
@@ -205,6 +209,6 @@ export class AppHotkeyProvider extends HotkeyProvider {
|
||||
}
|
||||
|
||||
static getProfileHotkeyName (profile: PartialProfile<Profile>): string {
|
||||
return profile.id!.replace(/\./g, '-')
|
||||
return (profile.id ?? profile.name).replace(/\./g, '-')
|
||||
}
|
||||
}
|
||||
|
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M216 0h80c13.3 0 24 10.7 24 24v168h87.7c17.8 0 26.7 21.5 14.1 34.1L269.7 378.3c-7.5 7.5-19.8 7.5-27.3 0L90.1 226.1c-12.6-12.6-3.7-34.1 14.1-34.1H192V24c0-13.3 10.7-24 24-24zm296 376v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h146.7l49 49c20.1 20.1 52.5 20.1 72.6 0l49-49H488c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z"></path></svg>
|
Before Width: | Height: | Size: 529 B |
@@ -1 +1 @@
|
||||
<svg aria-hidden="true" focusable="false" data-prefix="fad" data-icon="download" class="svg-inline--fa fa-download fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><g class="fa-group"><path class="fa-secondary" fill="currentColor" d="M320 24v168h87.7c17.8 0 26.7 21.5 14.1 34.1L269.7 378.3a19.37 19.37 0 0 1-27.3 0L90.1 226.1c-12.6-12.6-3.7-34.1 14.1-34.1H192V24a23.94 23.94 0 0 1 24-24h80a23.94 23.94 0 0 1 24 24z" opacity="0.4"></path><path class="fa-primary" fill="currentColor" d="M488 352H341.3l-49 49a51.24 51.24 0 0 1-72.6 0l-49-49H24a23.94 23.94 0 0 0-24 24v112a23.94 23.94 0 0 0 24 24h464a23.94 23.94 0 0 0 24-24V376a23.94 23.94 0 0 0-24-24zm-120 96a16 16 0 1 1 16-16 16 16 0 0 1-16 16zm64 0a16 16 0 1 1 16-16 16 16 0 0 1-16 16z"></path></g></svg>
|
||||
<svg aria-hidden="true" focusable="false" data-prefix="fal" data-icon="arrow-down-to-square" class="svg-inline--fa fa-arrow-down-to-square" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M432 128h-64C359.2 128 352 135.2 352 144S359.2 160 368 160h64C440.8 160 448 167.2 448 176v288c0 8.812-7.188 16-16 16h-352C71.19 480 64 472.8 64 464v-288C64 167.2 71.19 160 80 160h64C152.8 160 160 152.8 160 144S152.8 128 144 128h-64C53.53 128 32 149.5 32 176v288C32 490.5 53.53 512 80 512h352c26.47 0 48-21.53 48-48v-288C480 149.5 458.5 128 432 128zM148.7 260.7c-6.25 6.25-6.25 16.38 0 22.62l96 96C247.8 382.4 251.9 384 256 384s8.188-1.562 11.31-4.688l96-96c6.25-6.25 6.25-16.38 0-22.62s-16.38-6.25-22.62 0L272 329.4V16C272 7.156 264.8 0 256 0S240 7.156 240 16v313.4L171.3 260.7C165.1 254.4 154.9 254.4 148.7 260.7z"></path></svg>
|
||||
|
Before Width: | Height: | Size: 784 B After Width: | Height: | Size: 867 B |
@@ -1 +1 @@
|
||||
<svg aria-hidden="true" focusable="false" data-prefix="far" data-icon="history" class="svg-inline--fa fa-history fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="#fff" d="M504 255.532c.252 136.64-111.182 248.372-247.822 248.468-64.014.045-122.373-24.163-166.394-63.942-5.097-4.606-5.3-12.543-.443-17.4l16.96-16.96c4.529-4.529 11.776-4.659 16.555-.395C158.208 436.843 204.848 456 256 456c110.549 0 200-89.468 200-200 0-110.549-89.468-200-200-200-55.52 0-105.708 22.574-141.923 59.043l49.091 48.413c7.641 7.535 2.305 20.544-8.426 20.544H26.412c-6.627 0-12-5.373-12-12V45.443c0-10.651 12.843-16.023 20.426-8.544l45.097 44.474C124.866 36.067 187.15 8 256 8c136.811 0 247.747 110.781 248 247.532zm-167.058 90.173l14.116-19.409c3.898-5.36 2.713-12.865-2.647-16.763L280 259.778V116c0-6.627-5.373-12-12-12h-24c-6.627 0-12 5.373-12 12v168.222l88.179 64.13c5.36 3.897 12.865 2.712 16.763-2.647z"></path></svg>
|
||||
<svg aria-hidden="true" focusable="false" data-prefix="fal" data-icon="clock-rotate-left" class="svg-inline--fa fa-clock-rotate-left" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C172.2 512 97.87 471.8 51.19 409.6C45.88 402.5 47.31 392.5 54.37 387.2C61.44 381.9 71.47 383.3 76.78 390.4C117.7 444.8 182.7 480 256 480C379.7 480 480 379.7 480 256C480 132.3 379.7 32 256 32C166.7 32 89.51 84.3 53.55 160H144C152.8 160 160 167.2 160 176C160 184.8 152.8 192 144 192H16C7.164 192 0 184.8 0 176V48C0 39.16 7.164 32 16 32C24.84 32 32 39.16 32 48V131.1C75.66 53.29 159.6 0 256 0zM256 128C264.8 128 272 135.2 272 144V249.4L347.3 324.7C353.6 330.9 353.6 341.1 347.3 347.3C341.1 353.6 330.9 353.6 324.7 347.3L244.7 267.3C241.7 264.3 239.1 260.2 239.1 256V144C239.1 135.2 247.2 128 255.1 128H256z"></path></svg>
|
||||
|
Before Width: | Height: | Size: 940 B After Width: | Height: | Size: 910 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="svg-inline--fa fa-plus fa-w-12 fa-3x" data-icon="plus" data-prefix="fal" focusable="false" role="img" viewBox="0 0 384 512"><path fill="#fff" stroke="none" stroke-width="1" d="M376 232H216V72c0-4.42-3.58-8-8-8h-32c-4.42 0-8 3.58-8 8v160H8c-4.42 0-8 3.58-8 8v32c0 4.42 3.58 8 8 8h160v160c0 4.42 3.58 8 8 8h32c4.42 0 8-3.58 8-8V280h160c4.42 0 8-3.58 8-8v-32c0-4.42-3.58-8-8-8z"/></svg>
|
||||
<svg aria-hidden="true" focusable="false" data-prefix="fal" data-icon="plus" class="svg-inline--fa fa-plus" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M432 256C432 264.8 424.8 272 416 272h-176V448c0 8.844-7.156 16.01-16 16.01S208 456.8 208 448V272H32c-8.844 0-16-7.15-16-15.99C16 247.2 23.16 240 32 240h176V64c0-8.844 7.156-15.99 16-15.99S240 55.16 240 64v176H416C424.8 240 432 247.2 432 256z"></path></svg>
|
||||
|
Before Width: | Height: | Size: 449 B After Width: | Height: | Size: 462 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="svg-inline--fa fa-window-restore fa-w-16 fa-3x" data-icon="window-restore" data-prefix="fal" focusable="false" role="img" viewBox="0 0 512 512"><path fill="#fff" stroke="none" stroke-width="1" d="M464 0H144c-26.5 0-48 21.5-48 48v48H48c-26.5 0-48 21.5-48 48v320c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h48c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zM32 144c0-8.8 7.2-16 16-16h320c8.8 0 16 7.2 16 16v80H32v-80zm352 320c0 8.8-7.2 16-16 16H48c-8.8 0-16-7.2-16-16V256h352v208zm96-96c0 8.8-7.2 16-16 16h-48V144c0-26.5-21.5-48-48-48H128V48c0-8.8 7.2-16 16-16h320c8.8 0 16 7.2 16 16v320z"/></svg>
|
||||
<svg aria-hidden="true" focusable="false" data-prefix="fal" data-icon="browsers" class="svg-inline--fa fa-browsers" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path fill="currentColor" d="M464 480H96c-35.35 0-64-28.65-64-64V112C32 103.2 24.84 96 16 96S0 103.2 0 112V416c0 53.02 42.98 96 96 96h368c8.836 0 16-7.164 16-16S472.8 480 464 480zM512 0H160C124.7 0 96 28.65 96 64v288c0 35.35 28.65 64 64 64h352c35.35 0 64-28.65 64-64V64C576 28.65 547.3 0 512 0zM128 64c0-17.67 14.33-32 32-32h64v64H128V64zM544 352c0 17.67-14.33 32-32 32H160c-17.67 0-32-14.33-32-32V128h416V352zM544 96H256V32h256c17.67 0 32 14.33 32 32V96z"></path></svg>
|
||||
|
Before Width: | Height: | Size: 665 B After Width: | Height: | Size: 655 B |
1
tabby-core/src/icons/transfers.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg aria-hidden="true" focusable="false" data-prefix="fal" data-icon="down-to-dotted-line" class="svg-inline--fa fa-down-to-dotted-line" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M364.1 246.6L253.9 370.6C237.1 388.5 210 388.5 194.1 370.6L83.92 246.6C60.99 220.8 79.3 180 113.8 180H160V76.04C160 53.95 177.9 36.04 200 36.04H248C270.1 36.04 288 53.95 288 76.04V180H334.2C368.7 180 387 220.8 364.1 246.6zM113.8 212C106.9 212 103.3 220.2 107.8 225.4L218 349.3C221.2 352.9 226.8 352.9 229.1 349.3L340.2 225.4C344.8 220.2 341.1 212 334.2 212H256V76.04C256 71.62 252.4 68.04 248 68.04H200C195.6 68.04 192 71.62 192 76.04V212H113.8zM392 448C392 434.8 402.7 424 416 424C429.3 424 440 434.8 440 448C440 461.3 429.3 472 416 472C402.7 472 392 461.3 392 448zM56 448C56 461.3 45.25 472 32 472C18.75 472 8 461.3 8 448C8 434.7 18.75 424 32 424C45.25 424 56 434.7 56 448zM104 448C104 434.7 114.7 424 128 424C141.3 424 152 434.7 152 448C152 461.3 141.3 472 128 472C114.7 472 104 461.3 104 448zM248 448C248 461.3 237.3 472 224 472C210.7 472 200 461.3 200 448C200 434.7 210.7 424 224 424C237.3 424 248 434.7 248 448zM296 448C296 434.7 306.7 424 320 424C333.3 424 344 434.7 344 448C344 461.3 333.3 472 320 472C306.7 472 296 461.3 296 448z"></path></svg>
|
After Width: | Height: | Size: 1.3 KiB |
@@ -1 +1 @@
|
||||
<svg aria-hidden="true" focusable="false" data-prefix="fad" data-icon="upload" class="svg-inline--fa fa-upload fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><g class="fa-group"><path class="fa-secondary" fill="currentColor" d="M488 351.92H352v8a56 56 0 0 1-56 56h-80a56 56 0 0 1-56-56v-8H24a23.94 23.94 0 0 0-24 24v112a23.94 23.94 0 0 0 24 24h464a23.94 23.94 0 0 0 24-24v-112a23.94 23.94 0 0 0-24-24zm-120 132a20 20 0 1 1 20-20 20.06 20.06 0 0 1-20 20zm64 0a20 20 0 1 1 20-20 20.06 20.06 0 0 1-20 20z" opacity="0.4"></path><path class="fa-primary" fill="currentColor" d="M192 359.93v-168h-87.7c-17.8 0-26.7-21.5-14.1-34.11L242.3 5.62a19.37 19.37 0 0 1 27.3 0l152.2 152.2c12.6 12.61 3.7 34.11-14.1 34.11H320v168a23.94 23.94 0 0 1-24 24h-80a23.94 23.94 0 0 1-24-24z"></path></g></svg>
|
||||
<svg aria-hidden="true" focusable="false" data-prefix="far" data-icon="arrow-up-from-square" class="svg-inline--fa fa-arrow-up-from-square" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M416 159.9l-8-.1648c-13.25 0-24 10.75-24 24.02c0 13.26 10.75 24.02 24 24.02H416c8.836 0 16 7.169 16 16.01v224.2c0 8.842-7.164 16.01-16 16.01H96c-8.836 0-16-7.169-16-16.01V223.8c0-8.842 7.164-16.01 16-16.01h8c13.25 0 24-10.75 24-24.02c0-13.27-10.75-24.02-24-24.02L96 159.9c-35.35 0-64 28.51-64 63.88v224.2C32 483.3 60.65 512 96 512h320c35.35 0 64-28.68 64-64.04V223.8C480 188.4 451.3 159.9 416 159.9zM160 151.8c6.47 0 12.91-2.614 17.62-7.752L232 85.08v234.8c0 13.26 10.75 24.02 24 24.02s24-10.76 24-24.02V85.08l54.38 58.95C339.1 149.2 345.5 151.7 352 151.7c13.23 0 24-10.77 24-24.05c0-5.83-2.108-11.64-6.376-16.26l-96-104.1C269.1 2.455 262.5-.0002 256-.0002S242.9 2.455 238.4 7.365l-96 104.1C138.1 116.1 135.1 121.9 135.1 127.7C135.1 141.1 146.9 151.8 160 151.8z"></path></svg>
|
||||
|
Before Width: | Height: | Size: 813 B After Width: | Height: | Size: 1014 B |
@@ -89,7 +89,7 @@ export class AppService {
|
||||
}, 30000)
|
||||
|
||||
config.ready$.toPromise().then(async () => {
|
||||
if (this.bootstrapData.isFirstWindow) {
|
||||
if (this.bootstrapData.isMainWindow) {
|
||||
if (config.store.recoverTabs) {
|
||||
const tabs = await this.tabRecovery.recoverTabs()
|
||||
for (const tab of tabs) {
|
||||
@@ -102,13 +102,6 @@ export class AppService {
|
||||
})
|
||||
|
||||
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 {
|
||||
@@ -122,7 +115,7 @@ export class AppService {
|
||||
this.tabsChanged.next()
|
||||
this.tabOpened.next(tab)
|
||||
|
||||
if (this.bootstrapData.isFirstWindow) {
|
||||
if (this.bootstrapData.isMainWindow) {
|
||||
tab.recoveryStateChangedHint$.subscribe(() => {
|
||||
this.tabRecovery.saveTabs(this.tabs)
|
||||
})
|
||||
@@ -317,6 +310,10 @@ export class AppService {
|
||||
if (checkCanClose && !await tab.canClose()) {
|
||||
return
|
||||
}
|
||||
const token = await this.tabRecovery.getFullRecoveryToken(tab)
|
||||
if (token) {
|
||||
this.closedTabsStack.push(token)
|
||||
}
|
||||
tab.destroy()
|
||||
}
|
||||
|
||||
|
@@ -27,6 +27,14 @@ export class HomeBaseService {
|
||||
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 {
|
||||
let body = `Version: ${this.appVersion}\n`
|
||||
body += `Platform: ${this.hostApp.platform} ${process.arch} ${this.platform.getOSRelease()}\n`
|
||||
|
@@ -39,6 +39,10 @@ export function getKeyName (event: KeyEventData): KeyName {
|
||||
key = altKeyName
|
||||
} else if (event.key === 'Shift') {
|
||||
key = 'Shift'
|
||||
} else if (event.key === '`') {
|
||||
key = '`'
|
||||
} else if (event.key === '~') {
|
||||
key = '~'
|
||||
} else {
|
||||
key = event.code
|
||||
if (REGEX_LATIN_KEYNAME.test(event.key)) {
|
||||
@@ -54,7 +58,6 @@ export function getKeyName (event: KeyEventData): KeyName {
|
||||
Slash: '/',
|
||||
Backslash: '\\',
|
||||
IntlBackslash: '`',
|
||||
Backquote: '~', // Electron says it's the tilde
|
||||
Minus: '-',
|
||||
Equal: '=',
|
||||
Semicolon: ';',
|
||||
|
@@ -3,7 +3,7 @@ import { promisify } from 'util'
|
||||
import { Injectable, NgZone } from '@angular/core'
|
||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
||||
import { AsyncSubject, Subject, Observable } from 'rxjs'
|
||||
import { wrapPromise } from '../utils'
|
||||
import { wrapPromise, serializeFunction } from '../utils'
|
||||
import { UnlockVaultModalComponent } from '../components/unlockVaultModal.component'
|
||||
import { NotificationsService } from './notifications.service'
|
||||
import { SelectorService } from './selector.service'
|
||||
@@ -17,7 +17,7 @@ const CRYPT_ALG = 'aes-256-cbc'
|
||||
const CRYPT_KEY_LENGTH = 256 / 8
|
||||
const CRYPT_IV_LENGTH = 128 / 8
|
||||
|
||||
interface StoredVault {
|
||||
export interface StoredVault {
|
||||
version: number
|
||||
contents: string
|
||||
keySalt: string
|
||||
@@ -114,7 +114,9 @@ export class VaultService {
|
||||
private zone: NgZone,
|
||||
private notifications: NotificationsService,
|
||||
private ngbModal: NgbModal,
|
||||
) { }
|
||||
) {
|
||||
this.getPassphrase = serializeFunction(this.getPassphrase.bind(this))
|
||||
}
|
||||
|
||||
async setEnabled (enabled: boolean, passphrase?: string): Promise<void> {
|
||||
if (enabled) {
|
||||
|
@@ -381,3 +381,8 @@ toggle {
|
||||
start-page footer {
|
||||
background: $white !important;
|
||||
}
|
||||
|
||||
.terminal-toolbar {
|
||||
background: #ffffff4a !important;
|
||||
border-bottom: 1px solid #00000026 !important;
|
||||
}
|
||||
|
@@ -223,7 +223,7 @@ hotkey-input-modal {
|
||||
}
|
||||
|
||||
.list-group-item {
|
||||
transition: 0.0625s background;
|
||||
// transition: 0.0625s background ease;
|
||||
|
||||
i + * {
|
||||
margin-left: 10px;
|
||||
@@ -232,7 +232,7 @@ hotkey-input-modal {
|
||||
|
||||
.list-group.list-group-flush .list-group-item {
|
||||
background: transparent;
|
||||
border-color: rgba(0, 0, 0, 0.2);
|
||||
border: none;
|
||||
|
||||
&:not(:last-child) {
|
||||
border-bottom: none;
|
||||
@@ -247,11 +247,16 @@ hotkey-input-modal {
|
||||
|
||||
.list-group-light {
|
||||
.list-group-item {
|
||||
border: none;
|
||||
border: none !important;
|
||||
outline: none !important;
|
||||
background: transparent;
|
||||
border-radius: $border-radius;
|
||||
margin: 0 !important;
|
||||
|
||||
&.list-group-item-action {
|
||||
&:hover, &.active {
|
||||
background: $list-group-hover-bg;
|
||||
background: $component-active-bg;
|
||||
color: $component-active-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -291,7 +296,7 @@ checkbox i.on {
|
||||
}
|
||||
|
||||
search-panel {
|
||||
background: rgba(39, 49, 60, 0.95) !important;
|
||||
background: #131d27 !important;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -78,11 +78,11 @@ $link-color: $gray-400;
|
||||
$link-hover-color: $white;
|
||||
$link-hover-decoration: none;
|
||||
|
||||
$component-active-color: $white;
|
||||
$component-active-bg: #2f3a42;
|
||||
$component-active-color: #4fadff;
|
||||
$component-active-bg: #0059a559;
|
||||
|
||||
$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-x: 1rem;
|
||||
@@ -197,3 +197,7 @@ $progress-height: 3px;
|
||||
$alert-bg-level: 9;
|
||||
$alert-border-level: 5;
|
||||
$alert-color-level: -5;
|
||||
|
||||
$text-muted: rgba(255, 255, 255, 0.5);
|
||||
|
||||
$card-bg: $list-group-bg;
|
||||
|
@@ -64,3 +64,12 @@ export const TAB_COLORS = [
|
||||
{ name: 'Red', value: '#d9534f' },
|
||||
{ name: 'Yellow', value: '#ffd500' },
|
||||
]
|
||||
|
||||
export function serializeFunction <T extends () => Promise<any>> (fn: T): T {
|
||||
let queue = Promise.resolve()
|
||||
return ((...args) => {
|
||||
const res = queue.then(() => fn(...args))
|
||||
queue = res.catch(() => null)
|
||||
return res
|
||||
}) as T
|
||||
}
|
||||
|
@@ -2,16 +2,6 @@
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@types/js-yaml@^4.0.0":
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.2.tgz#4117a7a378593a218e9d6f0ef44ce6d5d9edf7fa"
|
||||
integrity sha512-KbeHS/Y4R+k+5sWXEYzAZKuB1yQlZtEghuhRxrVRLaqhtoG5+26JwQsa4HyS3AWX8v1Uwukma5HheduUDskasA==
|
||||
|
||||
"@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:
|
||||
version "6.0.2"
|
||||
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
|
||||
@@ -29,14 +19,6 @@ bootstrap@^4.1.3:
|
||||
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.3.tgz#c6a72b355aaf323920be800246a6e4ef30997fe6"
|
||||
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:
|
||||
version "4.3.1"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
|
||||
@@ -44,51 +26,16 @@ debug@4:
|
||||
dependencies:
|
||||
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:
|
||||
version "4.2.2"
|
||||
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
|
||||
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":
|
||||
version "6.3.0"
|
||||
resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.3.0.tgz#dff53cfb3f104c9e422f346d53be8dbcc971bf11"
|
||||
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:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
|
||||
@@ -102,44 +49,13 @@ inherits@^2.0.3:
|
||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
|
||||
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
|
||||
dependencies:
|
||||
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:
|
||||
version "0.13.0"
|
||||
resolved "https://registry.yarnpkg.com/mixpanel/-/mixpanel-0.13.0.tgz#699bf510d9ba013c75edcf979ff1e24085fde9d2"
|
||||
@@ -193,18 +109,6 @@ safe-buffer@~5.2.0:
|
||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
|
||||
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:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
|
||||
@@ -217,11 +121,6 @@ tslib@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a"
|
||||
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:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
||||
@@ -231,8 +130,3 @@ uuid@^8.0.0:
|
||||
version "8.3.2"
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
|
||||
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==
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "tabby-electron",
|
||||
"version": "1.0.156",
|
||||
"version": "1.0.165-nightly.0",
|
||||
"description": "Electron-specific bindings",
|
||||
"keywords": [
|
||||
"tabby-builtin-plugin"
|
||||
|
@@ -59,10 +59,10 @@ export default class ElectronModule {
|
||||
|
||||
themeService.themeChanged$.subscribe(theme => {
|
||||
if (hostApp.platform === Platform.macOS) {
|
||||
hostWindow.getWindow().setTrafficLightPosition({
|
||||
x: theme.macOSWindowButtonsInsetX ?? 14,
|
||||
y: theme.macOSWindowButtonsInsetY ?? 11,
|
||||
})
|
||||
hostWindow.setTrafficLightPosition(
|
||||
theme.macOSWindowButtonsInsetX ?? 14,
|
||||
theme.macOSWindowButtonsInsetY ?? 11,
|
||||
)
|
||||
}
|
||||
})
|
||||
|
||||
@@ -73,9 +73,9 @@ export default class ElectronModule {
|
||||
return
|
||||
}
|
||||
if (progress !== null) {
|
||||
hostWindow.getWindow().setProgressBar(progress / 100.0, { mode: 'normal' })
|
||||
hostWindow.setProgressBar(progress / 100.0)
|
||||
} else {
|
||||
hostWindow.getWindow().setProgressBar(-1, { mode: 'none' })
|
||||
hostWindow.setProgressBar(-1)
|
||||
}
|
||||
lastProgress = progress
|
||||
})
|
||||
@@ -116,7 +116,7 @@ export default class ElectronModule {
|
||||
document.body.classList.toggle('vibrant', this.config.store.appearance.vibrancy)
|
||||
this.electron.ipcRenderer.send('window-set-vibrancy', this.config.store.appearance.vibrancy, vibrancyType)
|
||||
|
||||
this.hostWindow.getWindow().setOpacity(this.config.store.appearance.opacity)
|
||||
this.hostWindow.setOpacity(this.config.store.appearance.opacity)
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
import { Injectable, NgZone } from '@angular/core'
|
||||
import { Injectable, NgZone, Inject } from '@angular/core'
|
||||
import type { Display } from 'electron'
|
||||
import { ConfigService, DockingService, Screen, PlatformService } from 'tabby-core'
|
||||
import { ConfigService, DockingService, Screen, PlatformService, BootstrapData, BOOTSTRAP_DATA } from 'tabby-core'
|
||||
import { ElectronService } from '../services/electron.service'
|
||||
import { ElectronHostWindow, Bounds } from './hostWindow.service'
|
||||
|
||||
@@ -12,6 +12,7 @@ export class ElectronDockingService extends DockingService {
|
||||
private zone: NgZone,
|
||||
private hostWindow: ElectronHostWindow,
|
||||
platform: PlatformService,
|
||||
@Inject(BOOTSTRAP_DATA) private bootstrapData: BootstrapData,
|
||||
) {
|
||||
super()
|
||||
this.screensChanged$.subscribe(() => this.repositionWindow())
|
||||
@@ -25,7 +26,7 @@ export class ElectronDockingService extends DockingService {
|
||||
dock (): void {
|
||||
const dockSide = this.config.store.appearance.dock
|
||||
|
||||
if (dockSide === 'off') {
|
||||
if (dockSide === 'off' || !this.bootstrapData.isMainWindow) {
|
||||
this.hostWindow.setAlwaysOnTop(false)
|
||||
return
|
||||
}
|
||||
|
@@ -43,6 +43,10 @@ export class ElectronHostWindow extends HostWindowService {
|
||||
electron.ipcRenderer.on('host:window-focused', () => zone.run(() => {
|
||||
this.windowFocused.next()
|
||||
}))
|
||||
|
||||
electron.ipcRenderer.on('host:became-main-window', () => zone.run(() => {
|
||||
this.bootstrapData.isMainWindow = true
|
||||
}))
|
||||
}
|
||||
|
||||
getWindow (): BrowserWindow {
|
||||
@@ -97,6 +101,18 @@ export class ElectronHostWindow extends HostWindowService {
|
||||
this.getWindow().setTouchBar(touchBar)
|
||||
}
|
||||
|
||||
setTrafficLightPosition (x: number, y: number): void {
|
||||
this.electron.ipcRenderer.send('window-set-traffic-light-position', x, y)
|
||||
}
|
||||
|
||||
setOpacity (opacity: number): void {
|
||||
this.electron.ipcRenderer.send('window-set-opacity', opacity)
|
||||
}
|
||||
|
||||
setProgressBar (value: number): void {
|
||||
this.electron.ipcRenderer.send('window-set-progress-bar', value)
|
||||
}
|
||||
|
||||
bringToFront (): void {
|
||||
this.electron.ipcRenderer.send('window-bring-to-front')
|
||||
}
|
||||
|
@@ -30,6 +30,8 @@ export class ElectronUpdaterService extends UpdaterService {
|
||||
}
|
||||
|
||||
this.autoUpdater = electron.remote.require('electron-updater').autoUpdater
|
||||
this.autoUpdater.autoDownload = true
|
||||
this.autoUpdater.autoInstallOnAppQuit = false
|
||||
|
||||
this.autoUpdater.on('update-available', () => {
|
||||
this.logger.info('Update available')
|
||||
|
3
tabby-linkifier/README.md
Normal 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.
|
22
tabby-linkifier/package.json
Normal 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"
|
||||
}
|
||||
}
|
16
tabby-linkifier/src/api.ts
Normal 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
|
||||
}
|
12
tabby-linkifier/src/config.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { ConfigProvider } from 'tabby-core'
|
||||
|
||||
/** @hidden */
|
||||
export class ClickableLinksConfigProvider extends ConfigProvider {
|
||||
defaults = {
|
||||
clickableLinks: {
|
||||
modifier: null,
|
||||
},
|
||||
}
|
||||
|
||||
platformDefaults = { }
|
||||
}
|
67
tabby-linkifier/src/decorator.ts
Normal 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]
|
||||
}
|
||||
}
|
108
tabby-linkifier/src/handlers.ts
Normal 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)
|
||||
}
|
||||
}
|
27
tabby-linkifier/src/index.ts
Normal 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'
|
7
tabby-linkifier/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"extends": "../tsconfig.json",
|
||||
"exclude": ["node_modules", "dist"],
|
||||
"compilerOptions": {
|
||||
"baseUrl": "src",
|
||||
}
|
||||
}
|
14
tabby-linkifier/tsconfig.typings.json
Normal 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/*"]
|
||||
}
|
||||
}
|
||||
}
|
5
tabby-linkifier/webpack.config.js
Normal file
@@ -0,0 +1,5 @@
|
||||
const config = require('../webpack.plugin.config')
|
||||
module.exports = config({
|
||||
name: 'linkifier',
|
||||
dirname: __dirname,
|
||||
})
|
8
tabby-linkifier/yarn.lock
Normal 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==
|
@@ -1,5 +1,4 @@
|
||||
Tabby Local Plugin
|
||||
---------------------
|
||||
# Tabby Local Plugin
|
||||
|
||||
* local shells
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "tabby-local",
|
||||
"version": "1.0.156",
|
||||
"version": "1.0.165-nightly.0",
|
||||
"description": "Tabby's local shell plugin",
|
||||
"keywords": [
|
||||
"tabby-builtin-plugin"
|
||||
@@ -16,9 +16,6 @@
|
||||
],
|
||||
"author": "Eugene Pankov",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"opentype.js": "^1.3.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"ansi-colors": "^4.1.1",
|
||||
"dataurl": "0.1.0",
|
||||
|
@@ -3,7 +3,11 @@ ng-container(*ngIf='!argvMode')
|
||||
label Command line
|
||||
.input-group
|
||||
.input-group-prepend
|
||||
button.btn.btn-secondary((click)='switchToArgv()', title='Switch to split arguments')
|
||||
a.input-group-text(
|
||||
(click)='switchToArgv()',
|
||||
ngbTooltip='Split into unescaped arguments',
|
||||
href='#'
|
||||
)
|
||||
i.fas.fa-fw.fa-caret-right
|
||||
input.form-control.text-monospace(
|
||||
[(ngModel)]='command',
|
||||
@@ -15,7 +19,11 @@ ng-container(*ngIf='argvMode')
|
||||
label Program
|
||||
.input-group
|
||||
.input-group-prepend
|
||||
button.btn.btn-secondary((click)='switchToCommand()', title='Switch to a single-line command')
|
||||
a.input-group-text(
|
||||
(click)='switchToCommand()',
|
||||
ngbTooltip='Combine into a single escaped command',
|
||||
href='#'
|
||||
)
|
||||
i.fas.fa-fw.fa-caret-down
|
||||
input.form-control.text-monospace(
|
||||
type='text',
|
||||
|
@@ -8,6 +8,13 @@
|
||||
button.btn.btn-secondary((click)='removeEnvironmentVar(pair.key)')
|
||||
i.fas.fa-fw.fa-trash
|
||||
|
||||
button.btn.btn-secondary((click)='addEnvironmentVar()')
|
||||
i.fas.fa-plus.mr-2
|
||||
span Add
|
||||
.d-flex
|
||||
button.btn.btn-secondary((click)='addEnvironmentVar()')
|
||||
i.fas.fa-plus.mr-2
|
||||
span Add
|
||||
|
||||
.ml-auto
|
||||
.text-muted Substitutions allowed.
|
||||
.d-flex.ml-1(*ngIf='shouldShowExample()')
|
||||
.text-muted Example:
|
||||
a.ml-1((click)='addExample()', href='#') extend PATH
|
||||
|
@@ -44,4 +44,13 @@ export class EnvironmentEditorComponent {
|
||||
this.emitUpdate()
|
||||
}
|
||||
|
||||
shouldShowExample (): boolean {
|
||||
return !this.vars.find(v => v.key.toLowerCase() === 'path')
|
||||
}
|
||||
|
||||
addExample (): void {
|
||||
const value = process.platform === 'win32' ? 'C:\\Program Files\\Custom:%PATH%' : '/opt/custom:$PATH'
|
||||
this.vars.push({ key: 'PATH', value })
|
||||
this.emitUpdate()
|
||||
}
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
import { Component } from '@angular/core'
|
||||
import { Component, HostBinding } from '@angular/core'
|
||||
import { WIN_BUILD_CONPTY_SUPPORTED, WIN_BUILD_CONPTY_STABLE, isWindowsBuild, ConfigService } from 'tabby-core'
|
||||
|
||||
/** @hidden */
|
||||
@@ -9,6 +9,8 @@ export class ShellSettingsTabComponent {
|
||||
isConPTYAvailable: boolean
|
||||
isConPTYStable: boolean
|
||||
|
||||
@HostBinding('class.content-box') true
|
||||
|
||||
constructor (
|
||||
public config: ConfigService,
|
||||
) {
|
||||
|
@@ -58,7 +58,10 @@ export class TerminalTabComponent extends BaseTerminalTabComponent {
|
||||
|
||||
initializeSession (columns: number, rows: number): void {
|
||||
if (this.profile.options.runAsAdministrator && this.uac.isAvailable) {
|
||||
this.profile.options = this.uac.patchSessionOptionsForUAC(this.profile.options)
|
||||
this.profile = {
|
||||
...this.profile,
|
||||
options: this.uac.patchSessionOptionsForUAC(this.profile.options),
|
||||
}
|
||||
}
|
||||
|
||||
this.session!.start({
|
||||
|
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="svg-inline--fa fa-plus fa-w-12 fa-3x" data-icon="plus" data-prefix="fal" focusable="false" role="img" viewBox="0 0 384 512"><path fill="#fff" stroke="none" stroke-width="1" d="M376 232H216V72c0-4.42-3.58-8-8-8h-32c-4.42 0-8 3.58-8 8v160H8c-4.42 0-8 3.58-8 8v32c0 4.42 3.58 8 8 8h160v160c0 4.42 3.58 8 8 8h32c4.42 0 8-3.58 8-8V280h160c4.42 0 8-3.58 8-8v-32c0-4.42-3.58-8-8-8z"/></svg>
|
||||
<svg aria-hidden="true" focusable="false" data-prefix="fal" data-icon="plus" class="svg-inline--fa fa-plus" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M432 256C432 264.8 424.8 272 416 272h-176V448c0 8.844-7.156 16.01-16 16.01S208 456.8 208 448V272H32c-8.844 0-16-7.15-16-15.99C16 247.2 23.16 240 32 240h176V64c0-8.844 7.156-15.99 16-15.99S240 55.16 240 64v176H416C424.8 240 432 247.2 432 256z"></path></svg>
|
||||
|
Before Width: | Height: | Size: 449 B After Width: | Height: | Size: 462 B |
@@ -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)
|
||||
|
||||
if (!profile.options?.cwd) {
|
||||
if (!profile.options.cwd) {
|
||||
if (this.app.activeTab instanceof TerminalTabComponent && this.app.activeTab.session) {
|
||||
profile.options ??= {}
|
||||
profile.options.cwd = await this.app.activeTab.session.getWorkingDirectory() ?? undefined
|
||||
}
|
||||
if (this.app.activeTab instanceof SplitTabComponent) {
|
||||
const focusedTab = this.app.activeTab.getFocusedTab()
|
||||
|
||||
if (focusedTab instanceof TerminalTabComponent && focusedTab.session) {
|
||||
profile.options ??= {}
|
||||
profile.options.cwd = await focusedTab.session.getWorkingDirectory() ?? undefined
|
||||
}
|
||||
}
|
||||
|
@@ -81,6 +81,35 @@ export class PTYProxy {
|
||||
}
|
||||
}
|
||||
|
||||
function mergeEnv (...envs) {
|
||||
const result = {}
|
||||
const keyMap = {}
|
||||
for (const env of envs) {
|
||||
for (const [key, value] of Object.entries(env)) {
|
||||
// const lookup = process.platform === 'win32' ? key.toLowerCase() : key
|
||||
const lookup = key.toLowerCase()
|
||||
keyMap[lookup] ??= key
|
||||
result[keyMap[lookup]] = value
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
function substituteEnv (env: Record<string, string>) {
|
||||
env = { ...env }
|
||||
const pattern = process.platform === 'win32' ? /%(\w+)%/g : /\$(\w+)\b/g
|
||||
for (const [key, value] of Object.entries(env)) {
|
||||
env[key] = value.replace(pattern, function (substring, p1) {
|
||||
if (process.platform === 'win32') {
|
||||
return Object.entries(process.env).find(x => x[0].toLowerCase() === p1.toLowerCase())?.[1] ?? ''
|
||||
} else {
|
||||
return process.env[p1] ?? ''
|
||||
}
|
||||
})
|
||||
}
|
||||
return env
|
||||
}
|
||||
|
||||
/** @hidden */
|
||||
export class Session extends BaseSession {
|
||||
private pty: PTYProxy|null = null
|
||||
@@ -108,22 +137,18 @@ export class Session extends BaseSession {
|
||||
}
|
||||
|
||||
if (!pty) {
|
||||
const env = {
|
||||
...process.env,
|
||||
TERM: 'xterm-256color',
|
||||
TERM_PROGRAM: 'Tabby',
|
||||
...options.env,
|
||||
...this.config.store.terminal.environment || {},
|
||||
}
|
||||
let env = mergeEnv(
|
||||
process.env,
|
||||
{
|
||||
TERM: 'xterm-256color',
|
||||
TERM_PROGRAM: 'Tabby',
|
||||
},
|
||||
substituteEnv(options.env ?? {}),
|
||||
this.config.store.terminal.environment || {},
|
||||
)
|
||||
|
||||
if (this.hostApp.platform === Platform.Windows && this.config.store.terminal.setComSpec) {
|
||||
for (const k of Object.keys(env)) {
|
||||
if (k.toUpperCase() === 'COMSPEC') {
|
||||
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
||||
delete env[k]
|
||||
}
|
||||
}
|
||||
env.COMSPEC = this.bootstrapData.executable
|
||||
env = mergeEnv(env, { COMSPEC: this.bootstrapData.executable })
|
||||
}
|
||||
|
||||
delete env['']
|
||||
@@ -270,18 +295,16 @@ export class Session extends BaseSession {
|
||||
} else {
|
||||
await new Promise<void>((resolve) => {
|
||||
this.kill('SIGTERM')
|
||||
setImmediate(() => {
|
||||
setTimeout(() => {
|
||||
try {
|
||||
process.kill(this.pty!.getPID(), 0)
|
||||
// still alive
|
||||
setTimeout(() => {
|
||||
this.kill('SIGKILL')
|
||||
resolve()
|
||||
}, 1000)
|
||||
this.kill('SIGKILL')
|
||||
resolve()
|
||||
} catch {
|
||||
resolve()
|
||||
}
|
||||
})
|
||||
}, 500)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@@ -73,21 +73,22 @@ export class WindowsStockShellsProvider extends ShellProvider {
|
||||
}
|
||||
|
||||
private async getPowerShellPath () {
|
||||
const ps = 'powershell.exe'
|
||||
|
||||
if (!await promisify(hasbin)(ps)) {
|
||||
for (const searchPath of [
|
||||
`${process.env.SystemRoot}\\System32\\WindowsPowerShell\\v1.0`,
|
||||
`${process.env.SystemRoot}\\System32`,
|
||||
process.env.SystemRoot ?? 'C:\\Windows',
|
||||
]) {
|
||||
const newPath = path.join(searchPath, ps)
|
||||
try {
|
||||
await fs.stat(newPath)
|
||||
return newPath
|
||||
} catch { }
|
||||
for (const name of ['pwsh.exe', 'powershell.exe']) {
|
||||
if (await promisify(hasbin)(name)) {
|
||||
return name
|
||||
}
|
||||
}
|
||||
return ps
|
||||
for (const psPath of [
|
||||
`${process.env.USERPROFILE}\\AppData\\Local\\Microsoft\\WindowsApps\\pwsh.exe`,
|
||||
`${process.env.SystemRoot}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`,
|
||||
`${process.env.SystemRoot}\\System32\\powershell.exe`,
|
||||
(process.env.SystemRoot ?? 'C:\\Windows') + '\\powerhshell.exe',
|
||||
]) {
|
||||
try {
|
||||
await fs.stat(psPath)
|
||||
return psPath
|
||||
} catch { }
|
||||
}
|
||||
return 'powershell.exe'
|
||||
}
|
||||
}
|
||||
|