mirror of
https://github.com/Eugeny/tabby.git
synced 2025-07-31 06:26:59 +00:00
Compare commits
58 Commits
v1.0.211
...
all-contri
Author | SHA1 | Date | |
---|---|---|---|
![]() |
af15e70205 | ||
![]() |
1665510d98 | ||
![]() |
7a7312c1b6 | ||
![]() |
648503a64b | ||
![]() |
3af87f0994 | ||
![]() |
21a623a1ee | ||
![]() |
afd9b460f8 | ||
![]() |
d345e2036a | ||
![]() |
e5777604cf | ||
![]() |
44b2757975 | ||
![]() |
ac8dd9f290 | ||
![]() |
0f3aeb6a40 | ||
![]() |
c7ca4d6aa1 | ||
![]() |
fa4c544c9c | ||
![]() |
ace5ac79a4 | ||
![]() |
af0e25ea09 | ||
![]() |
f0d228bb60 | ||
![]() |
0241623d27 | ||
![]() |
f4992c3f70 | ||
![]() |
5fca7ccf7b | ||
![]() |
3740166ace | ||
![]() |
82013e3139 | ||
![]() |
4d60ae2e90 | ||
![]() |
d6c2c5de31 | ||
![]() |
ccb59c3eae | ||
![]() |
2966c1fdad | ||
![]() |
42eefe8ef0 | ||
![]() |
1c62438f9d | ||
![]() |
e9f17ea597 | ||
![]() |
838d4afb94 | ||
![]() |
09194a964e | ||
![]() |
a5188f4cf5 | ||
![]() |
d7b7e6bcfd | ||
![]() |
37b1c1c750 | ||
![]() |
09b261e265 | ||
![]() |
df75f2bdb7 | ||
![]() |
ccee879b16 | ||
![]() |
5587e10dc8 | ||
![]() |
856a800cb2 | ||
![]() |
3c5f2ba28c | ||
![]() |
aa105bdf4d | ||
![]() |
b0dcc5f9df | ||
![]() |
fdda602a76 | ||
![]() |
f630b53e0a | ||
![]() |
89dd0773ee | ||
![]() |
deaa529c07 | ||
![]() |
3f0b78edd0 | ||
![]() |
f523b114ca | ||
![]() |
af98505ea4 | ||
![]() |
dd9a13c917 | ||
![]() |
9da21a82a8 | ||
![]() |
f0a83c68dc | ||
![]() |
7fbe3405fe | ||
![]() |
59c5491432 | ||
![]() |
9b985698ff | ||
![]() |
7af6a31f55 | ||
![]() |
50c534789a | ||
![]() |
64d9c98538 |
@@ -1310,6 +1310,33 @@
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "fireblue",
|
||||
"name": "fireblue",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/1034929?v=4",
|
||||
"profile": "https://github.com/fireblue",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "marko1616",
|
||||
"name": "marko1616",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/45327989?v=4",
|
||||
"profile": "https://github.com/marko1616",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "joerg",
|
||||
"name": "Jörg Herzinger",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/166924?v=4",
|
||||
"profile": "https://github.com/joerg",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
}
|
||||
],
|
||||
"contributorsPerLine": 7,
|
||||
|
152
.github/workflows/build.yml
vendored
152
.github/workflows/build.yml
vendored
@@ -13,11 +13,11 @@ jobs:
|
||||
- name: Installing Node
|
||||
uses: actions/setup-node@v3.7.0
|
||||
with:
|
||||
node-version: 16
|
||||
node-version: 18
|
||||
|
||||
- name: Install deps
|
||||
run: |
|
||||
npm i -g yarn@1.19.1
|
||||
npm i -g yarn
|
||||
cd app
|
||||
yarn
|
||||
cd ..
|
||||
@@ -49,13 +49,12 @@ jobs:
|
||||
- name: Installing Node
|
||||
uses: actions/setup-node@v3.7.0
|
||||
with:
|
||||
node-version: 16
|
||||
node-version: 18
|
||||
|
||||
- name: Install deps
|
||||
run: |
|
||||
sudo -H pip3 install setuptools
|
||||
npm config set python python3
|
||||
sudo npm i -g yarn@1.22.1
|
||||
sudo npm i -g yarn
|
||||
yarn --network-timeout 1000000
|
||||
env:
|
||||
ARCH: ${{matrix.arch}}
|
||||
@@ -161,52 +160,49 @@ jobs:
|
||||
with:
|
||||
node-version: 18
|
||||
|
||||
- name: Install deps (amd64)
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install libarchive-tools zsh python3-distutils
|
||||
sudo apt-get install libarchive-tools zsh crossbuild-essential-${{matrix.arch}}
|
||||
|
||||
- name: Setup tar to run as root
|
||||
run: sudo chmod u+s "$(command -v tar)"
|
||||
if: matrix.build-arch != 'x64'
|
||||
|
||||
- name: Download cached sysroot
|
||||
uses: actions/cache@v3
|
||||
id: dl-cached-sysroot
|
||||
if: matrix.build-arch !='x64'
|
||||
with:
|
||||
key: sysroot-${{matrix.build-arch}}
|
||||
path: /${{matrix.build-arch}}-sysroot
|
||||
|
||||
- name: Setup crossbuild sysroot
|
||||
run: |
|
||||
sudo apt-get update -y && sudo apt-get install debootstrap qemu-user-static binfmt-support -y
|
||||
sudo qemu-debootstrap --include=libfontconfig1-dev,libsecret-1-dev,libnss3,libatk1.0-0,libatk-bridge2.0-0,libgdk-pixbuf2.0-0,libgtk-3-0,libgbm1 --variant=buildd --exclude=snapd --components=main,restricted,universe,multiverse --extractor=dpkg-deb --arch ${{matrix.arch}} bionic /${{matrix.build-arch}}-sysroot/ http://ports.ubuntu.com/ubuntu-ports/
|
||||
sudo find /${{matrix.build-arch}}-sysroot -type l -lname '/*' -exec sh -c 'file="$0"; dir=$(dirname "$file"); target=$(readlink "$0"); prefix=$(dirname "$dir" | sed 's@[^/]*@\.\.@g'); newtarget="$prefix$target"; ln -snf $newtarget $file' {} \; ;
|
||||
if: matrix.build-arch != 'x64' && steps.dl-cached-sysroot.outputs.cache-hit != 'true'
|
||||
|
||||
- name: Setup env to use ${{matrix.build-arch}} sysroot
|
||||
run: |
|
||||
echo "CFLAGS=--sysroot=/${{matrix.build-arch}}-sysroot/" >> $GITHUB_ENV
|
||||
echo "CXXFLAGS=--sysroot=/${{matrix.build-arch}}-sysroot/" >> $GITHUB_ENV
|
||||
echo "LDFLAGS=--sysroot=/${{matrix.build-arch}}-sysroot/" >> $GITHUB_ENV
|
||||
|
||||
[[ ${npm_config_arch} == 'arm' ]] && echo "npm_config_arch=armv7l" >> $GITHUB_ENV
|
||||
|
||||
if [[ ${{matrix.arch}} == 'armhf' ]]; then
|
||||
echo "PKG_CONFIG_PATH=/${{matrix.build-arch}}-sysroot/usr/lib/pkgconfig/:/${{matrix.build-arch}}-sysroot/usr/lib/arm-linux-gnueabihf/pkgconfig/" >> $GITHUB_ENV
|
||||
elif [[ ${{matrix.arch}} == 'arm64' ]]; then
|
||||
echo "PKG_CONFIG_PATH=/${{matrix.build-arch}}-sysroot/usr/lib/pkgconfig/:/${{matrix.build-arch}}-sysroot/usr/lib/aarch64-linux-gnu/pkgconfig/" >> $GITHUB_ENV
|
||||
fi
|
||||
if: matrix.build-arch != 'x64'
|
||||
|
||||
- name: Install npm_modules (amd64)
|
||||
run: |
|
||||
npm i -g yarn
|
||||
yarn --network-timeout 1000000
|
||||
if: matrix.build-arch == 'x64'
|
||||
|
||||
- name: Setup Crossbuild (${{matrix.arch}})
|
||||
run: |
|
||||
sudo apt-get update -y && sudo apt-get install schroot sbuild debootstrap -y
|
||||
sudo debootstrap --include=git,curl,gnupg,ca-certificates,crossbuild-essential-${{matrix.arch}},python-dev,python3-dev,libarchive-tools,cmake --variant=buildd --exclude=snapd --components=main,restricted,universe,multiverse --extractor=dpkg-deb bionic /build-chroot/
|
||||
echo 'deb [arch=amd64,i386] http://archive.ubuntu.com/ubuntu bionic main restricted universe multiverse' | sudo tee /build-chroot/etc/apt/sources.list >/dev/null
|
||||
echo 'deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports bionic main restricted universe multiverse' | sudo tee -a /build-chroot/etc/apt/sources.list >/dev/null
|
||||
curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg --dearmor | sudo tee /build-chroot/etc/apt/trusted.gpg.d/nodesource.gpg >/dev/null
|
||||
echo 'deb http://deb.nodesource.com/node_16.x bionic main' | sudo tee /build-chroot/etc/apt/sources.list.d/nodesource.list >/dev/null
|
||||
echo "[build-chroot]
|
||||
description=Ubuntu 18.04 Build chroot
|
||||
type=directory
|
||||
directory=/build-chroot
|
||||
root-groups=root,sudo
|
||||
profile=buildd
|
||||
personality=linux
|
||||
union-type=overlay" | sudo tee /etc/schroot/chroot.d/build-chroot.pref >/dev/null
|
||||
echo "/home /home none rw,bind 0 0" | sudo tee -a /etc/schroot/buildd/fstab >/dev/null
|
||||
|
||||
if: matrix.build-arch != 'x64'
|
||||
|
||||
- name: Install node_modules & CrossBuild native modules for ${{matrix.arch}}
|
||||
run: |
|
||||
sudo schroot -c build-chroot -u root -- bash -c "apt-get update -y
|
||||
dpkg --add-architecture ${{matrix.arch}}
|
||||
apt-get install -y nodejs libfontconfig-dev:${{matrix.arch}} libsecret-1-dev:${{matrix.arch}} libnss3:${{matrix.arch}} libatk1.0-0:${{matrix.arch}} libatk-bridge2.0-0:${{matrix.arch}} libgdk-pixbuf2.0-0:${{matrix.arch}} libgtk-3-0:${{matrix.arch}} libgbm1:${{matrix.arch}}
|
||||
export CC=${{matrix.triplet}}gcc CXX=${{matrix.triplet}}g++ LD=${{matrix.triplet}}ld
|
||||
if [[ ${{matrix.arch}} == 'arm64' ]]; then
|
||||
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/aarch64-linux-gnu/pkgconfig/
|
||||
elif [[ ${{matrix.arch}} == 'armhf' ]]; then
|
||||
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/arm-linux-gnueabihf/pkgconfig/
|
||||
fi
|
||||
export ARCH=${{matrix.build-arch}} npm_config_arch=${{matrix.build-arch}} npm_config_target_arch=${{matrix.build-arch}}
|
||||
npm i -g yarn
|
||||
yarn --network-timeout 1000000 --arch=${{matrix.build-arch}} --target_arch=${{matrix.build-arch}}"
|
||||
if: matrix.build-arch != 'x64'
|
||||
npm i -g yarn node-gyp
|
||||
yarn --network-timeout 1000000 --arch=${{matrix.build-arch}} --target-arch=${{matrix.build-arch}}
|
||||
|
||||
- name: Webpack (${{matrix.arch}})
|
||||
run: yarn run build --arch=${{matrix.build-arch}} --target_arch=${{matrix.build-arch}}
|
||||
@@ -222,57 +218,10 @@ jobs:
|
||||
USE_HARD_LINKS: false
|
||||
# DEBUG: electron-builder,electron-builder:*
|
||||
|
||||
- name: Build web resources
|
||||
- name: Build web resources (amd64 only)
|
||||
run: zsh -c 'tar czf tabby-web.tar.gz (tabby-*|web)/dist'
|
||||
if: matrix.build-arch == 'x64'
|
||||
|
||||
# - name: Install deps and Build (arm64)
|
||||
# uses: docker://multiarch/ubuntu-core:arm64-bionic
|
||||
# with:
|
||||
# args: >
|
||||
# bash -c
|
||||
# "apt update && apt install curl lsb-release gnupg -y &&
|
||||
# curl -fsSL https://deb.nodesource.com/setup_16.x | bash - &&
|
||||
# apt install make build-essential git ruby libarchive-tools nodejs rpm libsecret-1-dev libfontconfig1-dev -y &&
|
||||
# git config --global --add safe.directory /github/workspace &&
|
||||
# gem install public_suffix -v 4.0.7 &&
|
||||
# gem install fpm --no-document &&
|
||||
# npm i -g yarn &&
|
||||
# cd /github/workspace &&
|
||||
# yarn --network-timeout 1000000 &&
|
||||
# yarn run build &&
|
||||
# scripts/prepackage-plugins.mjs &&
|
||||
# USE_SYSTEM_FPM=true scripts/build-linux.mjs"
|
||||
# env:
|
||||
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
# KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
|
||||
# USE_HARD_LINKS: false
|
||||
# if: matrix.build-arch == 'arm64' && github.repository == 'Eugeny/tabby' && startsWith(github.ref, 'refs/tags')
|
||||
|
||||
# - name: Install deps and Build (armv7l)
|
||||
# uses: docker://multiarch/ubuntu-core:armhf-bionic
|
||||
# with:
|
||||
# args: >
|
||||
# bash -c
|
||||
# "apt update && apt install curl lsb-release gnupg -y &&
|
||||
# curl -fsSL https://deb.nodesource.com/setup_16.x | bash - &&
|
||||
# apt install make build-essential git ruby libarchive-tools nodejs rpm libsecret-1-dev libfontconfig1-dev -y &&
|
||||
# git config --global --add safe.directory /github/workspace &&
|
||||
# gem install public_suffix -v 4.0.7 &&
|
||||
# gem install fpm --no-document &&
|
||||
# npm i -g yarn &&
|
||||
# cd /github/workspace &&
|
||||
# sed -i '/ \"electron\":/c\ \"electron\": \"17.0.0\",' package.json &&
|
||||
# yarn --network-timeout 1000000 &&
|
||||
# yarn run build &&
|
||||
# scripts/prepackage-plugins.mjs &&
|
||||
# USE_SYSTEM_FPM=true scripts/build-linux.mjs"
|
||||
# env:
|
||||
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
# KEYGEN_TOKEN: ${{ secrets.KEYGEN_TOKEN }}
|
||||
# USE_HARD_LINKS: false
|
||||
# if: matrix.build-arch == 'arm' && github.repository == 'Eugeny/tabby' && startsWith(github.ref, 'refs/tags')
|
||||
|
||||
- name: Upload symbols (amd64 only)
|
||||
run: |
|
||||
sudo npm install -g @sentry/cli --unsafe-perm
|
||||
@@ -284,13 +233,15 @@ jobs:
|
||||
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
|
||||
|
||||
- name: Upload packages to packagecloud.io
|
||||
uses: Eugeny/packagecloud-action@main
|
||||
uses: TykTechnologies/packagecloud-action@main
|
||||
if: github.repository == 'Eugeny/tabby' && github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
||||
env:
|
||||
PACKAGECLOUD_TOKEN: ${{ secrets.PACKAGECLOUD_TOKEN }}
|
||||
with:
|
||||
repo: 'eugeny/tabby'
|
||||
dir: 'dist'
|
||||
rpmvers: 'el/9 el/8 ol/6 ol/7'
|
||||
debvers: 'ubuntu/bionic ubuntu/focal ubuntu/hirsute ubuntu/impish ubuntu/jammy ubuntu/kinetic ubuntu/noble debian/jessie debian/stretch debian/buster'
|
||||
|
||||
- uses: actions/upload-artifact@master
|
||||
name: Upload AppImage (${{matrix.arch}})
|
||||
@@ -349,17 +300,12 @@ jobs:
|
||||
- name: Installing Node
|
||||
uses: actions/setup-node@v3.7.0
|
||||
with:
|
||||
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"}
|
||||
node-version: 18
|
||||
|
||||
- name: Build
|
||||
shell: powershell
|
||||
run: |
|
||||
npm i -g yarn@1.19.1
|
||||
npm i -g yar node-gyp
|
||||
yarn --network-timeout 1000000
|
||||
yarn run build
|
||||
node scripts/prepackage-plugins.mjs
|
||||
@@ -379,7 +325,7 @@ jobs:
|
||||
|
||||
- name: Build packages without signing
|
||||
run: node scripts/build-windows.mjs
|
||||
if: "!(github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags')))"
|
||||
if: "! (github.repository == 'Eugeny/tabby' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags')))"
|
||||
env:
|
||||
ARCH: ${{matrix.arch}}
|
||||
|
||||
|
@@ -340,6 +340,9 @@ Dank geht an diese wunderbaren Menschen ([emoji key](https://allcontributors.org
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/joerg"><img src="https://avatars.githubusercontent.com/u/166924?v=4?s=100" width="100px;" alt="Jörg Herzinger"/><br /><sub><b>Jörg Herzinger</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=joerg" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -342,6 +342,9 @@ Gracias a estas maravillosas personas ([emoji key](https://allcontributors.org/d
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/joerg"><img src="https://avatars.githubusercontent.com/u/166924?v=4?s=100" width="100px;" alt="Jörg Herzinger"/><br /><sub><b>Jörg Herzinger</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=joerg" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -339,6 +339,8 @@ Terima kasih kepada mereka yang telah membantu ([emoji key](https://allcontribut
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -335,6 +335,9 @@ Grazie a queste persone meravigliose ([emoji key](https://allcontributors.org/do
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/joerg"><img src="https://avatars.githubusercontent.com/u/166924?v=4?s=100" width="100px;" alt="Jörg Herzinger"/><br /><sub><b>Jörg Herzinger</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=joerg" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -350,6 +350,8 @@ Windows上では、`Tabby.exe`がある場所と同じ場所に`data`フォル
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -334,6 +334,9 @@ Pull requests and plugins are welcome!
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/joerg"><img src="https://avatars.githubusercontent.com/u/166924?v=4?s=100" width="100px;" alt="Jörg Herzinger"/><br /><sub><b>Jörg Herzinger</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=joerg" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
11
README.md
11
README.md
@@ -16,9 +16,6 @@
|
||||
|
||||
> 👋 Managing remote environments? Check out [Warpgate, my smart SSH/HTTP/MySQL bastion server](https://github.com/warp-tech/warpgate), it works great with Tabby, you'll love it.
|
||||
|
||||
> 👋 [Tabby-web](https://github.com/Eugeny/tabby-web) is looking for sponsors. As I can't afford to host it myself any longer, I'm looking for a sponsor to cover the hosting costs. If you're interested, please [get in touch](https://twitter.com/eugeeeeny)!
|
||||
|
||||
|
||||
----
|
||||
|
||||
### Downloads:
|
||||
@@ -155,6 +152,11 @@ Plugins and themes can be installed directly from the Settings view inside Tabby
|
||||
|
||||
[**keygen**](https://keygen.sh/?via=eugene) has provided free release & auto-update hosting
|
||||
|
||||
<a href="https://iqhive.com/"><img src="https://private-user-images.githubusercontent.com/161476/361584584-ed292436-1d50-46bc-b479-78222c83ed22.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ3MDg3NjgsIm5iZiI6MTcyNDcwODQ2OCwicGF0aCI6Ii8xNjE0NzYvMzYxNTg0NTg0LWVkMjkyNDM2LTFkNTAtNDZiYy1iNDc5LTc4MjIyYzgzZWQyMi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODI2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgyNlQyMTQxMDhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1iYzNlZjIxN2JiYzBkYTU5NGE4YmZlZDJiNmIxZWE1ZTAyOTNhYjJlZTRhOGZjYTk4N2E4MzMzZjg0ZTNkZWQ0JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.pQzR2d71YV4TIxOH3Lg20HpNKrm_r2D-xfkEM_F2DTs" width="100"></a>
|
||||
|
||||
[**IQ Hive**](https://iqhive.com) is providing financial support for the project development
|
||||
|
||||
|
||||
<a name="contributing"></a>
|
||||
# Contributing
|
||||
|
||||
@@ -356,6 +358,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/joerg"><img src="https://avatars.githubusercontent.com/u/166924?v=4?s=100" width="100px;" alt="Jörg Herzinger"/><br /><sub><b>Jörg Herzinger</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=joerg" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -343,6 +343,9 @@ Obrigado vai para essas pessoas maravilhosas ([emoji key](https://allcontributor
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/joerg"><img src="https://avatars.githubusercontent.com/u/166924?v=4?s=100" width="100px;" alt="Jörg Herzinger"/><br /><sub><b>Jörg Herzinger</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=joerg" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -335,6 +335,9 @@ Pull-запросы и плагины приветствуются!
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/joerg"><img src="https://avatars.githubusercontent.com/u/166924?v=4?s=100" width="100px;" alt="Jörg Herzinger"/><br /><sub><b>Jörg Herzinger</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=joerg" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -334,6 +334,9 @@
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://5k.work/"><img src="https://avatars.githubusercontent.com/u/82694310?v=4?s=100" width="100px;" alt="Mxmilu"/><br /><sub><b>Mxmilu</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=Mxmilu666" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://cbuff.dev"><img src="https://avatars.githubusercontent.com/u/29805363?v=4?s=100" width="100px;" alt="Charles Buffington"/><br /><sub><b>Charles Buffington</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=C41M50N" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GeminiLn"><img src="https://avatars.githubusercontent.com/u/12425057?v=4?s=100" width="100px;" alt="Yu Qin"/><br /><sub><b>Yu Qin</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=GeminiLn" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fireblue"><img src="https://avatars.githubusercontent.com/u/1034929?v=4?s=100" width="100px;" alt="fireblue"/><br /><sub><b>fireblue</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=fireblue" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marko1616"><img src="https://avatars.githubusercontent.com/u/45327989?v=4?s=100" width="100px;" alt="marko1616"/><br /><sub><b>marko1616</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=marko1616" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/joerg"><img src="https://avatars.githubusercontent.com/u/166924?v=4?s=100" width="100px;" alt="Jörg Herzinger"/><br /><sub><b>Jörg Herzinger</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=joerg" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@@ -31,6 +31,8 @@ try {
|
||||
app.exit(1)
|
||||
}
|
||||
|
||||
process.mainModule = module
|
||||
|
||||
const application = new Application(configStore)
|
||||
|
||||
ipcMain.on('app:new-window', () => {
|
||||
|
@@ -1,5 +1,5 @@
|
||||
import * as glasstron from 'glasstron'
|
||||
|
||||
import { autoUpdater } from 'electron-updater'
|
||||
import { Subject, Observable, debounceTime } from 'rxjs'
|
||||
import { BrowserWindow, app, ipcMain, Rectangle, Menu, screen, BrowserWindowConstructorOptions, TouchBar, nativeImage, WebContents } from 'electron'
|
||||
import ElectronConfig = require('electron-config')
|
||||
@@ -26,7 +26,7 @@ abstract class GlasstronWindow extends BrowserWindow {
|
||||
abstract setBlur (_: boolean)
|
||||
}
|
||||
|
||||
const macOSVibrancyType: any = process.platform === 'darwin' ? compareVersions(macOSRelease().version || '0.0', '10.14', '>=') ? 'under-window' : 'dark' : null
|
||||
const macOSVibrancyType: any = process.platform === 'darwin' ? compareVersions(macOSRelease().version || '0.0', '10.14', '>=') ? 'fullscreen-ui' : 'dark' : null
|
||||
|
||||
const activityIcon = nativeImage.createFromPath(`${app.getAppPath()}/assets/activity.png`)
|
||||
|
||||
@@ -159,6 +159,7 @@ export class Window {
|
||||
}
|
||||
|
||||
this.setupWindowManagement()
|
||||
this.setupUpdater()
|
||||
|
||||
this.ready = new Promise(resolve => {
|
||||
const listener = event => {
|
||||
@@ -346,11 +347,8 @@ export class Window {
|
||||
this.send('host:window-focused')
|
||||
})
|
||||
|
||||
ipcMain.on('ready', event => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
this.window.webContents.send('start', {
|
||||
this.on('ready', () => {
|
||||
this.window?.webContents.send('start', {
|
||||
config: this.configStore,
|
||||
executable: app.getPath('exe'),
|
||||
windowID: this.window.id,
|
||||
@@ -359,42 +357,26 @@ export class Window {
|
||||
})
|
||||
})
|
||||
|
||||
ipcMain.on('window-minimize', event => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
this.window.minimize()
|
||||
this.on('window-minimize', () => {
|
||||
this.window?.minimize()
|
||||
})
|
||||
|
||||
ipcMain.on('window-set-bounds', (event, bounds) => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
this.window.setBounds(bounds)
|
||||
this.on('window-set-bounds', (_, bounds) => {
|
||||
this.window?.setBounds(bounds)
|
||||
})
|
||||
|
||||
ipcMain.on('window-set-always-on-top', (event, flag) => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
this.window.setAlwaysOnTop(flag)
|
||||
this.on('window-set-always-on-top', (_, flag) => {
|
||||
this.window?.setAlwaysOnTop(flag)
|
||||
})
|
||||
|
||||
ipcMain.on('window-set-vibrancy', (event, enabled, type) => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
this.on('window-set-vibrancy', (_, enabled, type) => {
|
||||
this.setVibrancy(enabled, type)
|
||||
})
|
||||
|
||||
ipcMain.on('window-set-window-controls-color', (event, theme) => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
|
||||
this.on('window-set-window-controls-color', (_, theme) => {
|
||||
if (process.platform === 'win32') {
|
||||
const symbolColor: string = theme.foreground
|
||||
this.window.setTitleBarOverlay(
|
||||
this.window?.setTitleBarOverlay(
|
||||
{
|
||||
symbolColor: symbolColor,
|
||||
height: 32,
|
||||
@@ -403,32 +385,23 @@ export class Window {
|
||||
}
|
||||
})
|
||||
|
||||
ipcMain.on('window-set-title', (event, title) => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
this.window.setTitle(title)
|
||||
this.on('window-set-title', (_, title) => {
|
||||
this.window?.setTitle(title)
|
||||
})
|
||||
|
||||
ipcMain.on('window-bring-to-front', event => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
if (this.window.isMinimized()) {
|
||||
this.on('window-bring-to-front', () => {
|
||||
if (this.window?.isMinimized()) {
|
||||
this.window.restore()
|
||||
}
|
||||
this.present()
|
||||
})
|
||||
|
||||
ipcMain.on('window-close', event => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
this.on('window-close', () => {
|
||||
this.closing = true
|
||||
this.window.close()
|
||||
})
|
||||
|
||||
ipcMain.on('window-set-touch-bar', (_event, segments, selectedIndex) => {
|
||||
this.on('window-set-touch-bar', (_, segments, selectedIndex) => {
|
||||
this.touchBarControl.segments = segments.map(s => ({
|
||||
label: s.label,
|
||||
icon: s.hasActivity ? activityIcon : undefined,
|
||||
@@ -468,8 +441,46 @@ export class Window {
|
||||
this.window.setOpacity(opacity)
|
||||
})
|
||||
|
||||
ipcMain.on('window-set-progress-bar', (_event, value) => {
|
||||
this.window.setProgressBar(value, { mode: value < 0 ? 'none' : 'normal' })
|
||||
this.on('window-set-progress-bar', (_, value) => {
|
||||
this.window?.setProgressBar(value, { mode: value < 0 ? 'none' : 'normal' })
|
||||
})
|
||||
}
|
||||
|
||||
on (event: string, listener: (...args: any[]) => void): void {
|
||||
ipcMain.on(event, (e, ...args) => {
|
||||
if (!this.window || e.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
listener(e, ...args)
|
||||
})
|
||||
}
|
||||
|
||||
private setupUpdater () {
|
||||
autoUpdater.autoDownload = true
|
||||
autoUpdater.autoInstallOnAppQuit = true
|
||||
|
||||
autoUpdater.on('update-available', () => {
|
||||
this.send('updater:update-available')
|
||||
})
|
||||
|
||||
autoUpdater.on('update-not-available', () => {
|
||||
this.send('updater:update-not-available')
|
||||
})
|
||||
|
||||
autoUpdater.on('error', err => {
|
||||
this.send('updater:error', err)
|
||||
})
|
||||
|
||||
autoUpdater.on('update-downloaded', () => {
|
||||
this.send('updater:update-downloaded')
|
||||
})
|
||||
|
||||
this.on('updater:check-for-updates', () => {
|
||||
autoUpdater.checkForUpdates()
|
||||
})
|
||||
|
||||
this.on('updater:quit-and-install', () => {
|
||||
autoUpdater.quitAndInstall()
|
||||
})
|
||||
}
|
||||
|
||||
|
@@ -15,7 +15,7 @@
|
||||
"watch": "webpack --progress --color --watch"
|
||||
},
|
||||
"dependencies": {
|
||||
"@electron/remote": "2.0.10",
|
||||
"@electron/remote": "^2",
|
||||
"node-pty": "^1.0",
|
||||
"any-promise": "^1.3.0",
|
||||
"electron-config": "2.0.0",
|
||||
@@ -63,8 +63,7 @@
|
||||
"tabby-terminal": "*"
|
||||
},
|
||||
"resolutions": {
|
||||
"*/node-abi": "^2.20.0",
|
||||
"node-gyp": "^10.0.0",
|
||||
"nan": "github:jkleinsc/nan#remove_accessor_signature"
|
||||
"*/node-abi": "^3",
|
||||
"node-gyp": "^10.0.0"
|
||||
}
|
||||
}
|
||||
|
@@ -42,6 +42,7 @@ const config = {
|
||||
'electron-config': 'commonjs electron-config',
|
||||
'electron-debug': 'commonjs electron-debug',
|
||||
'electron-promise-ipc': 'commonjs electron-promise-ipc',
|
||||
'electron-updater': 'commonjs electron-updater',
|
||||
fs: 'commonjs fs',
|
||||
glasstron: 'commonjs glasstron',
|
||||
mz: 'commonjs mz',
|
||||
|
@@ -2,10 +2,10 @@
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@electron/remote@2.0.10":
|
||||
version "2.0.10"
|
||||
resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-2.0.10.tgz#133e2f607b1861ac249bd78b5abd1e961feed713"
|
||||
integrity sha512-3SFKKaQXcyWgwmibud+UqJl/XlHOgLcI3fwtB9pNelPSJAcTxocOJrF6FaxBIQaj1+R05Di6xuAswZpXAW7xhA==
|
||||
"@electron/remote@^2":
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-2.1.2.tgz#52a97c8faa5b769155b649ef262f2f8c851776e6"
|
||||
integrity sha512-EPwNx+nhdrTBxyCqXt/pftoQg/ybtWDW3DUWHafejvnB1ZGGfMpv6e15D8KeempocjXe78T7WreyGGb3mlZxdA==
|
||||
|
||||
"@iarna/cli@^1.2.0":
|
||||
version "1.2.0"
|
||||
@@ -2577,9 +2577,10 @@ mz@^2.7.0:
|
||||
object-assign "^4.0.1"
|
||||
thenify-all "^1.0.0"
|
||||
|
||||
nan@^2.17.0, "nan@github:jkleinsc/nan#remove_accessor_signature":
|
||||
version "2.16.0"
|
||||
resolved "https://codeload.github.com/jkleinsc/nan/tar.gz/6a2f95a6a2209d8aa7542fb18099fd808a802059"
|
||||
nan@^2.17.0:
|
||||
version "2.20.0"
|
||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3"
|
||||
integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==
|
||||
|
||||
napi-build-utils@^1.0.1:
|
||||
version "1.0.2"
|
||||
@@ -2610,12 +2611,12 @@ nice-try@^1.0.4:
|
||||
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
|
||||
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
|
||||
|
||||
node-abi@^2.20.0:
|
||||
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==
|
||||
node-abi@^3:
|
||||
version "3.65.0"
|
||||
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.65.0.tgz#ca92d559388e1e9cab1680a18c1a18757cdac9d3"
|
||||
integrity sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==
|
||||
dependencies:
|
||||
semver "^5.4.1"
|
||||
semver "^7.3.5"
|
||||
|
||||
node-abi@^3.3.0:
|
||||
version "3.8.0"
|
||||
@@ -3909,6 +3910,7 @@ strict-uri-encode@^2.0.0:
|
||||
integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=
|
||||
|
||||
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
|
||||
name string-width-cjs
|
||||
version "4.2.3"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||
@@ -3986,6 +3988,7 @@ stringify-package@^1.0.0, stringify-package@^1.0.1:
|
||||
integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==
|
||||
|
||||
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1:
|
||||
name strip-ansi-cjs
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||
@@ -4432,6 +4435,7 @@ worker-farm@^1.6.0, worker-farm@^1.7.0:
|
||||
errno "~0.1.7"
|
||||
|
||||
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
|
||||
name wrap-ansi-cjs
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
||||
|
@@ -39,7 +39,7 @@
|
||||
"cross-env": "7.0.3",
|
||||
"css-loader": "^6.7.3",
|
||||
"deep-equal": "2.0.5",
|
||||
"electron": "^27.0.4",
|
||||
"electron": "^29",
|
||||
"electron-builder": "^24.6.4",
|
||||
"electron-download": "^4.1.1",
|
||||
"electron-installer-snap": "^5.1.0",
|
||||
@@ -53,9 +53,9 @@
|
||||
"html-loader": "4.2.0",
|
||||
"json-loader": "^0.5.7",
|
||||
"lru-cache": "^6.0.0",
|
||||
"macos-release": "^3.1.0",
|
||||
"macos-release": "^3.3.0",
|
||||
"ngx-toastr": "^16.0.2",
|
||||
"node-abi": "^3.51.0",
|
||||
"node-abi": "^3.65.0",
|
||||
"npmlog": "6.0.2",
|
||||
"npx": "^10.2.2",
|
||||
"patch-package": "^6.4.7",
|
||||
|
@@ -3,7 +3,7 @@ import * as fs from 'fs'
|
||||
import * as semver from 'semver'
|
||||
import * as childProcess from 'child_process'
|
||||
|
||||
process.env.ARCH = ((process.env.ARCH || process.arch) === 'arm') ? 'armv7l' : process.env.ARCH || process.arch
|
||||
process.env.ARCH = ((process.env.ARCH || process.arch) === 'arm') ? 'armv7l' : (process.env.ARCH || process.arch)
|
||||
|
||||
import * as url from 'url'
|
||||
const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
|
||||
|
@@ -10,7 +10,7 @@ export { Theme } from './theme'
|
||||
export { TabContextMenuItemProvider } from './tabContextMenuProvider'
|
||||
export { SelectorOption } from './selector'
|
||||
export { CLIHandler, CLIEvent } from './cli'
|
||||
export { PlatformService, ClipboardContent, MessageBoxResult, MessageBoxOptions, FileDownload, FileUpload, FileTransfer, HTMLFileUpload, FileUploadOptions } from './platform'
|
||||
export { PlatformService, ClipboardContent, MessageBoxResult, MessageBoxOptions, FileDownload, FileUpload, FileTransfer, HTMLFileUpload, FileUploadOptions, DirectoryUpload } from './platform'
|
||||
export { MenuItemOptions } from './menu'
|
||||
export { BootstrapData, PluginInfo, BOOTSTRAP_DATA } from './mainProcess'
|
||||
export { HostWindowService } from './hostWindow'
|
||||
|
@@ -86,6 +86,26 @@ export interface FileUploadOptions {
|
||||
multiple: boolean
|
||||
}
|
||||
|
||||
export class DirectoryUpload {
|
||||
private childrens: (FileUpload|DirectoryUpload)[] = []
|
||||
|
||||
constructor (private name = '') {
|
||||
// Just set name for now.
|
||||
}
|
||||
|
||||
getName (): string {
|
||||
return this.name
|
||||
}
|
||||
|
||||
getChildrens (): (FileUpload|DirectoryUpload)[] {
|
||||
return this.childrens
|
||||
}
|
||||
|
||||
pushChildren (item: FileUpload|DirectoryUpload): void {
|
||||
this.childrens.push(item)
|
||||
}
|
||||
}
|
||||
|
||||
export type PlatformTheme = 'light'|'dark'
|
||||
|
||||
export abstract class PlatformService {
|
||||
@@ -106,23 +126,54 @@ export abstract class PlatformService {
|
||||
|
||||
abstract startDownload (name: string, mode: number, size: number): Promise<FileDownload|null>
|
||||
abstract startUpload (options?: FileUploadOptions): Promise<FileUpload[]>
|
||||
abstract startUploadDirectory (paths?: string[]): Promise<DirectoryUpload>
|
||||
|
||||
async startUploadFromDragEvent (event: DragEvent, multiple = false): Promise<DirectoryUpload> {
|
||||
const result = new DirectoryUpload()
|
||||
|
||||
startUploadFromDragEvent (event: DragEvent, multiple = false): FileUpload[] {
|
||||
const result: FileUpload[] = []
|
||||
if (!event.dataTransfer) {
|
||||
return []
|
||||
return Promise.resolve(result)
|
||||
}
|
||||
|
||||
const traverseFileTree = (item: any, root: DirectoryUpload = result): Promise<void> => {
|
||||
return new Promise((resolve) => {
|
||||
if (item.isFile) {
|
||||
item.file((file: File) => {
|
||||
const transfer = new HTMLFileUpload(file)
|
||||
this.fileTransferStarted.next(transfer)
|
||||
root.pushChildren(transfer)
|
||||
resolve()
|
||||
})
|
||||
} else if (item.isDirectory) {
|
||||
const dirReader = item.createReader()
|
||||
const childrenFolder = new DirectoryUpload(item.name)
|
||||
dirReader.readEntries(async (entries: any[]) => {
|
||||
for (const entry of entries) {
|
||||
await traverseFileTree(entry, childrenFolder)
|
||||
}
|
||||
resolve()
|
||||
})
|
||||
root.pushChildren(childrenFolder)
|
||||
} else {
|
||||
resolve()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const promises: Promise<void>[] = []
|
||||
|
||||
const items = event.dataTransfer.items
|
||||
// eslint-disable-next-line @typescript-eslint/prefer-for-of
|
||||
for (let i = 0; i < event.dataTransfer.files.length; i++) {
|
||||
const file = event.dataTransfer.files[i]
|
||||
const transfer = new HTMLFileUpload(file)
|
||||
this.fileTransferStarted.next(transfer)
|
||||
result.push(transfer)
|
||||
if (!multiple) {
|
||||
break
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
const item = items[i].webkitGetAsEntry()
|
||||
if (item) {
|
||||
promises.push(traverseFileTree(item))
|
||||
if (!multiple) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
return result
|
||||
return Promise.all(promises).then(() => result)
|
||||
}
|
||||
|
||||
getConfigPath (): string|null {
|
||||
|
@@ -821,7 +821,13 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
if (this.disableDynamicTitle) {
|
||||
return
|
||||
}
|
||||
this.setTitle([...new Set(this.getAllTabs().map(x => x.title))].join(' | '))
|
||||
const titles = [
|
||||
this.getFocusedTab()?.title,
|
||||
...this.getAllTabs()
|
||||
.filter(x => x !== this.getFocusedTab())
|
||||
.map(x => x.title),
|
||||
]
|
||||
this.setTitle([...new Set(titles)].join(' | '))
|
||||
}
|
||||
|
||||
private attachTabView (tab: BaseTabComponent) {
|
||||
@@ -837,6 +843,10 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
})
|
||||
}
|
||||
|
||||
tab.subscribeUntilDestroyed(
|
||||
this.observeUntilChildDetached(tab, tab.focused$),
|
||||
() => this.updateTitle(),
|
||||
)
|
||||
tab.subscribeUntilDestroyed(
|
||||
this.observeUntilChildDetached(tab, tab.titleChange$),
|
||||
() => this.updateTitle(),
|
||||
|
@@ -1,5 +1,5 @@
|
||||
import { Directive, Output, ElementRef, EventEmitter, AfterViewInit } from '@angular/core'
|
||||
import { FileUpload, PlatformService } from '../api/platform'
|
||||
import { DirectoryUpload, PlatformService } from '../api/platform'
|
||||
import './dropZone.directive.scss'
|
||||
|
||||
/** @hidden */
|
||||
@@ -7,7 +7,7 @@ import './dropZone.directive.scss'
|
||||
selector: '[dropZone]',
|
||||
})
|
||||
export class DropZoneDirective implements AfterViewInit {
|
||||
@Output() transfer = new EventEmitter<FileUpload>()
|
||||
@Output() transfer = new EventEmitter<DirectoryUpload>()
|
||||
private dropHint?: HTMLElement
|
||||
|
||||
constructor (
|
||||
@@ -27,11 +27,9 @@ export class DropZoneDirective implements AfterViewInit {
|
||||
})
|
||||
}
|
||||
})
|
||||
this.el.nativeElement.addEventListener('drop', (event: DragEvent) => {
|
||||
this.el.nativeElement.addEventListener('drop', async (event: DragEvent) => {
|
||||
this.removeHint()
|
||||
for (const transfer of this.platform.startUploadFromDragEvent(event, true)) {
|
||||
this.transfer.emit(transfer)
|
||||
}
|
||||
this.transfer.emit(await this.platform.startUploadFromDragEvent(event, true))
|
||||
})
|
||||
this.el.nativeElement.addEventListener('dragleave', () => {
|
||||
this.removeHint()
|
||||
|
@@ -16,7 +16,6 @@ export class ElectronService {
|
||||
clipboard: Clipboard
|
||||
globalShortcut: GlobalShortcut
|
||||
screen: Screen
|
||||
remote = remote
|
||||
process: any
|
||||
autoUpdater: AutoUpdater
|
||||
powerSaveBlocker: PowerSaveBlocker
|
||||
@@ -44,7 +43,6 @@ export class ElectronService {
|
||||
this.BrowserWindow = remote.BrowserWindow
|
||||
this.Menu = remote.Menu
|
||||
this.MenuItem = remote.MenuItem
|
||||
this.MenuItem = remote.MenuItem
|
||||
this.nativeTheme = remote.nativeTheme
|
||||
}
|
||||
}
|
||||
|
@@ -5,7 +5,7 @@ import * as os from 'os'
|
||||
import promiseIpc, { RendererProcessType } from 'electron-promise-ipc'
|
||||
import { execFile } from 'mz/child_process'
|
||||
import { Injectable, NgZone } from '@angular/core'
|
||||
import { PlatformService, ClipboardContent, Platform, MenuItemOptions, MessageBoxOptions, MessageBoxResult, FileUpload, FileDownload, FileUploadOptions, wrapPromise, TranslateService } from 'tabby-core'
|
||||
import { PlatformService, ClipboardContent, Platform, MenuItemOptions, MessageBoxOptions, MessageBoxResult, DirectoryUpload, FileUpload, FileDownload, FileUploadOptions, wrapPromise, TranslateService } from 'tabby-core'
|
||||
import { ElectronService } from '../services/electron.service'
|
||||
import { ElectronHostWindow } from './hostWindow.service'
|
||||
import { ShellIntegrationService } from './shellIntegration.service'
|
||||
@@ -48,6 +48,21 @@ export class ElectronPlatformService extends PlatformService {
|
||||
})
|
||||
}
|
||||
|
||||
async getAllFiles (dir: string, root: DirectoryUpload): Promise<DirectoryUpload> {
|
||||
const items = await fs.readdir(dir, { withFileTypes: true })
|
||||
for (const item of items) {
|
||||
if (item.isDirectory()) {
|
||||
root.pushChildren(await this.getAllFiles(path.join(dir, item.name), new DirectoryUpload(item.name)))
|
||||
} else {
|
||||
const file = new ElectronFileUpload(path.join(dir, item.name), this.electron)
|
||||
root.pushChildren(file)
|
||||
await wrapPromise(this.zone, file.open())
|
||||
this.fileTransferStarted.next(file)
|
||||
}
|
||||
}
|
||||
return root
|
||||
}
|
||||
|
||||
readClipboard (): string {
|
||||
return this.electron.clipboard.readText()
|
||||
}
|
||||
@@ -216,6 +231,28 @@ export class ElectronPlatformService extends PlatformService {
|
||||
}))
|
||||
}
|
||||
|
||||
async startUploadDirectory (paths?: string[]): Promise<DirectoryUpload> {
|
||||
const properties: any[] = ['openFile', 'treatPackageAsDirectory', 'openDirectory']
|
||||
|
||||
if (!paths) {
|
||||
const result = await this.electron.dialog.showOpenDialog(
|
||||
this.hostWindow.getWindow(),
|
||||
{
|
||||
buttonLabel: this.translate.instant('Select'),
|
||||
properties,
|
||||
},
|
||||
)
|
||||
if (result.canceled) {
|
||||
return new DirectoryUpload()
|
||||
}
|
||||
paths = result.filePaths
|
||||
}
|
||||
|
||||
const root = new DirectoryUpload()
|
||||
root.pushChildren(await this.getAllFiles(paths[0].split(path.sep).join(path.posix.sep), new DirectoryUpload(path.basename(paths[0]))))
|
||||
return root
|
||||
}
|
||||
|
||||
async startDownload (name: string, mode: number, size: number, filePath?: string): Promise<FileDownload|null> {
|
||||
if (!filePath) {
|
||||
const result = await this.electron.dialog.showSaveDialog(
|
||||
|
@@ -1,4 +1,3 @@
|
||||
import type { AppUpdater } from 'electron-updater'
|
||||
import { Injectable } from '@angular/core'
|
||||
import axios from 'axios'
|
||||
|
||||
@@ -13,7 +12,6 @@ export class ElectronUpdaterService extends UpdaterService {
|
||||
private downloaded: Promise<boolean>
|
||||
private electronUpdaterAvailable = true
|
||||
private updateURL: string
|
||||
private autoUpdater: AppUpdater
|
||||
|
||||
constructor (
|
||||
log: LogService,
|
||||
@@ -30,32 +28,28 @@ export class ElectronUpdaterService extends UpdaterService {
|
||||
return
|
||||
}
|
||||
|
||||
this.autoUpdater = electron.remote.require('electron-updater').autoUpdater
|
||||
this.autoUpdater.autoDownload = true
|
||||
this.autoUpdater.autoInstallOnAppQuit = false
|
||||
|
||||
this.autoUpdater.on('update-available', () => {
|
||||
this.electron.ipcRenderer.on('updater:update-available', () => {
|
||||
this.logger.info('Update available')
|
||||
})
|
||||
|
||||
this.autoUpdater.on('update-not-available', () => {
|
||||
this.electron.ipcRenderer.on('updater:update-not-available', () => {
|
||||
this.logger.info('No updates')
|
||||
})
|
||||
|
||||
this.autoUpdater.on('error', err => {
|
||||
this.electron.ipcRenderer.on('updater:error', err => {
|
||||
this.logger.error(err)
|
||||
this.electronUpdaterAvailable = false
|
||||
})
|
||||
|
||||
this.downloaded = new Promise<boolean>(resolve => {
|
||||
this.autoUpdater.once('update-downloaded', () => resolve(true))
|
||||
this.electron.ipcRenderer.once('updater:update-downloaded', () => resolve(true))
|
||||
})
|
||||
|
||||
config.ready$.toPromise().then(() => {
|
||||
if (config.store.enableAutomaticUpdates && this.electronUpdaterAvailable && !process.env.TABBY_DEV) {
|
||||
this.logger.debug('Checking for updates')
|
||||
try {
|
||||
this.autoUpdater.checkForUpdates()
|
||||
this.electron.ipcRenderer.send('updater:check-for-updates')
|
||||
} catch (e) {
|
||||
this.electronUpdaterAvailable = false
|
||||
this.logger.info('Electron updater unavailable, falling back', e)
|
||||
@@ -82,26 +76,26 @@ export class ElectronUpdaterService extends UpdaterService {
|
||||
reject(err)
|
||||
}
|
||||
cancel = () => {
|
||||
this.autoUpdater.off('error', onError)
|
||||
this.autoUpdater.off('update-not-available', onNoUpdate)
|
||||
this.autoUpdater.off('update-available', onUpdate)
|
||||
this.electron.ipcRenderer.off('updater:error', onError)
|
||||
this.electron.ipcRenderer.off('updater:update-not-available', onNoUpdate)
|
||||
this.electron.ipcRenderer.off('updater:update-available', onUpdate)
|
||||
}
|
||||
this.autoUpdater.on('error', onError)
|
||||
this.autoUpdater.on('update-not-available', onNoUpdate)
|
||||
this.autoUpdater.on('update-available', onUpdate)
|
||||
this.electron.ipcRenderer.on('updater:error', onError)
|
||||
this.electron.ipcRenderer.on('updater:update-not-available', onNoUpdate)
|
||||
this.electron.ipcRenderer.on('updater:update-available', onUpdate)
|
||||
try {
|
||||
this.autoUpdater.checkForUpdates()
|
||||
this.electron.ipcRenderer.send('updater:check-for-updates')
|
||||
} catch (e) {
|
||||
this.electronUpdaterAvailable = false
|
||||
this.logger.info('Electron updater unavailable, falling back', e)
|
||||
}
|
||||
})
|
||||
|
||||
this.autoUpdater.on('update-available', () => {
|
||||
this.electron.ipcRenderer.on('updater:update-available', () => {
|
||||
this.logger.info('Update available')
|
||||
})
|
||||
|
||||
this.autoUpdater.once('update-not-available', () => {
|
||||
this.electron.ipcRenderer.once('updater:update-not-available', () => {
|
||||
this.logger.info('No updates')
|
||||
})
|
||||
|
||||
@@ -138,7 +132,7 @@ export class ElectronUpdaterService extends UpdaterService {
|
||||
},
|
||||
)).response === 0) {
|
||||
await this.downloaded
|
||||
this.autoUpdater.quitAndInstall()
|
||||
this.electron.ipcRenderer.send('updater:quit-and-install')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -11,8 +11,3 @@ 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==
|
||||
|
||||
xterm-addon-web-links@^0.7.0:
|
||||
version "0.7.0"
|
||||
resolved "https://registry.yarnpkg.com/xterm-addon-web-links/-/xterm-addon-web-links-0.7.0.tgz#dceac36170605f9db10a01d716bd83ee38f65c17"
|
||||
integrity sha512-6PqoqzzPwaeSq22skzbvyboDvSnYk5teUYEoKBwMYvhbkwOQkemZccjWHT5FnNA8o1aInTc4PRYAl4jjPucCKA==
|
||||
|
@@ -23,11 +23,15 @@
|
||||
|
||||
button.btn.btn-link.btn-sm.flex-shrink-0.d-flex((click)='upload()')
|
||||
i.fas.fa-upload.me-1
|
||||
div(translate) Upload
|
||||
div(translate) Upload files
|
||||
|
||||
button.btn.btn-link.btn-sm.flex-shrink-0.d-flex((click)='uploadFolder()')
|
||||
i.fas.fa-upload.me-1
|
||||
div(translate) Upload folder
|
||||
|
||||
button.btn.btn-link.text-decoration-none((click)='close()') !{require('../../../tabby-core/src/icons/times.svg')}
|
||||
|
||||
.body(dropZone, (transfer)='uploadOne($event)')
|
||||
.body(dropZone, (transfer)='uploadOneFolder($event)')
|
||||
a.alert.alert-info.d-flex.align-items-center(
|
||||
*ngIf='shouldShowCWDTip && !cwdDetectionAvailable',
|
||||
(click)='platform.openExternal("https://tabby.sh/go/cwd-detection")'
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import * as C from 'constants'
|
||||
import { posix as path } from 'path'
|
||||
import { Component, Input, Output, EventEmitter, Inject, Optional } from '@angular/core'
|
||||
import { FileUpload, MenuItemOptions, NotificationsService, PlatformService } from 'tabby-core'
|
||||
import { FileUpload, DirectoryUpload, MenuItemOptions, NotificationsService, PlatformService } from 'tabby-core'
|
||||
import { SFTPSession, SFTPFile } from '../session/sftp'
|
||||
import { SSHSession } from '../session/ssh'
|
||||
import { SFTPContextMenuItemProvider } from '../api'
|
||||
@@ -180,6 +180,30 @@ export class SFTPPanelComponent {
|
||||
await Promise.all(transfers.map(t => this.uploadOne(t)))
|
||||
}
|
||||
|
||||
async uploadFolder (): Promise<void> {
|
||||
const transfer = await this.platform.startUploadDirectory()
|
||||
await this.uploadOneFolder(transfer)
|
||||
}
|
||||
|
||||
async uploadOneFolder (transfer: DirectoryUpload, accumPath = ''): Promise<void> {
|
||||
const savedPath = this.path
|
||||
for(const t of transfer.getChildrens()) {
|
||||
if (t instanceof DirectoryUpload) {
|
||||
try {
|
||||
await this.sftp.mkdir(path.posix.join(this.path, accumPath, t.getName()))
|
||||
} catch {
|
||||
// Intentionally ignoring errors from making duplicate dirs.
|
||||
}
|
||||
await this.uploadOneFolder(t, path.posix.join(accumPath, t.getName()))
|
||||
} else {
|
||||
await this.sftp.upload(path.posix.join(this.path, accumPath, t.getName()), t)
|
||||
}
|
||||
}
|
||||
if (this.path === savedPath) {
|
||||
await this.navigate(this.path)
|
||||
}
|
||||
}
|
||||
|
||||
async uploadOne (transfer: FileUpload): Promise<void> {
|
||||
const savedPath = this.path
|
||||
await this.sftp.upload(path.join(this.path, transfer.getName()), transfer)
|
||||
|
@@ -9,15 +9,22 @@
|
||||
dependencies:
|
||||
ipv6 "*"
|
||||
|
||||
"@types/node@*", "@types/node@20.3.1":
|
||||
"@types/node@*":
|
||||
version "22.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-22.1.0.tgz#6d6adc648b5e03f0e83c78dc788c2b037d0ad94b"
|
||||
integrity sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==
|
||||
dependencies:
|
||||
undici-types "~6.13.0"
|
||||
|
||||
"@types/node@20.3.1":
|
||||
version "20.3.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe"
|
||||
integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==
|
||||
|
||||
"@types/ssh2-streams@*":
|
||||
version "0.1.8"
|
||||
resolved "https://registry.yarnpkg.com/@types/ssh2-streams/-/ssh2-streams-0.1.8.tgz#142af404dae059931aea7fcd1511b5478964feb6"
|
||||
integrity sha512-I7gixRPUvVIyJuCEvnmhr3KvA2dC0639kKswqD4H5b4/FOcnPtNU+qWLiXdKIqqX9twUvi5j0U1mwKE5CUsrfA==
|
||||
version "0.1.12"
|
||||
resolved "https://registry.yarnpkg.com/@types/ssh2-streams/-/ssh2-streams-0.1.12.tgz#e68795ba2bf01c76b93f9c9809e1f42f0eaaec5f"
|
||||
integrity sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
@@ -337,6 +344,11 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0:
|
||||
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
|
||||
integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
|
||||
|
||||
undici-types@~6.13.0:
|
||||
version "6.13.0"
|
||||
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.13.0.tgz#e3e79220ab8c81ed1496b5812471afd7cf075ea5"
|
||||
integrity sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==
|
||||
|
||||
winston@0.8.x:
|
||||
version "0.8.3"
|
||||
resolved "https://registry.yarnpkg.com/winston/-/winston-0.8.3.tgz#64b6abf4cd01adcaefd5009393b1d8e8bec19db0"
|
||||
|
@@ -13,6 +13,7 @@ import { ResizeEvent, BaseTerminalProfile } from './interfaces'
|
||||
import { TerminalDecorator } from './decorator'
|
||||
import { SearchPanelComponent } from '../components/searchPanel.component'
|
||||
import { MultifocusService } from '../services/multifocus.service'
|
||||
import { getTerminalBackgroundColor } from '../helpers'
|
||||
|
||||
|
||||
const INACTIVE_TAB_UNLOAD_DELAY = 1000 * 30
|
||||
@@ -575,14 +576,7 @@ export class BaseTerminalTabComponent<P extends BaseTerminalProfile> extends Bas
|
||||
configure (): void {
|
||||
this.frontend?.configure(this.profile)
|
||||
|
||||
if (!this.themes.findCurrentTheme().followsColorScheme && this.config.store.terminal.background === 'colorScheme') {
|
||||
const scheme = this.profile.terminalColorScheme ?? this.config.store.terminal.colorScheme
|
||||
if (scheme.background) {
|
||||
this.backgroundColor = scheme.background
|
||||
}
|
||||
} else {
|
||||
this.backgroundColor = null
|
||||
}
|
||||
this.backgroundColor = getTerminalBackgroundColor(this.config, this.themes, this.profile.terminalColorScheme)
|
||||
}
|
||||
|
||||
zoomIn (): void {
|
||||
|
@@ -1,3 +1,4 @@
|
||||
import deepEqual from 'deep-equal'
|
||||
import { BehaviorSubject, filter, firstValueFrom, takeUntil } from 'rxjs'
|
||||
import { Injector } from '@angular/core'
|
||||
import { ConfigService, getCSSFontFamily, getWindows10Build, HostAppService, HotkeysService, Platform, PlatformService, ThemesService } from 'tabby-core'
|
||||
@@ -11,9 +12,9 @@ import { Unicode11Addon } from '@xterm/addon-unicode11'
|
||||
import { SerializeAddon } from '@xterm/addon-serialize'
|
||||
import { ImageAddon } from '@xterm/addon-image'
|
||||
import { CanvasAddon } from '@xterm/addon-canvas'
|
||||
import './xterm.css'
|
||||
import deepEqual from 'deep-equal'
|
||||
import { BaseTerminalProfile, TerminalColorScheme } from '../api/interfaces'
|
||||
import { getTerminalBackgroundColor } from '../helpers'
|
||||
import './xterm.css'
|
||||
|
||||
const COLOR_NAMES = [
|
||||
'black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white',
|
||||
@@ -361,21 +362,21 @@ export class XTermFrontend extends Frontend {
|
||||
}
|
||||
|
||||
private configureColors (scheme: TerminalColorScheme|undefined): void {
|
||||
const config = this.configService.store
|
||||
const appColorScheme = this.themes._getActiveColorScheme() as TerminalColorScheme
|
||||
|
||||
scheme = scheme ?? this.themes._getActiveColorScheme()
|
||||
scheme = scheme ?? appColorScheme
|
||||
|
||||
const theme: ITheme = {
|
||||
foreground: scheme!.foreground,
|
||||
selectionBackground: scheme!.selection ?? '#88888888',
|
||||
selectionForeground: scheme!.selectionForeground ?? undefined,
|
||||
background: !this.themes.findCurrentTheme().followsColorScheme && config.terminal.background === 'colorScheme' ? scheme!.background : '#00000000',
|
||||
cursor: scheme!.cursor,
|
||||
cursorAccent: scheme!.cursorAccent,
|
||||
foreground: scheme.foreground,
|
||||
selectionBackground: scheme.selection ?? '#88888888',
|
||||
selectionForeground: scheme.selectionForeground ?? undefined,
|
||||
background: getTerminalBackgroundColor(this.configService, this.themes, scheme) ?? '#00000000',
|
||||
cursor: scheme.cursor,
|
||||
cursorAccent: scheme.cursorAccent,
|
||||
}
|
||||
|
||||
for (let i = 0; i < COLOR_NAMES.length; i++) {
|
||||
theme[COLOR_NAMES[i]] = scheme!.colors[i]
|
||||
theme[COLOR_NAMES[i]] = scheme.colors[i]
|
||||
}
|
||||
|
||||
if (!deepEqual(this.configuredTheme, theme)) {
|
||||
|
21
tabby-terminal/src/helpers.ts
Normal file
21
tabby-terminal/src/helpers.ts
Normal file
@@ -0,0 +1,21 @@
|
||||
import { TerminalColorScheme } from './api/interfaces'
|
||||
import { ConfigService, ThemesService } from 'tabby-core'
|
||||
|
||||
export function getTerminalBackgroundColor (
|
||||
config: ConfigService,
|
||||
themes: ThemesService,
|
||||
scheme?: TerminalColorScheme,
|
||||
): string|null {
|
||||
const appTheme = themes.findCurrentTheme()
|
||||
const appColorScheme = themes._getActiveColorScheme() as TerminalColorScheme
|
||||
|
||||
// Use non transparent background when:
|
||||
// - legacy theme and user choses colorScheme based BG
|
||||
// - or new theme but profile-specific scheme is used
|
||||
const shouldUseCSBackground =
|
||||
!appTheme.followsColorScheme && config.store.terminal.background === 'colorScheme'
|
||||
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
||||
|| appTheme.followsColorScheme && scheme?.name !== appColorScheme.name
|
||||
|
||||
return shouldUseCSBackground && scheme ? scheme.background : null
|
||||
}
|
@@ -2,7 +2,7 @@ import '@vaadin/vaadin-context-menu'
|
||||
import copyToClipboard from 'copy-text-to-clipboard'
|
||||
import { Injectable, Inject } from '@angular/core'
|
||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
||||
import { PlatformService, ClipboardContent, MenuItemOptions, MessageBoxOptions, MessageBoxResult, FileUpload, FileUploadOptions, FileDownload, HTMLFileUpload } from 'tabby-core'
|
||||
import { PlatformService, ClipboardContent, MenuItemOptions, MessageBoxOptions, MessageBoxResult, FileUpload, FileUploadOptions, FileDownload, HTMLFileUpload, DirectoryUpload } from 'tabby-core'
|
||||
|
||||
// eslint-disable-next-line no-duplicate-imports
|
||||
import type { ContextMenuElement, ContextMenuItem } from '@vaadin/vaadin-context-menu'
|
||||
@@ -135,6 +135,10 @@ export class WebPlatformService extends PlatformService {
|
||||
})
|
||||
}
|
||||
|
||||
async startUploadDirectory (_paths?: string[]): Promise<DirectoryUpload> {
|
||||
return new DirectoryUpload()
|
||||
}
|
||||
|
||||
setErrorHandler (handler: (_: any) => void): void {
|
||||
window.addEventListener('error', handler)
|
||||
}
|
||||
|
63
yarn.lock
63
yarn.lock
@@ -863,10 +863,12 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe"
|
||||
integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==
|
||||
|
||||
"@types/node@^18.11.18":
|
||||
version "18.17.12"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.12.tgz#c6bd7413a13e6ad9cfb7e97dd5c4e904c1821e50"
|
||||
integrity sha512-d6xjC9fJ/nSnfDeU0AMDsaJyb1iHsqCSOdi84w4u+SlN/UgQdY5tRhpMzaFYsI4mnpvgTivEaQd0yOUhAtOnEQ==
|
||||
"@types/node@^20.9.0":
|
||||
version "20.14.14"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.14.tgz#6b655d4a88623b0edb98300bb9dd2107225f885e"
|
||||
integrity sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==
|
||||
dependencies:
|
||||
undici-types "~5.26.4"
|
||||
|
||||
"@types/parse5@^5":
|
||||
version "5.0.3"
|
||||
@@ -2505,13 +2507,13 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
||||
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
|
||||
|
||||
cpu-features@~0.0.8:
|
||||
version "0.0.8"
|
||||
resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.8.tgz#a2d464b023b8ad09004c8cdca23b33f192f63546"
|
||||
integrity sha512-BbHBvtYhUhksqTjr6bhNOjGgMnhwhGTQmOoZGD+K7BCaQDCuZl/Ve1ZxUSMRwVC4D/rkCPQ2MAIeYzrWyK7eEg==
|
||||
cpu-features@~0.0.9:
|
||||
version "0.0.10"
|
||||
resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.10.tgz#9aae536db2710c7254d7ed67cb3cbc7d29ad79c5"
|
||||
integrity sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==
|
||||
dependencies:
|
||||
buildcheck "~0.0.6"
|
||||
nan "^2.17.0"
|
||||
nan "^2.19.0"
|
||||
|
||||
crc@^3.8.0:
|
||||
version "3.8.0"
|
||||
@@ -3071,13 +3073,13 @@ electron-to-chromium@^1.4.284:
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.286.tgz#0e039de59135f44ab9a8ec9025e53a9135eba11f"
|
||||
integrity sha512-Vp3CVhmYpgf4iXNKAucoQUDcCrBQX3XLBtwgFqP9BUXuucgvAV9zWp1kYU7LL9j4++s9O+12cb3wMtN4SJy6UQ==
|
||||
|
||||
electron@^27.0.4:
|
||||
version "27.1.0"
|
||||
resolved "https://registry.yarnpkg.com/electron/-/electron-27.1.0.tgz#d759885e552d7d926526cfc433ab312796f74a9a"
|
||||
integrity sha512-XPdJiO475QJ8cx59/goWNNWnlV0vab+Ut3occymos7VDxkHV5mFrlW6tcGi+M3bW6gBfwpJocWMng8tw542vww==
|
||||
electron@^29:
|
||||
version "29.4.5"
|
||||
resolved "https://registry.yarnpkg.com/electron/-/electron-29.4.5.tgz#b83bbeee6fc722dbbaab30d3a6bc8e982c9ab98d"
|
||||
integrity sha512-DlEuzGbWBYl1Qr0qUYgNZdoixJg4YGHy2HC6fkRjSXSlb01UrQ5ORi8hNLzelzyYx8rNQyyE3zDUuk9EnZwYuA==
|
||||
dependencies:
|
||||
"@electron/get" "^2.0.0"
|
||||
"@types/node" "^18.11.18"
|
||||
"@types/node" "^20.9.0"
|
||||
extract-zip "^2.0.1"
|
||||
|
||||
elliptic@^6.5.3:
|
||||
@@ -5621,10 +5623,10 @@ lzma-native@^8.0.5, lzma-native@^8.0.6:
|
||||
node-gyp-build "^4.2.1"
|
||||
readable-stream "^3.6.0"
|
||||
|
||||
macos-release@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-3.1.0.tgz#6165bb0736ae567ed6649e36ce6a24d87cbb7aca"
|
||||
integrity sha512-/M/R0gCDgM+Cv1IuBG1XGdfTFnMEG6PZeT+KGWHO/OG+imqmaD9CH5vHBTycEM3+Kc4uG2Il+tFAuUWLqQOeUA==
|
||||
macos-release@^3.3.0:
|
||||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-3.3.0.tgz#92cb67bc66d67c3fde4a9e14f5f909afa418b072"
|
||||
integrity sha512-tPJQ1HeyiU2vRruNGhZ+VleWuMQRro8iFtJxYgnS4NQe+EukKF6aGiIT+7flZhISAt2iaXBCfFGvAyif7/f8nQ==
|
||||
|
||||
magic-string@^0.27.0:
|
||||
version "0.27.0"
|
||||
@@ -5983,7 +5985,7 @@ mute-stream@~0.0.4:
|
||||
resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz"
|
||||
integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
|
||||
|
||||
nan@2.17.0, nan@^2.17.0:
|
||||
nan@2.17.0, nan@^2.18.0, nan@^2.19.0:
|
||||
version "2.17.0"
|
||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb"
|
||||
integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==
|
||||
@@ -6028,10 +6030,10 @@ no-case@^3.0.4:
|
||||
lower-case "^2.0.2"
|
||||
tslib "^2.0.3"
|
||||
|
||||
node-abi@^3.0.0, node-abi@^3.51.0:
|
||||
version "3.51.0"
|
||||
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.51.0.tgz#970bf595ef5a26a271307f8a4befa02823d4e87d"
|
||||
integrity sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==
|
||||
node-abi@^3.0.0, node-abi@^3.65.0:
|
||||
version "3.65.0"
|
||||
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.65.0.tgz#ca92d559388e1e9cab1680a18c1a18757cdac9d3"
|
||||
integrity sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==
|
||||
dependencies:
|
||||
semver "^7.3.5"
|
||||
|
||||
@@ -8219,15 +8221,15 @@ sprintf-js@~1.0.2:
|
||||
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
|
||||
|
||||
ssh2@^1.14.0:
|
||||
version "1.14.0"
|
||||
resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.14.0.tgz#8f68440e1b768b66942c9e4e4620b2725b3555bb"
|
||||
integrity sha512-AqzD1UCqit8tbOKoj6ztDDi1ffJZ2rV2SwlgrVVrHPkV5vWqGJOVp5pmtj18PunkPJAuKQsnInyKV+/Nb2bUnA==
|
||||
version "1.15.0"
|
||||
resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.15.0.tgz#2f998455036a7f89e0df5847efb5421748d9871b"
|
||||
integrity sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==
|
||||
dependencies:
|
||||
asn1 "^0.2.6"
|
||||
bcrypt-pbkdf "^1.0.2"
|
||||
optionalDependencies:
|
||||
cpu-features "~0.0.8"
|
||||
nan "^2.17.0"
|
||||
cpu-features "~0.0.9"
|
||||
nan "^2.18.0"
|
||||
|
||||
sshpk@^1.7.0:
|
||||
version "1.16.1"
|
||||
@@ -8926,6 +8928,11 @@ unbox-primitive@^1.0.2:
|
||||
has-symbols "^1.0.3"
|
||||
which-boxed-primitive "^1.0.2"
|
||||
|
||||
undici-types@~5.26.4:
|
||||
version "5.26.5"
|
||||
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
|
||||
integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
|
||||
|
||||
unique-filename@^1.1.0, unique-filename@~1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz"
|
||||
|
Reference in New Issue
Block a user