mirror of
https://github.com/Eugeny/tabby.git
synced 2025-07-31 22:46:58 +00:00
Compare commits
52 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c61be3d52b | ||
![]() |
0452f42c41 | ||
![]() |
6197215500 | ||
![]() |
6d0293975d | ||
![]() |
30a8a8d287 | ||
![]() |
1198ede0fd | ||
![]() |
90affc3efb | ||
![]() |
3b25645154 | ||
![]() |
30265699d4 | ||
![]() |
63355d1a74 | ||
![]() |
52c37f8988 | ||
![]() |
0ed6575213 | ||
![]() |
406baafd8d | ||
![]() |
45e6844931 | ||
![]() |
4db4d49187 | ||
![]() |
8a1a3ce002 | ||
![]() |
77a2113411 | ||
![]() |
fce8565835 | ||
![]() |
5a894ebfd3 | ||
![]() |
353b9b5ec8 | ||
![]() |
009c2e9478 | ||
![]() |
8ee2bff9a8 | ||
![]() |
395bcbc2cb | ||
![]() |
9ef870e793 | ||
![]() |
51eb616750 | ||
![]() |
33c32d8c28 | ||
![]() |
e29e39b5e4 | ||
![]() |
effe66f5b7 | ||
![]() |
a907978825 | ||
![]() |
f42d4e0eb4 | ||
![]() |
f0628e68d5 | ||
![]() |
b3b6ca6f43 | ||
![]() |
722f91da0c | ||
![]() |
655079741a | ||
![]() |
307f598be0 | ||
![]() |
3aeac5610b | ||
![]() |
d1b10fefae | ||
![]() |
a1172cff6a | ||
![]() |
ab8d61067d | ||
![]() |
f36c7e5e3f | ||
![]() |
0839b51837 | ||
![]() |
a9c36e695b | ||
![]() |
cdf8bb34fa | ||
![]() |
fe3a1a58f6 | ||
![]() |
cedbadee39 | ||
![]() |
55b1792720 | ||
![]() |
75db896e0b | ||
![]() |
acc4eddf8f | ||
![]() |
93f58bb7aa | ||
![]() |
8cc934ad5f | ||
![]() |
a96745b2a7 | ||
![]() |
560045f69d |
@@ -388,6 +388,15 @@
|
||||
"contributions": [
|
||||
"design"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "ydcool",
|
||||
"name": "Dominic Yin",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/5668295?v=4",
|
||||
"profile": "https://github.com/ydcool",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
}
|
||||
],
|
||||
"contributorsPerLine": 7,
|
||||
|
10
.github/workflows/macos.yml
vendored
10
.github/workflows/macos.yml
vendored
@@ -34,6 +34,12 @@ jobs:
|
||||
env:
|
||||
ARCH: ${{matrix.arch}}
|
||||
|
||||
- name: Build native deps
|
||||
run: |
|
||||
rm -rf app/node_modules/cpu-features
|
||||
rm -rf app/node_modules/ssh2/crypto/build
|
||||
if: ${{ matrix.arch == 'arm64' }}
|
||||
|
||||
- name: Webpack
|
||||
run: yarn run build
|
||||
|
||||
@@ -46,7 +52,7 @@ jobs:
|
||||
|
||||
- name: Build and sign packages
|
||||
run: scripts/build-macos.js
|
||||
if: github.repository == 'Eugeny/terminus' && github.event_name == 'push'
|
||||
if: github.repository == 'Eugeny/terminus' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags'))
|
||||
env:
|
||||
ARCH: ${{matrix.arch}}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -59,7 +65,7 @@ jobs:
|
||||
|
||||
- name: Build packages without signing
|
||||
run: scripts/build-macos.js
|
||||
if: github.repository != 'Eugeny/terminus' || github.event_name != 'push'
|
||||
if: "! (github.repository == 'Eugeny/terminus' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags')))"
|
||||
env:
|
||||
ARCH: ${{matrix.arch}}
|
||||
# DEBUG: electron-builder,electron-builder:*
|
||||
|
4
.github/workflows/windows.yml
vendored
4
.github/workflows/windows.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
||||
|
||||
- name: Build and sign packages
|
||||
run: node scripts/build-windows.js
|
||||
if: github.repository == 'Eugeny/terminus' && github.event_name == 'push'
|
||||
if: github.repository == 'Eugeny/terminus' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags'))
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }}
|
||||
@@ -35,7 +35,7 @@ jobs:
|
||||
|
||||
- name: Build packages without signing
|
||||
run: node scripts/build-windows.js
|
||||
if: github.repository != 'Eugeny/terminus' || github.event_name != 'push'
|
||||
if: "!(github.repository == 'Eugeny/terminus' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags')))"
|
||||
|
||||
- name: Upload symbols
|
||||
run: |
|
||||
|
39
.vscode/launch.json
vendored
Normal file
39
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"name": "Electron: Main",
|
||||
"protocol": "inspector",
|
||||
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
|
||||
"env": {
|
||||
"TERMINUS_DEV": "1"
|
||||
},
|
||||
"runtimeArgs": [
|
||||
"--remote-debugging-port=9223",
|
||||
"app"
|
||||
],
|
||||
"windows": {
|
||||
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Electron: Renderer",
|
||||
"type": "pwa-chrome",
|
||||
"request": "attach",
|
||||
"port": 9223,
|
||||
"webRoot": "${workspaceFolder}",
|
||||
"timeout": 30000
|
||||
}
|
||||
],
|
||||
"compounds": [
|
||||
{
|
||||
"name": "Electron: All",
|
||||
"configurations": [
|
||||
"Electron: Main",
|
||||
"Electron: Renderer"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
35
HACKING.md
35
HACKING.md
@@ -4,15 +4,24 @@ Terminus is an Electron app, with the frontend written in Typescript with the he
|
||||
|
||||
# Getting started
|
||||
|
||||
First of all, clone this repository. You'll also need a recent version of Node installed.
|
||||
First of all, clone this repository. You'll also need Node.js 14 or newer and Yarn.
|
||||
|
||||
First, install the dependencies:
|
||||
|
||||
```
|
||||
# macOS/Linux:
|
||||
# macOS:
|
||||
yarn
|
||||
./scripts/build-native.js
|
||||
```
|
||||
|
||||
```
|
||||
# Linux (Debian here as an example)
|
||||
sudo apt install libfontconfig-dev libsecret-1-dev bsdtar libnss3 libatk1.0-0 libatk-bridge2.0-0 libgdk-pixbuf2.0-0 libgtk-3-0 libgbm1
|
||||
yarn
|
||||
./scripts/build-native.js
|
||||
```
|
||||
|
||||
```
|
||||
# Windows:
|
||||
npm -g install windows-build-tools
|
||||
yarn
|
||||
@@ -31,6 +40,22 @@ Start Terminus with
|
||||
yarn start
|
||||
```
|
||||
|
||||
# Building an installer
|
||||
|
||||
To build an installer, first complete a "normal" build as described above and then run:
|
||||
|
||||
```
|
||||
node scripts/prepackage-plugins.js
|
||||
|
||||
node scripts/build-windows.js
|
||||
# or
|
||||
node scripts/build-linux.js
|
||||
# or
|
||||
node scripts/build-macos.js
|
||||
```
|
||||
|
||||
The artifacts will be produced in the `dist` folder.
|
||||
|
||||
# Project layout
|
||||
```
|
||||
terminus
|
||||
@@ -43,11 +68,11 @@ terminus
|
||||
├─ terminus-community-color-schemes # Plugin that provides color schemes
|
||||
├─ terminus-core # Plugin that provides base UI and tab management
|
||||
├─ terminus-electron # Plugin that provides Electron-specific functions
|
||||
└─ terminus-local # Plugin that provides local shells and profiles
|
||||
├─ terminus-local # Plugin that provides local shells and profiles
|
||||
├─ terminus-plugin-manager # Plugin that installs other plugins
|
||||
├─ terminus-settings # Plugin that provides the settings tab
|
||||
└─ terminus-terminal # Plugin that provides terminal tabs
|
||||
├─ terminus-web # Plugin that provides web-specific functions
|
||||
├─ terminus-terminal # Plugin that provides terminal tabs
|
||||
└─ terminus-web # Plugin that provides web-specific functions
|
||||
```
|
||||
|
||||
# Plugin layout
|
||||
|
@@ -177,6 +177,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
||||
<td align="center"><a href="https://github.com/starxg"><img src="https://avatars.githubusercontent.com/u/34997494?v=4?s=100" width="100px;" alt=""/><br /><sub><b>starxg</b></sub></a><br /><a href="#plugin-starxg" title="Plugin/utility libraries">🔌</a></td>
|
||||
<td align="center"><a href="http://hashnote.net/"><img src="https://avatars.githubusercontent.com/u/546312?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alisue</b></sub></a><br /><a href="#design-lambdalisue" title="Design">🎨</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/ydcool"><img src="https://avatars.githubusercontent.com/u/5668295?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dominic Yin</b></sub></a><br /><a href="https://github.com/Eugeny/terminus/commits?author=ydcool" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
|
@@ -304,17 +304,6 @@ export class Window {
|
||||
})
|
||||
})
|
||||
|
||||
ipcMain.on('window-toggle-maximize', event => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
}
|
||||
if (this.window.isMaximized()) {
|
||||
this.window.unmaximize()
|
||||
} else {
|
||||
this.window.maximize()
|
||||
}
|
||||
})
|
||||
|
||||
ipcMain.on('window-minimize', event => {
|
||||
if (!this.window || event.sender !== this.window.webContents) {
|
||||
return
|
||||
|
@@ -21,14 +21,14 @@
|
||||
"@angular/forms": "^12.0.0",
|
||||
"@angular/platform-browser": "^12.0.0",
|
||||
"@angular/platform-browser-dynamic": "^12.0.0",
|
||||
"@electron/remote": "1.0.4",
|
||||
"@electron/remote": "1.2.0",
|
||||
"@ng-bootstrap/ng-bootstrap": "^9.1.1",
|
||||
"@terminus-term/node-pty": "0.10.0-terminus.3",
|
||||
"any-promise": "^1.3.0",
|
||||
"electron-config": "2.0.0",
|
||||
"electron-debug": "^3.2.0",
|
||||
"electron-promise-ipc": "^2.2.4",
|
||||
"fontmanager-redux": "1.0.0",
|
||||
"fontmanager-redux": "1.1.0",
|
||||
"glasstron": "0.0.7",
|
||||
"js-yaml": "4.1.0",
|
||||
"keytar": "^7.7.0",
|
||||
@@ -37,13 +37,12 @@
|
||||
"ngx-toastr": "^14.0.0",
|
||||
"npm": "6",
|
||||
"rxjs": "^7.1.0",
|
||||
"ssh2": "^1.1.0",
|
||||
"yargs": "^17.0.1",
|
||||
"zone.js": "^0.11.4"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"macos-native-processlist": "^2.0.0",
|
||||
"serialport": "^9.1.0",
|
||||
"serialport": "^9.2.0",
|
||||
"windows-blurbehind": "^1.0.1",
|
||||
"windows-native-registry": "^3.0.0",
|
||||
"windows-process-tree": "^0.3.0"
|
||||
|
@@ -51,10 +51,10 @@
|
||||
dependencies:
|
||||
tslib "^2.1.0"
|
||||
|
||||
"@electron/remote@1.0.4":
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-1.0.4.tgz#f1c8cf3560bab762b462bfae9991919cced8bc33"
|
||||
integrity sha512-kguDJRhL3ZynHrkbX8Tr7xoAzGsNgh4eqXkycXb6cgXbOgehGqkBVe+MnjSVMXz3QJykerGKPy28gqcM7AFGYw==
|
||||
"@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==
|
||||
|
||||
"@iarna/cli@^1.2.0":
|
||||
version "1.2.0"
|
||||
@@ -79,7 +79,7 @@
|
||||
dependencies:
|
||||
debug "^4.3.1"
|
||||
|
||||
"@serialport/binding-mock@^9.0.7":
|
||||
"@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==
|
||||
@@ -87,10 +87,10 @@
|
||||
"@serialport/binding-abstract" "^9.0.7"
|
||||
debug "^4.3.1"
|
||||
|
||||
"@serialport/bindings@^9.1.0":
|
||||
version "9.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/bindings/-/bindings-9.1.0.tgz#bb4c2778118a4404fd38749b64c0fe533d72003a"
|
||||
integrity sha512-X0GM5iZgrBkR1HwoSDsJ/AJ+M61end5Ttg5mqcaUkwGCKpgJSDW3STX6pvFNr9xNzvqS56yuhAcU/eNJ2xuDaA==
|
||||
"@serialport/bindings@^9.2.0":
|
||||
version "9.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@serialport/bindings/-/bindings-9.2.0.tgz#de6df688d0ff99bdbb86ea6db412562cb2d9ebe7"
|
||||
integrity sha512-s9EKHDZjLHipHhypxy6pz2XsoI1fPiOGU+X13AIGdQfoe7I6piEyhJ2znNgXMugMe43OxNk0/CmuVMzzcw1lmQ==
|
||||
dependencies:
|
||||
"@serialport/binding-abstract" "^9.0.7"
|
||||
"@serialport/parser-readline" "^9.0.7"
|
||||
@@ -99,44 +99,44 @@
|
||||
nan "^2.14.2"
|
||||
prebuild-install "^6.0.1"
|
||||
|
||||
"@serialport/parser-byte-length@^9.0.7":
|
||||
"@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-cctalk@^9.0.7":
|
||||
"@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-delimiter@^9.0.7":
|
||||
"@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-inter-byte-timeout@^9.0.7":
|
||||
"@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-readline@^9.0.7":
|
||||
"@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==
|
||||
dependencies:
|
||||
"@serialport/parser-delimiter" "^9.0.7"
|
||||
|
||||
"@serialport/parser-ready@^9.0.7":
|
||||
"@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-regex@^9.0.7":
|
||||
"@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/stream@^9.0.7":
|
||||
"@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==
|
||||
@@ -295,7 +295,7 @@ asap@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz"
|
||||
integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
|
||||
|
||||
asn1@^0.2.4, asn1@~0.2.3:
|
||||
asn1@~0.2.3:
|
||||
version "0.2.4"
|
||||
resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz"
|
||||
integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
|
||||
@@ -332,7 +332,7 @@ base64-js@^1.3.1:
|
||||
resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
|
||||
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
|
||||
|
||||
bcrypt-pbkdf@^1.0.0, bcrypt-pbkdf@^1.0.2:
|
||||
bcrypt-pbkdf@^1.0.0:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz"
|
||||
integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
|
||||
@@ -686,13 +686,6 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz"
|
||||
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
|
||||
|
||||
cpu-features@0.0.2:
|
||||
version "0.0.2"
|
||||
resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.2.tgz#9f636156f1155fd04bdbaa028bb3c2fbef3cea7a"
|
||||
integrity sha512-/2yieBqvMcRj8McNzkycjW2v3OIUOibBfd2dLEJ0nWts8NobAxwiyw9phVNS6oDL8x8tz9F7uNVFEVpJncQpeA==
|
||||
dependencies:
|
||||
nan "^2.14.1"
|
||||
|
||||
create-error-class@^3.0.0:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
|
||||
@@ -1088,10 +1081,10 @@ flush-write-stream@^1.0.0:
|
||||
inherits "^2.0.3"
|
||||
readable-stream "^2.3.6"
|
||||
|
||||
fontmanager-redux@1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmjs.org/fontmanager-redux/-/fontmanager-redux-1.0.0.tgz"
|
||||
integrity sha512-kXZel+PAWxS+bgFIlycUYWkmVpvN3SUodDeNaFNW7BloU5pqibBR395Ww+gLBnt51S9KnmHT2/+DzCMGbag0aw==
|
||||
fontmanager-redux@1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/fontmanager-redux/-/fontmanager-redux-1.1.0.tgz#b1e97bc5c982df81749596fd48348f8318595bb3"
|
||||
integrity sha512-cQtSfi7ZCW831XuGwoKIrO/cCBLhOvWK56adSr/Yl/fzB5omunW+XQmXlYHNKS7qWzOZe2Z6xQ8ZFt120Uj2lA==
|
||||
dependencies:
|
||||
node-addon-api "^3.0.2"
|
||||
|
||||
@@ -2088,7 +2081,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.1, nan@^2.14.2:
|
||||
nan@^2.13.2, nan@^2.14.0, nan@^2.14.2:
|
||||
version "2.14.2"
|
||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19"
|
||||
integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==
|
||||
@@ -3064,21 +3057,21 @@ serialize-error@^5.0.0:
|
||||
dependencies:
|
||||
type-fest "^0.8.0"
|
||||
|
||||
serialport@^9.1.0:
|
||||
version "9.1.0"
|
||||
resolved "https://registry.yarnpkg.com/serialport/-/serialport-9.1.0.tgz#f8b9dc87e6713e1e0198752f6e2cce95aaf5a6ab"
|
||||
integrity sha512-W17ji2TOotufIUCXIWcB6P+RztO1S4BcWsAc99jQn5BaH3Kw6xUyOX2ng0ZQ+hPjS/WWI2CdWynf4bKRJKD/+A==
|
||||
serialport@^9.2.0:
|
||||
version "9.2.0"
|
||||
resolved "https://registry.yarnpkg.com/serialport/-/serialport-9.2.0.tgz#17a8364979f3c06a54a7bf4e8cbb8ebc91e54511"
|
||||
integrity sha512-C6AQ4jD4mre3tn3QA+atn++mEZDh4r40CIeh1sKhskKE+Q4eiIr/nzVMOiPxHb8gskrSNxujH+Br49tl3i9s9g==
|
||||
dependencies:
|
||||
"@serialport/binding-mock" "^9.0.7"
|
||||
"@serialport/bindings" "^9.1.0"
|
||||
"@serialport/parser-byte-length" "^9.0.7"
|
||||
"@serialport/parser-cctalk" "^9.0.7"
|
||||
"@serialport/parser-delimiter" "^9.0.7"
|
||||
"@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"
|
||||
"@serialport/binding-mock" "9.0.7"
|
||||
"@serialport/bindings" "^9.2.0"
|
||||
"@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"
|
||||
|
||||
set-blocking@^2.0.0, set-blocking@~2.0.0:
|
||||
@@ -3207,17 +3200,6 @@ split-on-first@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f"
|
||||
integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==
|
||||
|
||||
ssh2@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.1.0.tgz#43dd24930e15e317687f519d6b40270d9cd00d00"
|
||||
integrity sha512-CidQLG2ZacoT0Z7O6dOyisj4JdrOrLVJ4KbHjVNz9yI1vO08FAYQPcnkXY9BP8zeYo+J/nBgY6Gg4R7w4WFWtg==
|
||||
dependencies:
|
||||
asn1 "^0.2.4"
|
||||
bcrypt-pbkdf "^1.0.2"
|
||||
optionalDependencies:
|
||||
cpu-features "0.0.2"
|
||||
nan "^2.14.2"
|
||||
|
||||
sshpk@^1.7.0:
|
||||
version "1.16.1"
|
||||
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz"
|
||||
|
@@ -33,7 +33,7 @@ extraResources:
|
||||
- builtin-plugins
|
||||
- extras
|
||||
asarUnpack:
|
||||
- dist/*.map
|
||||
- 'dist/*.map'
|
||||
publish:
|
||||
- provider: github
|
||||
|
||||
|
19
package.json
19
package.json
@@ -11,20 +11,20 @@
|
||||
"@types/node": "15.6.1",
|
||||
"@types/webpack-env": "^1.16.0",
|
||||
"@typescript-eslint/eslint-plugin": "^4.25.0",
|
||||
"@typescript-eslint/parser": "^4.26.0",
|
||||
"@typescript-eslint/parser": "^4.28.0",
|
||||
"apply-loader": "2.0.0",
|
||||
"awesome-typescript-loader": "^5.2.1",
|
||||
"compare-versions": "^3.6.0",
|
||||
"core-js": "^3.14.0",
|
||||
"cross-env": "7.0.3",
|
||||
"css-loader": "5.2.6",
|
||||
"electron": "13.1.1",
|
||||
"electron": "13.1.4",
|
||||
"electron-builder": "22.10.5",
|
||||
"electron-download": "^4.1.1",
|
||||
"electron-installer-snap": "^5.1.0",
|
||||
"electron-notarize": "^1.0.0",
|
||||
"electron-rebuild": "^2.3.5",
|
||||
"eslint": "^7.27.0",
|
||||
"eslint": "^7.29.0",
|
||||
"eslint-plugin-import": "^2.23.4",
|
||||
"file-loader": "^6.2.0",
|
||||
"graceful-fs": "^4.2.6",
|
||||
@@ -33,7 +33,7 @@
|
||||
"lru-cache": "^6.0.0",
|
||||
"macos-release": "^2.5.0",
|
||||
"node-abi": "^2.30.0",
|
||||
"node-sass": "^6.0.0",
|
||||
"node-sass": "^6.0.1",
|
||||
"npmlog": "4.1.2",
|
||||
"npx": "^10.2.2",
|
||||
"patch-package": "^6.4.7",
|
||||
@@ -43,18 +43,18 @@
|
||||
"pug-loader": "^2.4.0",
|
||||
"pug-static-loader": "2.0.0",
|
||||
"raw-loader": "4.0.2",
|
||||
"sass-loader": "^12.0.0",
|
||||
"sass-loader": "^12.1.0",
|
||||
"shelljs": "0.8.4",
|
||||
"source-code-pro": "^2.38.0",
|
||||
"source-sans-pro": "3.6.0",
|
||||
"style-loader": "^2.0.0",
|
||||
"style-loader": "^3.0.0",
|
||||
"svg-inline-loader": "^0.8.2",
|
||||
"tslib": "^2.2.0",
|
||||
"tslib": "^2.3.0",
|
||||
"typedoc": "^0.20.36",
|
||||
"typescript": "^4.2.4",
|
||||
"url-loader": "^4.1.1",
|
||||
"val-loader": "4.0.0",
|
||||
"webpack": "^5.38.1",
|
||||
"webpack": "^5.40.0",
|
||||
"webpack-bundle-analyzer": "^4.4.2",
|
||||
"webpack-cli": "^4.7.0",
|
||||
"yaml-loader": "0.6.0"
|
||||
@@ -64,8 +64,7 @@
|
||||
"**/graceful-fs": "^4.2.4"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "npm run build:typings && webpack --color --config app/webpack.main.config.js && webpack --color --config app/webpack.config.js && webpack --color --config terminus-core/webpack.config.js && webpack --color --config terminus-settings/webpack.config.js && webpack --color --config terminus-terminal/webpack.config.js && webpack --color --config terminus-local/webpack.config.js && webpack --color --config terminus-plugin-manager/webpack.config.js && webpack --color --config terminus-community-color-schemes/webpack.config.js && webpack --color --config terminus-ssh/webpack.config.js && webpack --color --config terminus-serial/webpack.config.js && webpack --color --config terminus-electron/webpack.config.js && webpack --color --config terminus-web/webpack.config.js",
|
||||
"build:web": "webpack --color --config web/webpack.config.js",
|
||||
"build": "npm run build:typings && webpack --color --config app/webpack.main.config.js && webpack --color --config app/webpack.config.js && webpack --color --config terminus-core/webpack.config.js && webpack --color --config terminus-settings/webpack.config.js && webpack --color --config terminus-terminal/webpack.config.js && webpack --color --config terminus-local/webpack.config.js && webpack --color --config terminus-plugin-manager/webpack.config.js && webpack --color --config terminus-community-color-schemes/webpack.config.js && webpack --color --config terminus-ssh/webpack.config.js && webpack --color --config terminus-serial/webpack.config.js && webpack --color --config terminus-electron/webpack.config.js && webpack --color --config terminus-web/webpack.config.js && webpack --color --config web/webpack.config.js",
|
||||
"build:typings": "node scripts/build-typings.js",
|
||||
"watch": "cross-env TERMINUS_DEV=1 webpack --progress --color --watch",
|
||||
"start": "cross-env TERMINUS_DEV=1 electron app --debug --inspect",
|
||||
|
@@ -27,6 +27,7 @@
|
||||
"js-yaml": "^4.0.0",
|
||||
"mixpanel": "^0.13.0",
|
||||
"ng2-dnd": "^5.0.2",
|
||||
"ngx-filesize": "^2.0.16",
|
||||
"ngx-perfect-scrollbar": "^10.1.0",
|
||||
"readable-stream": "3.6.0",
|
||||
"uuid": "^8.0.0"
|
||||
|
@@ -24,6 +24,7 @@ export abstract class HostWindowService {
|
||||
abstract setTitle (title?: string): void
|
||||
abstract toggleFullscreen (): void
|
||||
abstract minimize (): void
|
||||
abstract isMaximized (): boolean
|
||||
abstract toggleMaximize (): void
|
||||
abstract close (): void
|
||||
|
||||
|
@@ -25,6 +25,7 @@ export { HomeBaseService } from '../services/homeBase.service'
|
||||
export { HotkeysService } from '../services/hotkeys.service'
|
||||
export { NotificationsService } from '../services/notifications.service'
|
||||
export { ThemesService } from '../services/themes.service'
|
||||
export { SelectorService } from '../services/selector.service'
|
||||
export { TabsService } from '../services/tabs.service'
|
||||
export { UpdaterService } from '../services/updater.service'
|
||||
export { VaultService, Vault, VaultSecret, VAULT_SECRET_TYPE_FILE } from '../services/vault.service'
|
||||
|
@@ -24,6 +24,10 @@ export abstract class FileTransfer {
|
||||
abstract getSize (): number
|
||||
abstract close (): void
|
||||
|
||||
getSpeed (): number {
|
||||
return this.lastChunkSpeed
|
||||
}
|
||||
|
||||
getCompletedBytes (): number {
|
||||
return this.completedBytes
|
||||
}
|
||||
@@ -43,9 +47,13 @@ export abstract class FileTransfer {
|
||||
|
||||
protected increaseProgress (bytes: number): void {
|
||||
this.completedBytes += bytes
|
||||
this.lastChunkSpeed = bytes * 1000 / (Date.now() - this.lastChunkStartTime)
|
||||
this.lastChunkStartTime = Date.now()
|
||||
}
|
||||
|
||||
private completedBytes = 0
|
||||
private lastChunkStartTime = Date.now()
|
||||
private lastChunkSpeed = 0
|
||||
private cancelled = false
|
||||
}
|
||||
|
||||
|
@@ -11,6 +11,10 @@ export class SubscriptionContainer {
|
||||
private subscriptions: Subscription[] = []
|
||||
private events: CancellableEvent[] = []
|
||||
|
||||
isEmpty (): boolean {
|
||||
return this.events.length === 0 && this.subscriptions.length === 0
|
||||
}
|
||||
|
||||
addEventListener (element: HTMLElement, event: string, handler: EventListenerOrEventListenerObject, options?: boolean|AddEventListenerOptions): void {
|
||||
element.addEventListener(event, handler, options)
|
||||
this.events.push({
|
||||
|
@@ -238,6 +238,12 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
case 'pane-nav-down':
|
||||
this.navigate('b')
|
||||
break
|
||||
case 'pane-nav-previous':
|
||||
this.navigateLinear(-1)
|
||||
break
|
||||
case 'pane-nav-next':
|
||||
this.navigateLinear(1)
|
||||
break
|
||||
case 'pane-maximize':
|
||||
if (this.maximizedTab) {
|
||||
this.maximize(null)
|
||||
@@ -433,6 +439,17 @@ export class SplitTabComponent extends BaseTabComponent implements AfterViewInit
|
||||
}
|
||||
}
|
||||
|
||||
navigateLinear (delta: number): void {
|
||||
if (!this.focusedTab) {
|
||||
return
|
||||
}
|
||||
|
||||
const relativeTo: BaseTabComponent = this.focusedTab
|
||||
const all = this.getAllTabs()
|
||||
const target = all[(all.indexOf(relativeTo) + delta + all.length) % all.length]
|
||||
this.focus(target)
|
||||
}
|
||||
|
||||
async splitTab (tab: BaseTabComponent, dir: SplitDirection): Promise<BaseTabComponent|null> {
|
||||
const newTab = await this.tabsService.duplicate(tab)
|
||||
if (newTab) {
|
||||
|
@@ -1,5 +1,7 @@
|
||||
.dropdown-header File transfers
|
||||
.dropdown-item.transfer(*ngFor='let transfer of transfers', (click)='showTransfer(transfer)')
|
||||
.d-flex.align-items-center
|
||||
.dropdown-header File transfers
|
||||
button.btn.btn-link.ml-auto((click)='removeAll(); $event.stopPropagation()') !{require('../icons/times.svg')}
|
||||
.transfer(*ngFor='let transfer of transfers', (click)='showTransfer(transfer)')
|
||||
.icon(*ngIf='isDownload(transfer)') !{require('../icons/download.svg')}
|
||||
.icon(*ngIf='!isDownload(transfer)') !{require('../icons/upload.svg')}
|
||||
.main
|
||||
@@ -10,4 +12,8 @@
|
||||
ngb-progressbar(type='danger', [value]='100')
|
||||
.status(*ngIf='!transfer.isComplete() && !transfer.isCancelled()')
|
||||
ngb-progressbar(type='info', [value]='getProgress(transfer)')
|
||||
.metadata
|
||||
.size {{transfer.getSize()|filesize}}
|
||||
.speed(*ngIf='transfer.getSpeed()') {{transfer.getSpeed()|filesize}}/s
|
||||
|
||||
button.btn.btn-link((click)='removeTransfer(transfer); $event.stopPropagation()') !{require('../icons/times.svg')}
|
||||
|
@@ -8,7 +8,7 @@
|
||||
padding: 5px 0 5px 25px;
|
||||
|
||||
.icon {
|
||||
padding: 4px 10px;
|
||||
padding: 4px 7px;
|
||||
width: 36px;
|
||||
height: 32px;
|
||||
background: rgba(0,0,0,.25);
|
||||
@@ -18,14 +18,29 @@
|
||||
.main {
|
||||
width: 100%;
|
||||
margin-right: auto;
|
||||
margin-bottom: 7px;
|
||||
margin-bottom: 3px;
|
||||
|
||||
label {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.metadata {
|
||||
font-size: 10px;
|
||||
opacity: .5;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
.speed {
|
||||
margin-left: auto;
|
||||
}
|
||||
}
|
||||
|
||||
> i {
|
||||
margin-right: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
button {
|
||||
flex: none;
|
||||
}
|
||||
|
@@ -35,4 +35,20 @@ export class TransfersMenuComponent {
|
||||
this.transfers = this.transfers.filter(x => x !== transfer)
|
||||
this.transfersChange.emit(this.transfers)
|
||||
}
|
||||
|
||||
async removeAll (): Promise<void> {
|
||||
if (this.transfers.some(x => !x.isComplete())) {
|
||||
if ((await this.platform.showMessageBox({
|
||||
type: 'warning',
|
||||
message: 'There are active file transfers',
|
||||
buttons: ['Abort all', 'Do not abort'],
|
||||
defaultId: 1,
|
||||
})).response === 1) {
|
||||
return
|
||||
}
|
||||
}
|
||||
for (const t of this.transfers) {
|
||||
this.removeTransfer(t)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -3,11 +3,15 @@ button.btn.btn-secondary.btn-minimize(
|
||||
)
|
||||
svg(version='1.1', width='10', height='10')
|
||||
path(d='M 0,5 10,5 10,6 0,6 Z')
|
||||
button.btn.btn-secondary.btn-maximize(
|
||||
(click)='hostWindow.toggleMaximize()',
|
||||
)
|
||||
|
||||
button.btn.btn-secondary.btn-maximize((click)='hostWindow.toggleMaximize()', *ngIf='!hostWindow.isMaximized()')
|
||||
svg(version='1.1', width='10', height='10')
|
||||
path(d='M 0,0 0,10 10,10 10,0 Z M 1,1 9,1 9,9 1,9 Z')
|
||||
|
||||
button.btn.btn-secondary.btn-maximize((click)='hostWindow.toggleMaximize()', *ngIf='hostWindow.isMaximized()')
|
||||
svg(version='1.1', width='10', height='10', viewBox='0 0 512 512')
|
||||
path(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")
|
||||
|
||||
button.btn.btn-secondary.btn-close(
|
||||
(click)='closeWindow()'
|
||||
)
|
||||
|
@@ -62,6 +62,10 @@ hotkeys:
|
||||
- 'Ctrl-Alt-Up'
|
||||
pane-nav-left:
|
||||
- 'Ctrl-Alt-Left'
|
||||
pane-nav-previous:
|
||||
- 'Ctrl-Alt-['
|
||||
pane-nav-next:
|
||||
- 'Ctrl-Alt-]'
|
||||
pane-maximize:
|
||||
- 'Ctrl-Alt-Enter'
|
||||
close-pane: []
|
||||
|
@@ -60,6 +60,10 @@ hotkeys:
|
||||
- '⌘-⌥-Up'
|
||||
pane-nav-left:
|
||||
- '⌘-⌥-Left'
|
||||
pane-nav-previous:
|
||||
- '⌘-⌥-['
|
||||
pane-nav-next:
|
||||
- '⌘-⌥-]'
|
||||
pane-maximize:
|
||||
- '⌘-⌥-Enter'
|
||||
close-pane:
|
||||
|
@@ -63,6 +63,10 @@ hotkeys:
|
||||
- 'Ctrl-Alt-Up'
|
||||
pane-nav-left:
|
||||
- 'Ctrl-Alt-Left'
|
||||
pane-nav-previous:
|
||||
- 'Ctrl-Alt-['
|
||||
pane-nav-next:
|
||||
- 'Ctrl-Alt-]'
|
||||
pane-maximize:
|
||||
- 'Ctrl-Alt-Enter'
|
||||
close-pane: []
|
||||
|
@@ -157,6 +157,14 @@ export class AppHotkeyProvider extends HotkeyProvider {
|
||||
id: 'pane-nav-right',
|
||||
name: 'Focus the pane on the right',
|
||||
},
|
||||
{
|
||||
id: 'pane-nav-previous',
|
||||
name: 'Focus previous pane',
|
||||
},
|
||||
{
|
||||
id: 'pane-nav-next',
|
||||
name: 'Focus next pane',
|
||||
},
|
||||
{
|
||||
id: 'close-pane',
|
||||
name: 'Close focused pane',
|
||||
|
@@ -4,6 +4,7 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations'
|
||||
import { FormsModule } from '@angular/forms'
|
||||
import { NgbModule } from '@ng-bootstrap/ng-bootstrap'
|
||||
import { PerfectScrollbarModule, PERFECT_SCROLLBAR_CONFIG } from 'ngx-perfect-scrollbar'
|
||||
import { NgxFilesizeModule } from 'ngx-filesize'
|
||||
import { DndModule } from 'ng2-dnd'
|
||||
|
||||
import { AppRootComponent } from './components/appRoot.component'
|
||||
@@ -64,6 +65,7 @@ const PROVIDERS = [
|
||||
BrowserAnimationsModule,
|
||||
FormsModule,
|
||||
NgbModule,
|
||||
NgxFilesizeModule,
|
||||
PerfectScrollbarModule,
|
||||
DndModule.forRoot(),
|
||||
],
|
||||
|
@@ -2,11 +2,9 @@
|
||||
import { Observable, Subject, AsyncSubject } from 'rxjs'
|
||||
import { takeUntil } from 'rxjs/operators'
|
||||
import { Injectable, Inject } from '@angular/core'
|
||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
||||
|
||||
import { BaseTabComponent } from '../components/baseTab.component'
|
||||
import { SplitTabComponent } from '../components/splitTab.component'
|
||||
import { SelectorModalComponent } from '../components/selectorModal.component'
|
||||
import { SelectorOption } from '../api/selector'
|
||||
import { RecoveryToken } from '../api/tabRecovery'
|
||||
import { BootstrapData, BOOTSTRAP_DATA } from '../api/mainProcess'
|
||||
@@ -16,6 +14,7 @@ import { HostAppService } from '../api/hostApp'
|
||||
import { ConfigService } from './config.service'
|
||||
import { TabRecoveryService } from './tabRecovery.service'
|
||||
import { TabsService, TabComponentType } from './tabs.service'
|
||||
import { SelectorService } from './selector.service'
|
||||
|
||||
class CompletionObserver {
|
||||
get done$ (): Observable<void> { return this.done }
|
||||
@@ -77,7 +76,7 @@ export class AppService {
|
||||
private hostWindow: HostWindowService,
|
||||
private tabRecovery: TabRecoveryService,
|
||||
private tabsService: TabsService,
|
||||
private ngbModal: NgbModal,
|
||||
private selector: SelectorService,
|
||||
@Inject(BOOTSTRAP_DATA) private bootstrapData: BootstrapData,
|
||||
) {
|
||||
this.tabsChanged$.subscribe(() => {
|
||||
@@ -366,11 +365,8 @@ export class AppService {
|
||||
this.completionObservers.delete(tab)
|
||||
}
|
||||
|
||||
// Deprecated
|
||||
showSelector <T> (name: string, options: SelectorOption<T>[]): Promise<T> {
|
||||
const modal = this.ngbModal.open(SelectorModalComponent)
|
||||
const instance: SelectorModalComponent<T> = modal.componentInstance
|
||||
instance.name = name
|
||||
instance.options = options
|
||||
return modal.result as Promise<T>
|
||||
return this.selector.show(name, options)
|
||||
}
|
||||
}
|
||||
|
@@ -1,11 +1,11 @@
|
||||
import { Inject, Injectable } from '@angular/core'
|
||||
import { AppService, FileProvider, NotificationsService } from '../api'
|
||||
import { FileProvider, NotificationsService, SelectorService } from '../api'
|
||||
|
||||
@Injectable({ providedIn: 'root' })
|
||||
export class FileProvidersService {
|
||||
/** @hidden */
|
||||
private constructor (
|
||||
private app: AppService,
|
||||
private selector: SelectorService,
|
||||
private notifications: NotificationsService,
|
||||
@Inject(FileProvider) private fileProviders: FileProvider[],
|
||||
) { }
|
||||
@@ -40,7 +40,7 @@ export class FileProvidersService {
|
||||
if (providers.length === 1) {
|
||||
return providers[0]
|
||||
}
|
||||
return this.app.showSelector('Select file storage', providers.map(p => ({
|
||||
return this.selector.show('Select file storage', providers.map(p => ({
|
||||
name: p.name,
|
||||
result: p,
|
||||
})))
|
||||
|
22
terminus-core/src/services/selector.service.ts
Normal file
22
terminus-core/src/services/selector.service.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
import { Injectable } from '@angular/core'
|
||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
||||
|
||||
import { SelectorModalComponent } from '../components/selectorModal.component'
|
||||
import { SelectorOption } from '../api/selector'
|
||||
|
||||
@Injectable({ providedIn: 'root' })
|
||||
export class SelectorService {
|
||||
/** @hidden */
|
||||
private constructor (
|
||||
private ngbModal: NgbModal,
|
||||
) { }
|
||||
|
||||
show <T> (name: string, options: SelectorOption<T>[]): Promise<T> {
|
||||
const modal = this.ngbModal.open(SelectorModalComponent)
|
||||
const instance: SelectorModalComponent<T> = modal.componentInstance
|
||||
instance.name = name
|
||||
instance.options = options
|
||||
return modal.result as Promise<T>
|
||||
}
|
||||
}
|
@@ -5,7 +5,8 @@ import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
||||
import { AsyncSubject, Subject, Observable } from 'rxjs'
|
||||
import { wrapPromise } from '../utils'
|
||||
import { UnlockVaultModalComponent } from '../components/unlockVaultModal.component'
|
||||
import { NotificationsService } from '../services/notifications.service'
|
||||
import { NotificationsService } from './notifications.service'
|
||||
import { SelectorService } from './selector.service'
|
||||
import { FileProvider } from '../api/fileProvider'
|
||||
import { PlatformService } from '../api/platform'
|
||||
|
||||
@@ -226,6 +227,7 @@ export class VaultFileProvider extends FileProvider {
|
||||
constructor (
|
||||
private vault: VaultService,
|
||||
private platform: PlatformService,
|
||||
private selector: SelectorService,
|
||||
private zone: NgZone,
|
||||
) {
|
||||
super()
|
||||
@@ -236,6 +238,32 @@ export class VaultFileProvider extends FileProvider {
|
||||
}
|
||||
|
||||
async selectAndStoreFile (description: string): Promise<string> {
|
||||
const vault = await this.vault.load()
|
||||
if (!vault) {
|
||||
throw new Error('Vault is locked')
|
||||
}
|
||||
const files = vault.secrets.filter(x => x.type === VAULT_SECRET_TYPE_FILE)
|
||||
if (files.length) {
|
||||
const result = await this.selector.show<VaultSecret|null>('Select file', [
|
||||
{
|
||||
name: 'Add a new file',
|
||||
icon: 'plus',
|
||||
result: null,
|
||||
},
|
||||
...files.map(f => ({
|
||||
name: f.key.description,
|
||||
icon: 'file',
|
||||
result: f,
|
||||
})),
|
||||
])
|
||||
if (result) {
|
||||
return `${this.prefix}${result.key.id}`
|
||||
}
|
||||
}
|
||||
return this.addNewFile(description)
|
||||
}
|
||||
|
||||
async addNewFile (description: string): Promise<string> {
|
||||
const transfers = await this.platform.startUpload()
|
||||
if (!transfers.length) {
|
||||
throw new Error('Nothing selected')
|
||||
|
@@ -170,6 +170,11 @@ es-to-primitive@^1.2.1:
|
||||
is-date-object "^1.0.1"
|
||||
is-symbol "^1.0.2"
|
||||
|
||||
"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==
|
||||
|
||||
foreach@^2.0.5:
|
||||
version "2.0.5"
|
||||
resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
|
||||
@@ -400,6 +405,14 @@ ng2-dnd@^5.0.2:
|
||||
resolved "https://registry.yarnpkg.com/ng2-dnd/-/ng2-dnd-5.0.2.tgz#862278ac7dedfa14f5783bbf34014d5d73dfefb4"
|
||||
integrity sha512-5mWWBePwvEPsNd/HkdbD543Q9mPyJofL6zkNydl8/Ah3qrrvZT2DaEPbknY08OgkXpI2qUGksc01OzzVlRQ9dQ==
|
||||
|
||||
ngx-filesize@^2.0.16:
|
||||
version "2.0.16"
|
||||
resolved "https://registry.yarnpkg.com/ngx-filesize/-/ngx-filesize-2.0.16.tgz#fdaba04170edb6cfcdf7be932783cf913b03f016"
|
||||
integrity sha512-VdaCirE7hSyfQh8ZEmhzNEhbddiTYUHF4V6OX+KyTmnQSVx4hp9kmzDX5YlkIlmClI6wI+LZmH9/q7XS3fsMPA==
|
||||
dependencies:
|
||||
filesize ">= 4.0.0"
|
||||
tslib "^2.0.0"
|
||||
|
||||
ngx-perfect-scrollbar@^10.1.0:
|
||||
version "10.1.1"
|
||||
resolved "https://registry.yarnpkg.com/ngx-perfect-scrollbar/-/ngx-perfect-scrollbar-10.1.1.tgz#f89832b9109e89bb59d516184638accd028e9735"
|
||||
|
@@ -19,8 +19,8 @@ import { ElectronConfigProvider } from './config'
|
||||
providers: [
|
||||
{ provide: TerminalColorSchemeProvider, useClass: HyperColorSchemes, multi: true },
|
||||
{ provide: PlatformService, useClass: ElectronPlatformService },
|
||||
{ provide: HostWindowService, useClass: ElectronHostWindow },
|
||||
{ provide: HostAppService, useClass: ElectronHostAppService },
|
||||
{ provide: HostWindowService, useExisting: ElectronHostWindow },
|
||||
{ provide: HostAppService, useExisting: ElectronHostAppService },
|
||||
{ provide: LogService, useClass: ElectronLogService },
|
||||
{ provide: UpdaterService, useClass: ElectronUpdaterService },
|
||||
{ provide: DockingService, useClass: ElectronDockingService },
|
||||
|
@@ -71,8 +71,16 @@ export class ElectronHostWindow extends HostWindowService {
|
||||
this.electron.ipcRenderer.send('window-minimize')
|
||||
}
|
||||
|
||||
isMaximized (): boolean {
|
||||
return this.getWindow().isMaximized()
|
||||
}
|
||||
|
||||
toggleMaximize (): void {
|
||||
this.electron.ipcRenderer.send('window-toggle-maximize')
|
||||
if (this.getWindow().isMaximized()) {
|
||||
this.getWindow().unmaximize()
|
||||
} else {
|
||||
this.getWindow().maximize()
|
||||
}
|
||||
}
|
||||
|
||||
close (): void {
|
||||
|
@@ -8,6 +8,7 @@ import { Injectable, NgZone } from '@angular/core'
|
||||
import { PlatformService, ClipboardContent, HostAppService, Platform, MenuItemOptions, MessageBoxOptions, MessageBoxResult, FileUpload, FileDownload, FileUploadOptions, wrapPromise } from 'terminus-core'
|
||||
import { ElectronService } from '../services/electron.service'
|
||||
import { ElectronHostWindow } from './hostWindow.service'
|
||||
import { ShellIntegrationService } from './shellIntegration.service'
|
||||
const fontManager = require('fontmanager-redux') // eslint-disable-line
|
||||
|
||||
/* eslint-disable block-scoped-var */
|
||||
@@ -29,6 +30,7 @@ export class ElectronPlatformService extends PlatformService {
|
||||
private hostWindow: ElectronHostWindow,
|
||||
private electron: ElectronService,
|
||||
private zone: NgZone,
|
||||
private shellIntegration: ShellIntegrationService,
|
||||
) {
|
||||
super()
|
||||
this.configPath = path.join(electron.app.getPath('userData'), 'config.yaml')
|
||||
@@ -85,15 +87,15 @@ export class ElectronPlatformService extends PlatformService {
|
||||
}
|
||||
|
||||
async isShellIntegrationInstalled (): Promise<boolean> {
|
||||
return false
|
||||
return this.shellIntegration.isInstalled()
|
||||
}
|
||||
|
||||
async installShellIntegration (): Promise<void> {
|
||||
throw new Error('Not implemented')
|
||||
await this.shellIntegration.install()
|
||||
}
|
||||
|
||||
async uninstallShellIntegration (): Promise<void> {
|
||||
throw new Error('Not implemented')
|
||||
await this.shellIntegration.remove()
|
||||
}
|
||||
|
||||
async loadConfig (): Promise<string> {
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||
import { Injectable } from '@angular/core'
|
||||
import { ToolbarButtonProvider, ToolbarButton, ConfigService, SelectorOption, AppService } from 'terminus-core'
|
||||
import { ToolbarButtonProvider, ToolbarButton, ConfigService, SelectorOption, SelectorService } from 'terminus-core'
|
||||
import { ElectronService } from 'terminus-electron'
|
||||
|
||||
import { TerminalService } from './services/terminal.service'
|
||||
@@ -10,7 +10,7 @@ import { TerminalService } from './services/terminal.service'
|
||||
export class ButtonProvider extends ToolbarButtonProvider {
|
||||
constructor (
|
||||
electron: ElectronService,
|
||||
private app: AppService,
|
||||
private selector: SelectorService,
|
||||
private config: ConfigService,
|
||||
private terminal: TerminalService,
|
||||
) {
|
||||
@@ -29,7 +29,7 @@ export class ButtonProvider extends ToolbarButtonProvider {
|
||||
})
|
||||
}
|
||||
|
||||
await this.app.showSelector('Select profile', options)
|
||||
await this.selector.show('Select profile', options)
|
||||
}
|
||||
|
||||
provide (): ToolbarButton[] {
|
||||
|
@@ -57,7 +57,6 @@ div
|
||||
placeholder='Search plugins'
|
||||
)
|
||||
|
||||
|
||||
.list-group.list-group-flush.mb-4(*ngIf='availablePlugins$')
|
||||
ng-container(*ngFor='let plugin of (availablePlugins$|async)')
|
||||
.list-group-item.d-flex.align-items-center(*ngIf='!isAlreadyInstalled(plugin)')
|
||||
@@ -71,6 +70,9 @@ div
|
||||
div((click)='showPluginInfo(plugin)')
|
||||
div
|
||||
strong {{plugin.name}}
|
||||
small.text-muted.ml-1 {{plugin.version}} / {{plugin.author}}
|
||||
i.fas.fa-check.text-success.ml-1(*ngIf='plugin.isOfficial', title='Official')
|
||||
small.text-muted.ml-1 {{plugin.version}}
|
||||
small.text-muted.ml-1(*ngIf='!plugin.isOfficial') by {{plugin.author}}
|
||||
small.text-success.ml-1(*ngIf='plugin.isOfficial')
|
||||
i.fas.fa-check
|
||||
span.ml-1 Official
|
||||
small.text-muted {{plugin.description}}
|
||||
|
@@ -43,7 +43,7 @@ export class PluginManagerService {
|
||||
version: item.package.version,
|
||||
homepage: item.package.links.homepage,
|
||||
author: (item.package.author || {}).name,
|
||||
isOfficial: item.package.publisher.username === OFFICIAL_NPM_ACCOUNT,
|
||||
isOfficial: item.package.publisher.name === OFFICIAL_NPM_ACCOUNT,
|
||||
}))),
|
||||
map(plugins => plugins.filter(x => x.packageName.startsWith(NAME_PREFIX))),
|
||||
map(plugins => plugins.filter(x => !BLACKLIST.includes(x.packageName))),
|
||||
|
@@ -3,6 +3,7 @@ import colors from 'ansi-colors'
|
||||
import { Spinner } from 'cli-spinner'
|
||||
import { Component, Injector } from '@angular/core'
|
||||
import { first } from 'rxjs/operators'
|
||||
import { SelectorService } from 'terminus-core'
|
||||
import { BaseTerminalTabComponent } from 'terminus-terminal'
|
||||
import { SerialService } from '../services/serial.service'
|
||||
import { SerialConnection, SerialSession, BAUD_RATES } from '../api'
|
||||
@@ -23,6 +24,7 @@ export class SerialTabComponent extends BaseTerminalTabComponent {
|
||||
// eslint-disable-next-line @typescript-eslint/no-useless-constructor
|
||||
constructor (
|
||||
injector: Injector,
|
||||
private selector: SelectorService,
|
||||
) {
|
||||
super(injector)
|
||||
this.serialService = injector.get(SerialService)
|
||||
@@ -122,7 +124,7 @@ export class SerialTabComponent extends BaseTerminalTabComponent {
|
||||
}
|
||||
|
||||
async changeBaudRate () {
|
||||
const rate = await this.app.showSelector('Baud rate', BAUD_RATES.map(x => ({
|
||||
const rate = await this.selector.show('Baud rate', BAUD_RATES.map(x => ({
|
||||
name: x.toString(), result: x,
|
||||
})))
|
||||
this.serialPort.update({ baudRate: rate })
|
||||
|
@@ -1,6 +1,6 @@
|
||||
import { Injectable, NgZone } from '@angular/core'
|
||||
import SerialPort from 'serialport'
|
||||
import { LogService, AppService, SelectorOption, ConfigService, NotificationsService } from 'terminus-core'
|
||||
import { LogService, AppService, SelectorOption, ConfigService, NotificationsService, SelectorService } from 'terminus-core'
|
||||
import { SettingsTabComponent } from 'terminus-settings'
|
||||
import { SerialConnection, SerialSession, SerialPortInfo, BAUD_RATES } from '../api'
|
||||
import { SerialTabComponent } from '../components/serialTab.component'
|
||||
@@ -12,6 +12,7 @@ export class SerialService {
|
||||
private zone: NgZone,
|
||||
private notifications: NotificationsService,
|
||||
private app: AppService,
|
||||
private selector: SelectorService,
|
||||
private config: ConfigService,
|
||||
) { }
|
||||
|
||||
@@ -124,7 +125,7 @@ export class SerialService {
|
||||
})
|
||||
|
||||
|
||||
await this.app.showSelector('Open a serial port', options)
|
||||
await this.selector.show('Open a serial port', options)
|
||||
}
|
||||
|
||||
async connect (connection: SerialConnection): Promise<SerialTabComponent> {
|
||||
@@ -170,7 +171,7 @@ export class SerialService {
|
||||
}
|
||||
|
||||
async connectFoundPort (port: SerialPortInfo): Promise<SerialTabComponent> {
|
||||
const rate = await this.app.showSelector('Baud rate', BAUD_RATES.map(x => ({
|
||||
const rate = await this.selector.show('Baud rate', BAUD_RATES.map(x => ({
|
||||
name: x.toString(), result: x,
|
||||
})))
|
||||
return this.quickConnect(`${port.name}@${rate}`)
|
||||
|
@@ -26,6 +26,7 @@
|
||||
"ansi-colors": "^4.1.1",
|
||||
"cli-spinner": "^0.2.10",
|
||||
"clone-deep": "^4.0.1",
|
||||
"ssh2": "^1.1.0",
|
||||
"sshpk": "Eugeny/node-sshpk#89ed17dfae425a8b629873c8337e77d26838c04f",
|
||||
"strip-ansi": "^7.0.0"
|
||||
},
|
||||
|
@@ -10,7 +10,7 @@ import stripAnsi from 'strip-ansi'
|
||||
import socksv5 from 'socksv5'
|
||||
import { Injector, NgZone } from '@angular/core'
|
||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
||||
import { FileProvidersService, HostAppService, Logger, NotificationsService, Platform, PlatformService, wrapPromise } from 'terminus-core'
|
||||
import { ConfigService, FileProvidersService, HostAppService, Logger, NotificationsService, Platform, PlatformService, wrapPromise } from 'terminus-core'
|
||||
import { BaseSession } from 'terminus-terminal'
|
||||
import { Server, Socket, createServer, createConnection } from 'net'
|
||||
import { Client, ClientChannel, SFTPWrapper } from 'ssh2'
|
||||
@@ -281,6 +281,7 @@ export class SSHSession extends BaseSession {
|
||||
private notifications: NotificationsService
|
||||
private zone: NgZone
|
||||
private fileProviders: FileProvidersService
|
||||
private config: ConfigService
|
||||
|
||||
constructor (
|
||||
injector: Injector,
|
||||
@@ -294,6 +295,7 @@ export class SSHSession extends BaseSession {
|
||||
this.notifications = injector.get(NotificationsService)
|
||||
this.zone = injector.get(NgZone)
|
||||
this.fileProviders = injector.get(FileProvidersService)
|
||||
this.config = injector.get(ConfigService)
|
||||
|
||||
this.scripts = connection.scripts ?? []
|
||||
this.destroyed$.subscribe(() => {
|
||||
@@ -307,12 +309,18 @@ export class SSHSession extends BaseSession {
|
||||
|
||||
async init (): Promise<void> {
|
||||
if (this.hostApp.platform === Platform.Windows) {
|
||||
if (await fs.exists(WINDOWS_OPENSSH_AGENT_PIPE)) {
|
||||
this.agentPath = WINDOWS_OPENSSH_AGENT_PIPE
|
||||
} else {
|
||||
if (await this.platform.isProcessRunning('pageant.exe')) {
|
||||
this.agentPath = 'pageant'
|
||||
if (this.config.store.ssh.agentType === 'auto') {
|
||||
if (await fs.exists(WINDOWS_OPENSSH_AGENT_PIPE)) {
|
||||
this.agentPath = WINDOWS_OPENSSH_AGENT_PIPE
|
||||
} else {
|
||||
if (await this.platform.isProcessRunning('pageant.exe')) {
|
||||
this.agentPath = 'pageant'
|
||||
}
|
||||
}
|
||||
} else if (this.config.store.ssh.agentType === 'pageant') {
|
||||
this.agentPath = 'pageant'
|
||||
} else {
|
||||
this.agentPath = this.config.store.ssh.agentPath || WINDOWS_OPENSSH_AGENT_PIPE
|
||||
}
|
||||
} else {
|
||||
this.agentPath = process.env.SSH_AUTH_SOCK!
|
||||
@@ -585,7 +593,7 @@ export class SSHSession extends BaseSession {
|
||||
continue
|
||||
}
|
||||
}
|
||||
return method
|
||||
return method.type
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -64,10 +64,33 @@ h3.mt-5 Options
|
||||
.form-line(*ngIf='hostApp.platform === Platform.Windows')
|
||||
.header
|
||||
.title WinSCP path
|
||||
.descriptions When WinSCP is detected, you can launch an SCP session from the context menu.
|
||||
.description When WinSCP is detected, you can launch an SCP session from the context menu.
|
||||
input.form-control(
|
||||
type='text',
|
||||
placeholder='Auto-detect',
|
||||
[(ngModel)]='config.store.ssh.winSCPPath',
|
||||
(ngModelChange)='config.save()',
|
||||
)
|
||||
|
||||
.form-line(*ngIf='hostApp.platform === Platform.Windows')
|
||||
.header
|
||||
.title Agent type
|
||||
.description Forces a specific SSH agent connection type.
|
||||
select.form-control(
|
||||
[(ngModel)]='config.store.ssh.agentType',
|
||||
(ngModelChange)='config.save()',
|
||||
)
|
||||
option(value='auto') Automatic
|
||||
option(value='pageant') Pageant
|
||||
option(value='pipe') Named pipe
|
||||
|
||||
.form-line(*ngIf='config.store.ssh.agentType === "pipe"')
|
||||
.header
|
||||
.title Agent pipe path
|
||||
.description Sets the SSH agent's named pipe path.
|
||||
input.form-control(
|
||||
type='text',
|
||||
placeholder='Default: \\\\.\\pipe\\openssh-ssh-agent',
|
||||
[(ngModel)]='config.store.ssh.agentPath',
|
||||
(ngModelChange)='config.save()',
|
||||
)
|
||||
|
@@ -8,6 +8,8 @@ export class SSHConfigProvider extends ConfigProvider {
|
||||
recentConnections: [],
|
||||
warnOnClose: false,
|
||||
winSCPPath: null,
|
||||
agentType: 'auto',
|
||||
agentPath: null,
|
||||
},
|
||||
hotkeys: {
|
||||
ssh: [
|
||||
|
@@ -19,4 +19,11 @@ export class RecoveryProvider extends TabRecoveryProvider {
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
duplicate (recoveryToken: RecoveryToken): RecoveryToken {
|
||||
return {
|
||||
...recoveryToken,
|
||||
savedState: null,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -5,7 +5,7 @@ import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
||||
import { Client } from 'ssh2'
|
||||
import { exec } from 'child_process'
|
||||
import { Subject, Observable } from 'rxjs'
|
||||
import { Logger, LogService, AppService, SelectorOption, ConfigService, NotificationsService, HostAppService, Platform, PlatformService } from 'terminus-core'
|
||||
import { Logger, LogService, AppService, SelectorOption, ConfigService, NotificationsService, HostAppService, Platform, PlatformService, SelectorService } from 'terminus-core'
|
||||
import { SettingsTabComponent } from 'terminus-settings'
|
||||
import { ALGORITHM_BLACKLIST, ForwardedPort, SSHConnection, SSHSession } from '../api'
|
||||
import { PromptModalComponent } from '../components/promptModal.component'
|
||||
@@ -26,6 +26,7 @@ export class SSHService {
|
||||
private passwordStorage: PasswordStorageService,
|
||||
private notifications: NotificationsService,
|
||||
private app: AppService,
|
||||
private selector: SelectorService,
|
||||
private config: ConfigService,
|
||||
hostApp: HostAppService,
|
||||
private platform: PlatformService,
|
||||
@@ -135,7 +136,7 @@ export class SSHService {
|
||||
}
|
||||
|
||||
ssh.connect({
|
||||
host: session.connection.host,
|
||||
host: session.connection.host.trim(),
|
||||
port: session.connection.port ?? 22,
|
||||
sock: session.proxyCommandStream ?? session.jumpStream,
|
||||
username: session.connection.user,
|
||||
@@ -230,7 +231,7 @@ export class SSHService {
|
||||
})
|
||||
|
||||
|
||||
await this.app.showSelector('Open an SSH connection', options)
|
||||
await this.selector.show('Open an SSH connection', options)
|
||||
}
|
||||
|
||||
async connect (connection: SSHConnection): Promise<SSHTabComponent> {
|
||||
@@ -261,8 +262,11 @@ export class SSHService {
|
||||
host = parts[parts.length - 1]
|
||||
user = parts.slice(0, parts.length - 1).join('@')
|
||||
}
|
||||
if (host.includes(':')) {
|
||||
port = parseInt(host.split(':')[1])
|
||||
if (host.includes('[')) {
|
||||
port = parseInt(host.split(']')[1].substring(1))
|
||||
host = host.split(']')[0].substring(1)
|
||||
} else if (host.includes(':')) {
|
||||
port = parseInt(host.split(/:/g)[1])
|
||||
host = host.split(':')[0]
|
||||
}
|
||||
|
||||
|
@@ -2,4 +2,9 @@ const config = require('../webpack.plugin.config')
|
||||
module.exports = config({
|
||||
name: 'ssh',
|
||||
dirname: __dirname,
|
||||
alias: {
|
||||
'cpu-features': false,
|
||||
'./crypto/build/Release/sshcrypto.node': false,
|
||||
'../build/Release/cpufeatures.node': false,
|
||||
},
|
||||
})
|
||||
|
@@ -37,7 +37,7 @@ ansi-regex@^6.0.0:
|
||||
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.0.tgz#ecc7f5933cbe5ac7b33e209a5ff409ab1669c6b2"
|
||||
integrity sha512-tAaOSrWCHF+1Ear1Z4wnJCXA9GGox4K6Ic85a5qalES2aeEwQGr7UC93mwef49536PkCYjzkp0zIxfFvexJ6zQ==
|
||||
|
||||
asn1@~0.2.3:
|
||||
asn1@^0.2.4, asn1@~0.2.3:
|
||||
version "0.2.4"
|
||||
resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
|
||||
integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
|
||||
@@ -59,7 +59,7 @@ balanced-match@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
|
||||
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
|
||||
|
||||
bcrypt-pbkdf@^1.0.0:
|
||||
bcrypt-pbkdf@^1.0.0, bcrypt-pbkdf@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
|
||||
integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
|
||||
@@ -119,6 +119,13 @@ concat-map@0.0.1:
|
||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
|
||||
|
||||
cpu-features@0.0.2:
|
||||
version "0.0.2"
|
||||
resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.2.tgz#9f636156f1155fd04bdbaa028bb3c2fbef3cea7a"
|
||||
integrity sha512-/2yieBqvMcRj8McNzkycjW2v3OIUOibBfd2dLEJ0nWts8NobAxwiyw9phVNS6oDL8x8tz9F7uNVFEVpJncQpeA==
|
||||
dependencies:
|
||||
nan "^2.14.1"
|
||||
|
||||
cycle@1.0.x:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
|
||||
@@ -224,6 +231,11 @@ minimatch@^3.0.4:
|
||||
dependencies:
|
||||
brace-expansion "^1.1.7"
|
||||
|
||||
nan@^2.14.1, nan@^2.14.2:
|
||||
version "2.14.2"
|
||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19"
|
||||
integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==
|
||||
|
||||
once@^1.3.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
||||
@@ -270,6 +282,17 @@ sprintf@0.1.x:
|
||||
resolved "https://registry.yarnpkg.com/sprintf/-/sprintf-0.1.5.tgz#8f83e39a9317c1a502cb7db8050e51c679f6edcf"
|
||||
integrity sha1-j4PjmpMXwaUCy324BQ5Rxnn27c8=
|
||||
|
||||
ssh2@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.1.0.tgz#43dd24930e15e317687f519d6b40270d9cd00d00"
|
||||
integrity sha512-CidQLG2ZacoT0Z7O6dOyisj4JdrOrLVJ4KbHjVNz9yI1vO08FAYQPcnkXY9BP8zeYo+J/nBgY6Gg4R7w4WFWtg==
|
||||
dependencies:
|
||||
asn1 "^0.2.4"
|
||||
bcrypt-pbkdf "^1.0.2"
|
||||
optionalDependencies:
|
||||
cpu-features "0.0.2"
|
||||
nan "^2.14.2"
|
||||
|
||||
sshpk@Eugeny/node-sshpk#89ed17dfae425a8b629873c8337e77d26838c04f:
|
||||
version "1.16.1"
|
||||
resolved "https://codeload.github.com/Eugeny/node-sshpk/tar.gz/89ed17dfae425a8b629873c8337e77d26838c04f"
|
||||
|
@@ -118,6 +118,7 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
|
||||
private termContainerSubscriptions = new SubscriptionContainer()
|
||||
private allFocusModeSubscription: Subscription|null = null
|
||||
private sessionHandlers = new SubscriptionContainer()
|
||||
private sessionSupportsBracketedPaste = false
|
||||
|
||||
get input$ (): Observable<Buffer> {
|
||||
if (!this.frontend) {
|
||||
@@ -177,7 +178,15 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
|
||||
this.frontend.clearSelection()
|
||||
this.notifications.notice('Copied')
|
||||
} else {
|
||||
this.sendInput('\x03')
|
||||
if (this.parent && this.parent instanceof SplitTabComponent && this.parent._allFocusMode) {
|
||||
for (const tab of this.parent.getAllTabs()) {
|
||||
if (tab instanceof BaseTerminalTabComponent) {
|
||||
tab.sendInput('\x03')
|
||||
}
|
||||
}
|
||||
} else {
|
||||
this.sendInput('\x03')
|
||||
}
|
||||
}
|
||||
break
|
||||
case 'copy':
|
||||
@@ -375,12 +384,20 @@ export class BaseTerminalTabComponent extends BaseTabComponent implements OnInit
|
||||
this.setProgress(null)
|
||||
}
|
||||
}
|
||||
|
||||
if (data.includes('\x1b[?2004h')) {
|
||||
this.sessionSupportsBracketedPaste = true
|
||||
}
|
||||
if (data.includes('\x1b[?2004l')) {
|
||||
this.sessionSupportsBracketedPaste = false
|
||||
}
|
||||
|
||||
this.frontend.write(data)
|
||||
}
|
||||
|
||||
async paste (): Promise<void> {
|
||||
let data = this.platform.readClipboard()
|
||||
if (this.config.store.terminal.bracketedPaste) {
|
||||
if (this.config.store.terminal.bracketedPaste && this.sessionSupportsBracketedPaste) {
|
||||
data = `\x1b[200~${data}\x1b[201~`
|
||||
}
|
||||
if (this.hostApp.platform === Platform.Windows) {
|
||||
|
@@ -1,6 +1,6 @@
|
||||
import '@vaadin/vaadin-context-menu/vaadin-context-menu.js'
|
||||
import copyToClipboard from 'copy-text-to-clipboard'
|
||||
import { Injectable } from '@angular/core'
|
||||
import { Injectable, Inject } from '@angular/core'
|
||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
||||
import { PlatformService, ClipboardContent, MenuItemOptions, MessageBoxOptions, MessageBoxResult, FileUpload, FileUploadOptions, FileDownload, HTMLFileUpload } from 'terminus-core'
|
||||
|
||||
@@ -16,14 +16,13 @@ export class WebPlatformService extends PlatformService {
|
||||
private menu: ContextMenuElement
|
||||
private contextMenuHandlers = new Map<ContextMenuItem, () => void>()
|
||||
private fileSelector: HTMLInputElement
|
||||
private connector: any
|
||||
|
||||
constructor (
|
||||
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||
@Inject('WEB_CONNECTOR') private connector: any,
|
||||
private ngbModal: NgbModal,
|
||||
) {
|
||||
super()
|
||||
this.connector = window['__connector__']
|
||||
|
||||
this.menu = window.document.createElement('vaadin-context-menu')
|
||||
this.menu.addEventListener('item-selected', e => {
|
||||
this.contextMenuHandlers.get(e.detail.value)?.()
|
||||
|
@@ -31,6 +31,10 @@ export class WebHostWindow extends HostWindowService {
|
||||
throw new Error('Unavailable')
|
||||
}
|
||||
|
||||
isMaximized (): boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
toggleMaximize (): void {
|
||||
throw new Error('Unavailable')
|
||||
}
|
||||
|
@@ -9,3 +9,76 @@ import '../app/src/preload.scss'
|
||||
|
||||
// Required before other imports
|
||||
import './polyfills.buffer'
|
||||
|
||||
const mocks = {}
|
||||
const modules = {}
|
||||
|
||||
const originalRequire = window['require']
|
||||
const customRequire = path => {
|
||||
if (mocks[path]) {
|
||||
console.log(':: mock', path)
|
||||
return mocks[path]
|
||||
}
|
||||
if (modules[path]) {
|
||||
return modules[path]
|
||||
}
|
||||
return originalRequire(path)
|
||||
}
|
||||
|
||||
customRequire['resolve'] = (() => null) as any
|
||||
customRequire['main'] = {
|
||||
paths: [],
|
||||
}
|
||||
|
||||
async function webRequire (url) {
|
||||
console.log(`Loading ${url}`)
|
||||
const e = document.createElement('script')
|
||||
window['module'] = { exports: {} } as any
|
||||
window['exports'] = window['module'].exports
|
||||
await new Promise(resolve => {
|
||||
e.onload = resolve
|
||||
e.src = url
|
||||
document.querySelector('head').appendChild(e)
|
||||
})
|
||||
return window['module'].exports
|
||||
}
|
||||
|
||||
const Terminus = {
|
||||
registerMock: (name, mod) => {
|
||||
mocks[name] = mod
|
||||
},
|
||||
registerModule: (name, mod) => {
|
||||
modules[name] = mod
|
||||
},
|
||||
loadPlugin: async (url) => {
|
||||
const pkg = await (await fetch(url + '/package.json')).json()
|
||||
url += '/' + pkg.main
|
||||
const module = await webRequire(url)
|
||||
Terminus.registerModule(`resources/builtin-plugins/${pkg.name}`, module)
|
||||
Terminus.registerModule(pkg.name, module)
|
||||
return module
|
||||
},
|
||||
bootstrap: (...args) => window['bootstrapTerminus'](...args),
|
||||
webRequire,
|
||||
}
|
||||
|
||||
Object.assign(window, {
|
||||
require: customRequire,
|
||||
module: {
|
||||
paths: [],
|
||||
},
|
||||
Terminus,
|
||||
process: {
|
||||
env: { },
|
||||
argv: ['terminus'],
|
||||
platform: 'darwin',
|
||||
on: () => null,
|
||||
stdout: {},
|
||||
stderr: {},
|
||||
resourcesPath: 'resources',
|
||||
version: '14.0.0',
|
||||
nextTick: (f, ...args) => setTimeout(() => f(...args)),
|
||||
cwd: () => '/',
|
||||
},
|
||||
global: window,
|
||||
})
|
||||
|
17
web/entry.ts
17
web/entry.ts
@@ -15,19 +15,25 @@ import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'
|
||||
import { getRootModule } from '../app/src/app.module'
|
||||
import { BootstrapData, BOOTSTRAP_DATA } from '../terminus-core/src/api/mainProcess'
|
||||
|
||||
interface BootstrapOptions {
|
||||
packageModules: any[]
|
||||
bootstrapData: BootstrapData
|
||||
debugMode: boolean
|
||||
connector: any
|
||||
}
|
||||
|
||||
window['bootstrapTerminus'] = async function bootstrap (packageModules: any[], bootstrapData: BootstrapData, debugMode = false): Promise<NgModuleRef<any>> {
|
||||
window['bootstrapTerminus'] = async function bootstrap (options: BootstrapOptions): Promise<NgModuleRef<any>> {
|
||||
window.parent.postMessage('request-connector', '*')
|
||||
|
||||
const pluginModules = []
|
||||
for (const packageModule of packageModules) {
|
||||
for (const packageModule of options.packageModules) {
|
||||
const pluginModule = packageModule.default.forRoot ? packageModule.default.forRoot() : packageModule.default
|
||||
pluginModule.pluginName = packageModule.pluginName
|
||||
pluginModule.bootstrap = packageModule.bootstrap
|
||||
pluginModules.push(pluginModule)
|
||||
}
|
||||
|
||||
if (!debugMode) {
|
||||
if (!options.debugMode) {
|
||||
enableProdMode()
|
||||
}
|
||||
|
||||
@@ -35,9 +41,10 @@ window['bootstrapTerminus'] = async function bootstrap (packageModules: any[], b
|
||||
window['rootModule'] = module
|
||||
|
||||
const moduleRef = await platformBrowserDynamic([
|
||||
{ provide: BOOTSTRAP_DATA, useValue: bootstrapData },
|
||||
{ provide: BOOTSTRAP_DATA, useValue: options.bootstrapData },
|
||||
{ provide: 'WEB_CONNECTOR', useValue: options.connector },
|
||||
]).bootstrapModule(module)
|
||||
if (debugMode) {
|
||||
if (options.debugMode) {
|
||||
const applicationRef = moduleRef.injector.get(ApplicationRef)
|
||||
const componentRef = applicationRef.components[0]
|
||||
enableDebugTools(componentRef)
|
||||
|
239
web/polyfills.ts
239
web/polyfills.ts
@@ -15,6 +15,7 @@ import * as ngxToastrModule from 'ngx-toastr'
|
||||
import './polyfills.buffer'
|
||||
import { Duplex } from 'stream-browserify'
|
||||
|
||||
const Terminus = window['Terminus']
|
||||
|
||||
export class SocketProxy extends Duplex {
|
||||
socket: any
|
||||
@@ -50,144 +51,116 @@ export class SocketProxy extends Duplex {
|
||||
}
|
||||
}
|
||||
|
||||
const mocks = {
|
||||
fs: {
|
||||
realpathSync: () => null,
|
||||
readdir: () => null,
|
||||
stat: () => null,
|
||||
appendFile: () => null,
|
||||
constants: {},
|
||||
},
|
||||
buffer: {
|
||||
Buffer: window['Buffer'],
|
||||
},
|
||||
crypto: {
|
||||
...require('crypto-browserify'),
|
||||
getHashes () {
|
||||
return ['sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'md5', 'rmd160']
|
||||
},
|
||||
timingSafeEqual (a, b) {
|
||||
return a.equals(b)
|
||||
},
|
||||
},
|
||||
events: require('events'),
|
||||
path: require('path-browserify'),
|
||||
readline: {
|
||||
cursorTo: () => null,
|
||||
clearLine: stream => stream.write('\r'),
|
||||
},
|
||||
zlib: {
|
||||
...require('browserify-zlib'),
|
||||
constants: require('browserify-zlib'),
|
||||
},
|
||||
'any-promise': Promise,
|
||||
tls: { },
|
||||
module: {
|
||||
globalPaths: [],
|
||||
},
|
||||
assert: require('assert'),
|
||||
url: {
|
||||
parse: () => null,
|
||||
},
|
||||
net: {
|
||||
Socket: SocketProxy,
|
||||
},
|
||||
http: {
|
||||
Agent: class {},
|
||||
request: {},
|
||||
},
|
||||
https: {
|
||||
Agent: class {},
|
||||
request: {},
|
||||
},
|
||||
querystring: {},
|
||||
tty: { isatty: () => false },
|
||||
child_process: {},
|
||||
'readable-stream': {},
|
||||
os: {
|
||||
platform: () => 'web',
|
||||
homedir: () => '/home',
|
||||
},
|
||||
constants: require('constants-browserify'),
|
||||
'hterm-umdjs': {
|
||||
hterm: {
|
||||
PreferenceManager: class { set () {} },
|
||||
VT: {
|
||||
ESC: {},
|
||||
CSI: {},
|
||||
OSC: {},
|
||||
},
|
||||
Terminal: class {},
|
||||
Keyboard: class {},
|
||||
},
|
||||
lib: {
|
||||
wc: {},
|
||||
Storage: {
|
||||
Memory: class {},
|
||||
},
|
||||
},
|
||||
},
|
||||
dns: {},
|
||||
socksv5: {},
|
||||
util: require('util/'),
|
||||
keytar: {
|
||||
getPassword: () => null,
|
||||
},
|
||||
'./crypto/build/Release/sshcrypto.node': {},
|
||||
'../build/Release/cpufeatures.node': {},
|
||||
}
|
||||
Terminus.registerMock('fs', {
|
||||
realpathSync: () => null,
|
||||
readdir: () => null,
|
||||
stat: () => null,
|
||||
appendFile: () => null,
|
||||
constants: {},
|
||||
})
|
||||
Terminus.registerMock('readline', {
|
||||
cursorTo: () => null,
|
||||
clearLine: stream => stream.write('\r'),
|
||||
})
|
||||
Terminus.registerMock('any-promise', Promise)
|
||||
Terminus.registerMock('tls', {})
|
||||
Terminus.registerMock('module', {
|
||||
globalPaths: [],
|
||||
prototype: { require: window['require'] },
|
||||
})
|
||||
|
||||
const builtins = {
|
||||
'@angular/core': angularCoreModule,
|
||||
'@angular/compiler': angularCompilerModule,
|
||||
'@angular/common': angularCommonModule,
|
||||
'@angular/forms': angularFormsModule,
|
||||
'@angular/platform-browser': angularPlatformBrowserModule,
|
||||
'@angular/platform-browser/animations': angularPlatformBrowserAnimationsModule,
|
||||
'@angular/platform-browser-dynamic': angularPlatformBrowserDynamicModule,
|
||||
'@angular/animations': angularAnimationsModule,
|
||||
'@ng-bootstrap/ng-bootstrap': ngBootstrapModule,
|
||||
'ngx-toastr': ngxToastrModule,
|
||||
deepmerge: require('deepmerge'),
|
||||
rxjs: require('rxjs'),
|
||||
'rxjs/operators': require('rxjs/operators'),
|
||||
'js-yaml': require('js-yaml'),
|
||||
'zone.js/dist/zone.js': require('zone.js/dist/zone.js'),
|
||||
}
|
||||
Terminus.registerMock('url', {
|
||||
parse: () => null,
|
||||
})
|
||||
Terminus.registerMock('http', {
|
||||
Agent: class {},
|
||||
request: {},
|
||||
})
|
||||
Terminus.registerMock('https', {
|
||||
Agent: class {},
|
||||
request: {},
|
||||
})
|
||||
Terminus.registerMock('querystring', {})
|
||||
Terminus.registerMock('tty', { isatty: () => false })
|
||||
Terminus.registerMock('child_process', {})
|
||||
Terminus.registerMock('readable-stream', {})
|
||||
Terminus.registerMock('os', {
|
||||
platform: () => 'web',
|
||||
homedir: () => '/home',
|
||||
})
|
||||
Terminus.registerModule('buffer', {
|
||||
Buffer: window['Buffer'],
|
||||
})
|
||||
Terminus.registerModule('crypto', {
|
||||
...require('crypto-browserify'),
|
||||
getHashes () {
|
||||
return ['sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'md5', 'rmd160']
|
||||
},
|
||||
timingSafeEqual (a, b) {
|
||||
return a.equals(b)
|
||||
},
|
||||
})
|
||||
Terminus.registerMock('hterm-umdjs', {
|
||||
hterm: {
|
||||
PreferenceManager: class { set () {} },
|
||||
VT: {
|
||||
ESC: {},
|
||||
CSI: {},
|
||||
OSC: {},
|
||||
},
|
||||
Terminal: class {},
|
||||
Keyboard: class {},
|
||||
},
|
||||
lib: {
|
||||
wc: {},
|
||||
Storage: {
|
||||
Memory: class {},
|
||||
},
|
||||
},
|
||||
})
|
||||
Terminus.registerMock('dns', {})
|
||||
Terminus.registerMock('socksv5', {})
|
||||
Terminus.registerMock('util', require('util/'))
|
||||
Terminus.registerMock('keytar', {
|
||||
getPassword: () => null,
|
||||
})
|
||||
|
||||
const originalRequire = window['require']
|
||||
const mockRequire = path => {
|
||||
if (mocks[path]) {
|
||||
console.log(':: mock', path)
|
||||
return mocks[path]
|
||||
}
|
||||
if (builtins[path]) {
|
||||
return builtins[path]
|
||||
}
|
||||
return originalRequire(path)
|
||||
}
|
||||
Terminus.registerModule('net', {
|
||||
Socket: SocketProxy,
|
||||
})
|
||||
Terminus.registerModule('events', require('events'))
|
||||
Terminus.registerModule('path', require('path-browserify'))
|
||||
Terminus.registerModule('zlib', {
|
||||
...require('browserify-zlib'),
|
||||
constants: require('browserify-zlib'),
|
||||
})
|
||||
Terminus.registerModule('assert', Object.assign(
|
||||
require('assert'),
|
||||
{
|
||||
assertNotStrictEqual: () => true,
|
||||
notStrictEqual: () => true,
|
||||
},
|
||||
))
|
||||
Terminus.registerModule('constants', require('constants-browserify'))
|
||||
Terminus.registerModule('stream', require('stream-browserify'))
|
||||
|
||||
mockRequire['resolve'] = (() => null) as any
|
||||
Terminus.registerModule('@angular/core', angularCoreModule)
|
||||
Terminus.registerModule('@angular/compiler', angularCompilerModule)
|
||||
Terminus.registerModule('@angular/common', angularCommonModule)
|
||||
Terminus.registerModule('@angular/forms', angularFormsModule)
|
||||
Terminus.registerModule('@angular/platform-browser', angularPlatformBrowserModule)
|
||||
Terminus.registerModule('@angular/platform-browser/animations', angularPlatformBrowserAnimationsModule)
|
||||
Terminus.registerModule('@angular/platform-browser-dynamic', angularPlatformBrowserDynamicModule)
|
||||
Terminus.registerModule('@angular/animations', angularAnimationsModule)
|
||||
Terminus.registerModule('@ng-bootstrap/ng-bootstrap', ngBootstrapModule)
|
||||
Terminus.registerModule('ngx-toastr', ngxToastrModule)
|
||||
Terminus.registerModule('deepmerge', require('deepmerge'))
|
||||
Terminus.registerModule('rxjs', require('rxjs'))
|
||||
Terminus.registerModule('rxjs/operators', require('rxjs/operators'))
|
||||
Terminus.registerModule('js-yaml', require('js-yaml'))
|
||||
Terminus.registerModule('zone.js/dist/zone.js', require('zone.js/dist/zone.js'))
|
||||
|
||||
Object.assign(window, {
|
||||
require: mockRequire,
|
||||
module: {
|
||||
paths: [],
|
||||
},
|
||||
__dirname: '__dirname',
|
||||
setImmediate: setTimeout as any,
|
||||
})
|
||||
|
||||
window['require'].main = {
|
||||
paths: [],
|
||||
} as any
|
||||
|
||||
mocks.module['prototype'] = { require: window['require'] }
|
||||
mocks.assert.assertNotStrictEqual = () => true
|
||||
mocks.assert.notStrictEqual = () => true
|
||||
|
||||
// Late mocks and builtins
|
||||
|
||||
builtins['ssh2'] = require('ssh2')
|
||||
builtins['ssh2/lib/protocol/constants'] = require('ssh2/lib/protocol/constants')
|
||||
builtins['stream'] = require('stream-browserify')
|
||||
|
@@ -12,4 +12,5 @@ module.exports = [
|
||||
require('./terminus-ssh/webpack.config.js'),
|
||||
require('./terminus-serial/webpack.config.js'),
|
||||
require('./terminus-web/webpack.config.js'),
|
||||
require('./web/webpack.config.js'),
|
||||
]
|
||||
|
@@ -39,6 +39,7 @@ module.exports = options => {
|
||||
cacheDirectory: path.resolve(options.dirname, 'node_modules', '.webpack-cache'),
|
||||
},
|
||||
resolve: {
|
||||
alias: options.alias ?? {},
|
||||
modules: ['.', 'src', 'node_modules', '../app/node_modules'].map(x => path.join(options.dirname, x)),
|
||||
extensions: ['.ts', '.js'],
|
||||
},
|
||||
@@ -100,8 +101,6 @@ module.exports = options => {
|
||||
'path',
|
||||
'readline',
|
||||
'serialport',
|
||||
'ssh2',
|
||||
'ssh2/lib/protocol/constants',
|
||||
'socksv5',
|
||||
'stream',
|
||||
'windows-native-registry',
|
||||
|
408
yarn.lock
408
yarn.lock
@@ -14,11 +14,23 @@
|
||||
dependencies:
|
||||
"@babel/highlight" "^7.10.4"
|
||||
|
||||
"@babel/code-frame@^7.0.0":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb"
|
||||
integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==
|
||||
dependencies:
|
||||
"@babel/highlight" "^7.14.5"
|
||||
|
||||
"@babel/helper-validator-identifier@^7.12.11":
|
||||
version "7.12.11"
|
||||
resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz"
|
||||
integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==
|
||||
|
||||
"@babel/helper-validator-identifier@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8"
|
||||
integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==
|
||||
|
||||
"@babel/highlight@^7.10.4":
|
||||
version "7.13.10"
|
||||
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1"
|
||||
@@ -28,6 +40,15 @@
|
||||
chalk "^2.0.0"
|
||||
js-tokens "^4.0.0"
|
||||
|
||||
"@babel/highlight@^7.14.5":
|
||||
version "7.14.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9"
|
||||
integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==
|
||||
dependencies:
|
||||
"@babel/helper-validator-identifier" "^7.14.5"
|
||||
chalk "^2.0.0"
|
||||
js-tokens "^4.0.0"
|
||||
|
||||
"@babel/parser@^7.6.0", "@babel/parser@^7.9.6":
|
||||
version "7.12.11"
|
||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79"
|
||||
@@ -82,15 +103,15 @@
|
||||
dir-compare "^2.4.0"
|
||||
fs-extra "^9.0.1"
|
||||
|
||||
"@eslint/eslintrc@^0.4.1":
|
||||
version "0.4.1"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.1.tgz#442763b88cecbe3ee0ec7ca6d6dd6168550cbf14"
|
||||
integrity sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ==
|
||||
"@eslint/eslintrc@^0.4.2":
|
||||
version "0.4.2"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.2.tgz#f63d0ef06f5c0c57d76c4ab5f63d3835c51b0179"
|
||||
integrity sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==
|
||||
dependencies:
|
||||
ajv "^6.12.4"
|
||||
debug "^4.1.1"
|
||||
espree "^7.3.0"
|
||||
globals "^12.1.0"
|
||||
globals "^13.9.0"
|
||||
ignore "^4.0.6"
|
||||
import-fresh "^3.2.1"
|
||||
js-yaml "^3.13.1"
|
||||
@@ -383,6 +404,11 @@
|
||||
resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz"
|
||||
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
|
||||
|
||||
"@types/minimist@^1.2.0":
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256"
|
||||
integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==
|
||||
|
||||
"@types/node@*", "@types/node@15.6.1":
|
||||
version "15.6.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.1.tgz#32d43390d5c62c5b6ec486a9bc9c59544de39a08"
|
||||
@@ -393,6 +419,11 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.35.tgz#42c953a4e2b18ab931f72477e7012172f4ffa313"
|
||||
integrity sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag==
|
||||
|
||||
"@types/normalize-package-data@^2.4.0":
|
||||
version "2.4.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
|
||||
integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
|
||||
|
||||
"@types/plist@^3.0.1":
|
||||
version "3.0.2"
|
||||
resolved "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz"
|
||||
@@ -456,14 +487,14 @@
|
||||
eslint-scope "^5.0.0"
|
||||
eslint-utils "^2.0.0"
|
||||
|
||||
"@typescript-eslint/parser@^4.26.0":
|
||||
version "4.26.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.26.0.tgz#31b6b732c9454f757b020dab9b6754112aa5eeaf"
|
||||
integrity sha512-b4jekVJG9FfmjUfmM4VoOItQhPlnt6MPOBUL0AQbiTmm+SSpSdhHYlwayOm4IW9KLI/4/cRKtQCmDl1oE2OlPg==
|
||||
"@typescript-eslint/parser@^4.28.0":
|
||||
version "4.28.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.28.0.tgz#2404c16751a28616ef3abab77c8e51d680a12caa"
|
||||
integrity sha512-7x4D22oPY8fDaOCvkuXtYYTQ6mTMmkivwEzS+7iml9F9VkHGbbZ3x4fHRwxAb5KeuSkLqfnYjs46tGx2Nour4A==
|
||||
dependencies:
|
||||
"@typescript-eslint/scope-manager" "4.26.0"
|
||||
"@typescript-eslint/types" "4.26.0"
|
||||
"@typescript-eslint/typescript-estree" "4.26.0"
|
||||
"@typescript-eslint/scope-manager" "4.28.0"
|
||||
"@typescript-eslint/types" "4.28.0"
|
||||
"@typescript-eslint/typescript-estree" "4.28.0"
|
||||
debug "^4.3.1"
|
||||
|
||||
"@typescript-eslint/scope-manager@4.25.0":
|
||||
@@ -474,23 +505,23 @@
|
||||
"@typescript-eslint/types" "4.25.0"
|
||||
"@typescript-eslint/visitor-keys" "4.25.0"
|
||||
|
||||
"@typescript-eslint/scope-manager@4.26.0":
|
||||
version "4.26.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.26.0.tgz#60d1a71df162404e954b9d1c6343ff3bee496194"
|
||||
integrity sha512-G6xB6mMo4xVxwMt5lEsNTz3x4qGDt0NSGmTBNBPJxNsrTXJSm21c6raeYroS2OwQsOyIXqKZv266L/Gln1BWqg==
|
||||
"@typescript-eslint/scope-manager@4.28.0":
|
||||
version "4.28.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.28.0.tgz#6a3009d2ab64a30fc8a1e257a1a320067f36a0ce"
|
||||
integrity sha512-eCALCeScs5P/EYjwo6se9bdjtrh8ByWjtHzOkC4Tia6QQWtQr3PHovxh3TdYTuFcurkYI4rmFsRFpucADIkseg==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "4.26.0"
|
||||
"@typescript-eslint/visitor-keys" "4.26.0"
|
||||
"@typescript-eslint/types" "4.28.0"
|
||||
"@typescript-eslint/visitor-keys" "4.28.0"
|
||||
|
||||
"@typescript-eslint/types@4.25.0":
|
||||
version "4.25.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.25.0.tgz#0e444a5c5e3c22d7ffa5e16e0e60510b3de5af87"
|
||||
integrity sha512-+CNINNvl00OkW6wEsi32wU5MhHti2J25TJsJJqgQmJu3B3dYDBcmOxcE5w9cgoM13TrdE/5ND2HoEnBohasxRQ==
|
||||
|
||||
"@typescript-eslint/types@4.26.0":
|
||||
version "4.26.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.26.0.tgz#7c6732c0414f0a69595f4f846ebe12616243d546"
|
||||
integrity sha512-rADNgXl1kS/EKnDr3G+m7fB9yeJNnR9kF7xMiXL6mSIWpr3Wg5MhxyfEXy/IlYthsqwBqHOr22boFbf/u6O88A==
|
||||
"@typescript-eslint/types@4.28.0":
|
||||
version "4.28.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.28.0.tgz#a33504e1ce7ac51fc39035f5fe6f15079d4dafb0"
|
||||
integrity sha512-p16xMNKKoiJCVZY5PW/AfILw2xe1LfruTcfAKBj3a+wgNYP5I9ZEKNDOItoRt53p4EiPV6iRSICy8EPanG9ZVA==
|
||||
|
||||
"@typescript-eslint/typescript-estree@4.25.0":
|
||||
version "4.25.0"
|
||||
@@ -505,13 +536,13 @@
|
||||
semver "^7.3.2"
|
||||
tsutils "^3.17.1"
|
||||
|
||||
"@typescript-eslint/typescript-estree@4.26.0":
|
||||
version "4.26.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.26.0.tgz#aea17a40e62dc31c63d5b1bbe9a75783f2ce7109"
|
||||
integrity sha512-GHUgahPcm9GfBuy3TzdsizCcPjKOAauG9xkz9TR8kOdssz2Iz9jRCSQm6+aVFa23d5NcSpo1GdHGSQKe0tlcbg==
|
||||
"@typescript-eslint/typescript-estree@4.28.0":
|
||||
version "4.28.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.0.tgz#e66d4e5aa2ede66fec8af434898fe61af10c71cf"
|
||||
integrity sha512-m19UQTRtxMzKAm8QxfKpvh6OwQSXaW1CdZPoCaQuLwAq7VZMNuhJmZR4g5281s2ECt658sldnJfdpSZZaxUGMQ==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "4.26.0"
|
||||
"@typescript-eslint/visitor-keys" "4.26.0"
|
||||
"@typescript-eslint/types" "4.28.0"
|
||||
"@typescript-eslint/visitor-keys" "4.28.0"
|
||||
debug "^4.3.1"
|
||||
globby "^11.0.3"
|
||||
is-glob "^4.0.1"
|
||||
@@ -526,12 +557,12 @@
|
||||
"@typescript-eslint/types" "4.25.0"
|
||||
eslint-visitor-keys "^2.0.0"
|
||||
|
||||
"@typescript-eslint/visitor-keys@4.26.0":
|
||||
version "4.26.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.26.0.tgz#26d2583169222815be4dcd1da4fe5459bc3bcc23"
|
||||
integrity sha512-cw4j8lH38V1ycGBbF+aFiLUls9Z0Bw8QschP3mkth50BbWzgFS33ISIgBzUMuQ2IdahoEv/rXstr8Zhlz4B1Zg==
|
||||
"@typescript-eslint/visitor-keys@4.28.0":
|
||||
version "4.28.0"
|
||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.0.tgz#255c67c966ec294104169a6939d96f91c8a89434"
|
||||
integrity sha512-PjJyTWwrlrvM5jazxYF5ZPs/nl0kHDZMVbuIcbpawVXaDPelp3+S9zpOz5RmVUfS/fD5l5+ZXNKnWhNYjPzCvw==
|
||||
dependencies:
|
||||
"@typescript-eslint/types" "4.26.0"
|
||||
"@typescript-eslint/types" "4.28.0"
|
||||
eslint-visitor-keys "^2.0.0"
|
||||
|
||||
"@webassemblyjs/ast@1.11.0":
|
||||
@@ -1004,6 +1035,11 @@ array.prototype.flat@^1.2.4:
|
||||
define-properties "^1.1.3"
|
||||
es-abstract "^1.18.0-next.1"
|
||||
|
||||
arrify@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
|
||||
integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
|
||||
|
||||
asap@^2.0.0:
|
||||
version "2.0.5"
|
||||
resolved "https://registry.npmjs.org/asap/-/asap-2.0.5.tgz"
|
||||
@@ -1509,6 +1545,15 @@ camelcase-keys@^2.0.0:
|
||||
camelcase "^2.0.0"
|
||||
map-obj "^1.0.0"
|
||||
|
||||
camelcase-keys@^6.2.2:
|
||||
version "6.2.2"
|
||||
resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0"
|
||||
integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==
|
||||
dependencies:
|
||||
camelcase "^5.3.1"
|
||||
map-obj "^4.0.0"
|
||||
quick-lru "^4.0.1"
|
||||
|
||||
camelcase@^1.0.2:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz"
|
||||
@@ -1524,7 +1569,7 @@ camelcase@^4.0.0, camelcase@^4.1.0:
|
||||
resolved "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz"
|
||||
integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
|
||||
|
||||
camelcase@^5.0.0:
|
||||
camelcase@^5.0.0, camelcase@^5.3.1:
|
||||
version "5.3.1"
|
||||
resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz"
|
||||
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
|
||||
@@ -2165,7 +2210,15 @@ debuglog@^1.0.1:
|
||||
resolved "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz"
|
||||
integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=
|
||||
|
||||
decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0:
|
||||
decamelize-keys@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
|
||||
integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=
|
||||
dependencies:
|
||||
decamelize "^1.1.0"
|
||||
map-obj "^1.0.0"
|
||||
|
||||
decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz"
|
||||
integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
|
||||
@@ -2576,10 +2629,10 @@ electron-to-chromium@^1.3.723:
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.736.tgz#f632d900a1f788dab22fec9c62ec5c9c8f0c4052"
|
||||
integrity sha512-DY8dA7gR51MSo66DqitEQoUMQ0Z+A2DSXFi7tK304bdTVqczCAfUuyQw6Wdg8hIoo5zIxkU1L24RQtUce1Ioig==
|
||||
|
||||
electron@13.1.1:
|
||||
version "13.1.1"
|
||||
resolved "https://registry.yarnpkg.com/electron/-/electron-13.1.1.tgz#de1ea908bcac2197d7a5a373fb68c0c66043e10e"
|
||||
integrity sha512-kySSb5CbIkWU2Kd9mf2rpGZC9p1nWhVVNl+CJjuOUGeVPXHbojHvTkDU1iC8AvV28eik3gqHisSJss40Caprog==
|
||||
electron@13.1.4:
|
||||
version "13.1.4"
|
||||
resolved "https://registry.yarnpkg.com/electron/-/electron-13.1.4.tgz#6d20d932a0651c3cba9f09a3d08cbaf5b69aa84b"
|
||||
integrity sha512-4qhRZbRvGqHmMWsCG/kRVF4X8VIq9Nujgm+gXZLBSpiR6uUtMHy7ViBTQZl1PGf6O9Ppxhpr9Yz+k6Um9WoP3Q==
|
||||
dependencies:
|
||||
"@electron/get" "^1.0.1"
|
||||
"@types/node" "^14.6.2"
|
||||
@@ -2741,10 +2794,10 @@ es-abstract@^1.18.0-next.2:
|
||||
string.prototype.trimstart "^1.0.4"
|
||||
unbox-primitive "^1.0.0"
|
||||
|
||||
es-module-lexer@^0.4.0:
|
||||
version "0.4.1"
|
||||
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.4.1.tgz#dda8c6a14d8f340a24e34331e0fab0cb50438e0e"
|
||||
integrity sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA==
|
||||
es-module-lexer@^0.6.0:
|
||||
version "0.6.0"
|
||||
resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.6.0.tgz#e72ab05b7412e62b9be37c37a09bdb6000d706f0"
|
||||
integrity sha512-f8kcHX1ArhllUtb/wVSyvygoKCznIjnxhLxy7TCvIiMdT7fL4ZDTIKaadMe6eLvOXg6Wk02UeoFgUoZ2EKZZUA==
|
||||
|
||||
es-to-primitive@^1.2.1:
|
||||
version "1.2.1"
|
||||
@@ -2880,13 +2933,13 @@ eslint-visitor-keys@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
|
||||
integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
|
||||
|
||||
eslint@^7.27.0:
|
||||
version "7.27.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.27.0.tgz#665a1506d8f95655c9274d84bd78f7166b07e9c7"
|
||||
integrity sha512-JZuR6La2ZF0UD384lcbnd0Cgg6QJjiCwhMD6eU4h/VGPcVGwawNNzKU41tgokGXnfjOOyI6QIffthhJTPzzuRA==
|
||||
eslint@^7.29.0:
|
||||
version "7.29.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.29.0.tgz#ee2a7648f2e729485e4d0bd6383ec1deabc8b3c0"
|
||||
integrity sha512-82G/JToB9qIy/ArBzIWG9xvvwL3R86AlCjtGw+A29OMZDqhTybz/MByORSukGxeI+YPCR4coYyITKk8BFH9nDA==
|
||||
dependencies:
|
||||
"@babel/code-frame" "7.12.11"
|
||||
"@eslint/eslintrc" "^0.4.1"
|
||||
"@eslint/eslintrc" "^0.4.2"
|
||||
ajv "^6.10.0"
|
||||
chalk "^4.0.0"
|
||||
cross-spawn "^7.0.2"
|
||||
@@ -2903,7 +2956,7 @@ eslint@^7.27.0:
|
||||
fast-deep-equal "^3.1.3"
|
||||
file-entry-cache "^6.0.1"
|
||||
functional-red-black-tree "^1.0.1"
|
||||
glob-parent "^5.0.0"
|
||||
glob-parent "^5.1.2"
|
||||
globals "^13.6.0"
|
||||
ignore "^4.0.6"
|
||||
import-fresh "^3.0.0"
|
||||
@@ -3511,7 +3564,7 @@ getpass@^0.1.1:
|
||||
dependencies:
|
||||
assert-plus "^1.0.0"
|
||||
|
||||
glob-parent@^5.0.0, glob-parent@^5.1.0:
|
||||
glob-parent@^5.1.0, glob-parent@^5.1.2:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
|
||||
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
|
||||
@@ -3572,17 +3625,10 @@ global-tunnel-ng@^2.7.1:
|
||||
npm-conf "^1.1.3"
|
||||
tunnel "^0.0.6"
|
||||
|
||||
globals@^12.1.0:
|
||||
version "12.4.0"
|
||||
resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8"
|
||||
integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==
|
||||
dependencies:
|
||||
type-fest "^0.8.1"
|
||||
|
||||
globals@^13.6.0:
|
||||
version "13.7.0"
|
||||
resolved "https://registry.yarnpkg.com/globals/-/globals-13.7.0.tgz#aed3bcefd80ad3ec0f0be2cf0c895110c0591795"
|
||||
integrity sha512-Aipsz6ZKRxa/xQkZhNg0qIWXT6x6rD46f6x/PCnBomlttdIyAPak4YD9jTmKpZ72uROSMU87qJtcgpgHaVchiA==
|
||||
globals@^13.6.0, globals@^13.9.0:
|
||||
version "13.9.0"
|
||||
resolved "https://registry.yarnpkg.com/globals/-/globals-13.9.0.tgz#4bf2bf635b334a173fb1daf7c5e6b218ecdc06cb"
|
||||
integrity sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==
|
||||
dependencies:
|
||||
type-fest "^0.20.2"
|
||||
|
||||
@@ -3732,6 +3778,11 @@ har-validator@~5.1.3:
|
||||
ajv "^6.12.3"
|
||||
har-schema "^2.0.0"
|
||||
|
||||
hard-rejection@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883"
|
||||
integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==
|
||||
|
||||
has-ansi@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz"
|
||||
@@ -4051,6 +4102,11 @@ indent-string@^2.1.0:
|
||||
dependencies:
|
||||
repeating "^2.0.0"
|
||||
|
||||
indent-string@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
|
||||
integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
|
||||
|
||||
indexes-of@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz"
|
||||
@@ -4366,6 +4422,11 @@ is-path-inside@^3.0.2:
|
||||
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
|
||||
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
|
||||
|
||||
is-plain-obj@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
|
||||
integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
|
||||
|
||||
is-plain-object@^2.0.3, is-plain-object@^2.0.4:
|
||||
version "2.0.4"
|
||||
resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz"
|
||||
@@ -4520,14 +4581,14 @@ jake@^10.6.1:
|
||||
filelist "^1.0.1"
|
||||
minimatch "^3.0.4"
|
||||
|
||||
jest-worker@^26.6.2:
|
||||
version "26.6.2"
|
||||
resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed"
|
||||
integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==
|
||||
jest-worker@^27.0.2:
|
||||
version "27.0.2"
|
||||
resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.2.tgz#4ebeb56cef48b3e7514552f80d0d80c0129f0b05"
|
||||
integrity sha512-EoBdilOTTyOgmHXtw/cPc+ZrCA0KJMrkXzkrPGNwLmnvvlN1nj7MPrxpT7m+otSv2e1TLaVffzDnE/LB14zJMg==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
merge-stream "^2.0.0"
|
||||
supports-color "^7.0.0"
|
||||
supports-color "^8.0.0"
|
||||
|
||||
jju@^1.1.0:
|
||||
version "1.3.0"
|
||||
@@ -4599,6 +4660,11 @@ json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
|
||||
resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz"
|
||||
integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
|
||||
|
||||
json-parse-even-better-errors@^2.3.0:
|
||||
version "2.3.1"
|
||||
resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
|
||||
integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
|
||||
|
||||
json-parse-helpfulerror@^1.0.2, json-parse-helpfulerror@^1.0.3:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz"
|
||||
@@ -4744,7 +4810,7 @@ kind-of@^5.0.0:
|
||||
resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz"
|
||||
integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
|
||||
|
||||
kind-of@^6.0.0, kind-of@^6.0.2:
|
||||
kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
|
||||
version "6.0.3"
|
||||
resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz"
|
||||
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
|
||||
@@ -4819,6 +4885,11 @@ libnpx@10.2.2:
|
||||
y18n "^4.0.0"
|
||||
yargs "^11.0.0"
|
||||
|
||||
lines-and-columns@^1.1.6:
|
||||
version "1.1.6"
|
||||
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
|
||||
integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
|
||||
|
||||
load-json-file@^1.0.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz"
|
||||
@@ -5109,6 +5180,11 @@ map-obj@^1.0.0, map-obj@^1.0.1:
|
||||
resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz"
|
||||
integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
|
||||
|
||||
map-obj@^4.0.0:
|
||||
version "4.2.1"
|
||||
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7"
|
||||
integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==
|
||||
|
||||
map-visit@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz"
|
||||
@@ -5145,7 +5221,7 @@ memory-fs@^0.5.0:
|
||||
errno "^0.1.3"
|
||||
readable-stream "^2.0.1"
|
||||
|
||||
meow@^3.1.0, meow@^3.7.0:
|
||||
meow@^3.1.0:
|
||||
version "3.7.0"
|
||||
resolved "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz"
|
||||
integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=
|
||||
@@ -5161,6 +5237,24 @@ meow@^3.1.0, meow@^3.7.0:
|
||||
redent "^1.0.0"
|
||||
trim-newlines "^1.0.0"
|
||||
|
||||
meow@^9.0.0:
|
||||
version "9.0.0"
|
||||
resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364"
|
||||
integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==
|
||||
dependencies:
|
||||
"@types/minimist" "^1.2.0"
|
||||
camelcase-keys "^6.2.2"
|
||||
decamelize "^1.2.0"
|
||||
decamelize-keys "^1.1.0"
|
||||
hard-rejection "^2.1.0"
|
||||
minimist-options "4.1.0"
|
||||
normalize-package-data "^3.0.0"
|
||||
read-pkg-up "^7.0.1"
|
||||
redent "^3.0.0"
|
||||
trim-newlines "^3.0.0"
|
||||
type-fest "^0.18.0"
|
||||
yargs-parser "^20.2.3"
|
||||
|
||||
merge-stream@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz"
|
||||
@@ -5198,30 +5292,18 @@ micromatch@^4.0.2:
|
||||
braces "^3.0.1"
|
||||
picomatch "^2.0.5"
|
||||
|
||||
mime-db@1.44.0:
|
||||
version "1.44.0"
|
||||
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz"
|
||||
integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==
|
||||
|
||||
mime-db@1.47.0:
|
||||
version "1.47.0"
|
||||
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c"
|
||||
integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==
|
||||
|
||||
mime-types@^2.1.12, mime-types@~2.1.7:
|
||||
mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.7:
|
||||
version "2.1.30"
|
||||
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d"
|
||||
integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==
|
||||
dependencies:
|
||||
mime-db "1.47.0"
|
||||
|
||||
mime-types@^2.1.27, mime-types@~2.1.19:
|
||||
version "2.1.27"
|
||||
resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz"
|
||||
integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==
|
||||
dependencies:
|
||||
mime-db "1.44.0"
|
||||
|
||||
mime@^2.3.1, mime@^2.5.0:
|
||||
version "2.5.2"
|
||||
resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe"
|
||||
@@ -5242,6 +5324,11 @@ mimic-response@^3.1.0:
|
||||
resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz"
|
||||
integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
|
||||
|
||||
min-indent@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
|
||||
integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
|
||||
|
||||
minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2:
|
||||
version "3.0.4"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
|
||||
@@ -5249,6 +5336,15 @@ minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch
|
||||
dependencies:
|
||||
brace-expansion "^1.1.7"
|
||||
|
||||
minimist-options@4.1.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619"
|
||||
integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==
|
||||
dependencies:
|
||||
arrify "^1.0.1"
|
||||
is-plain-obj "^1.1.0"
|
||||
kind-of "^6.0.3"
|
||||
|
||||
minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
|
||||
version "1.2.5"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
|
||||
@@ -5503,10 +5599,10 @@ node-releases@^1.1.71:
|
||||
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe"
|
||||
integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==
|
||||
|
||||
node-sass@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-6.0.0.tgz#f30da3e858ad47bfd138bc0e0c6f924ed2f734af"
|
||||
integrity sha512-GDzDmNgWNc9GNzTcSLTi6DU6mzSPupVJoStIi7cF3GjwSE9q1cVakbvAAVSt59vzUjV9JJoSZFKoo9krbjKd2g==
|
||||
node-sass@^6.0.1:
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-6.0.1.tgz#cad1ccd0ce63e35c7181f545d8b986f3a9a887fe"
|
||||
integrity sha512-f+Rbqt92Ful9gX0cGtdYwjTrWAaGURgaK5rZCWOgCNyGWusFYHhbqCCBoFBeat+HKETOU02AyTxNhJV0YZf2jQ==
|
||||
dependencies:
|
||||
async-foreach "^0.1.3"
|
||||
chalk "^1.1.1"
|
||||
@@ -5515,8 +5611,7 @@ node-sass@^6.0.0:
|
||||
get-stdin "^4.0.1"
|
||||
glob "^7.0.3"
|
||||
lodash "^4.17.15"
|
||||
meow "^3.7.0"
|
||||
mkdirp "^0.5.1"
|
||||
meow "^9.0.0"
|
||||
nan "^2.13.2"
|
||||
node-gyp "^7.1.0"
|
||||
npmlog "^4.0.0"
|
||||
@@ -5557,7 +5652,7 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.4.0, "normalize-package
|
||||
semver "2 || 3 || 4 || 5"
|
||||
validate-npm-package-license "^3.0.1"
|
||||
|
||||
normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
|
||||
normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0:
|
||||
version "2.5.0"
|
||||
resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz"
|
||||
integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
|
||||
@@ -6170,6 +6265,16 @@ parse-json@^4.0.0:
|
||||
error-ex "^1.3.1"
|
||||
json-parse-better-errors "^1.0.1"
|
||||
|
||||
parse-json@^5.0.0:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
|
||||
integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
|
||||
dependencies:
|
||||
"@babel/code-frame" "^7.0.0"
|
||||
error-ex "^1.3.1"
|
||||
json-parse-even-better-errors "^2.3.0"
|
||||
lines-and-columns "^1.1.6"
|
||||
|
||||
parse5@^6.0.1:
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
|
||||
@@ -6818,6 +6923,11 @@ queue-microtask@^1.2.2:
|
||||
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz#abf64491e6ecf0f38a6502403d4cda04f372dfd3"
|
||||
integrity sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==
|
||||
|
||||
quick-lru@^4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
|
||||
integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
|
||||
|
||||
quick-lru@^5.1.1:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz"
|
||||
@@ -6918,6 +7028,15 @@ read-pkg-up@^3.0.0:
|
||||
find-up "^2.0.0"
|
||||
read-pkg "^3.0.0"
|
||||
|
||||
read-pkg-up@^7.0.1:
|
||||
version "7.0.1"
|
||||
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
|
||||
integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==
|
||||
dependencies:
|
||||
find-up "^4.1.0"
|
||||
read-pkg "^5.2.0"
|
||||
type-fest "^0.8.1"
|
||||
|
||||
read-pkg@^1.0.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz"
|
||||
@@ -6936,6 +7055,16 @@ read-pkg@^3.0.0:
|
||||
normalize-package-data "^2.3.2"
|
||||
path-type "^3.0.0"
|
||||
|
||||
read-pkg@^5.2.0:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
|
||||
integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
|
||||
dependencies:
|
||||
"@types/normalize-package-data" "^2.4.0"
|
||||
normalize-package-data "^2.5.0"
|
||||
parse-json "^5.0.0"
|
||||
type-fest "^0.6.0"
|
||||
|
||||
read@1, read@~1.0.1, read@~1.0.7:
|
||||
version "1.0.7"
|
||||
resolved "https://registry.npmjs.org/read/-/read-1.0.7.tgz"
|
||||
@@ -6998,6 +7127,14 @@ redent@^1.0.0:
|
||||
indent-string "^2.1.0"
|
||||
strip-indent "^1.0.1"
|
||||
|
||||
redent@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
|
||||
integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
|
||||
dependencies:
|
||||
indent-string "^4.0.0"
|
||||
strip-indent "^3.0.0"
|
||||
|
||||
regenerator-runtime@^0.11.0:
|
||||
version "0.11.1"
|
||||
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
|
||||
@@ -7306,10 +7443,10 @@ sass-graph@2.2.5:
|
||||
scss-tokenizer "^0.2.3"
|
||||
yargs "^13.3.2"
|
||||
|
||||
sass-loader@^12.0.0:
|
||||
version "12.0.0"
|
||||
resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.0.0.tgz#ba91df5725cb9676c8e0937002a647ab011eb94a"
|
||||
integrity sha512-LJQMyDdNdhcvoO2gJFw7KpTaioVFDeRJOuatRDUNgCIqyu4s4kgDsNofdGzAZB1zFOgo/p3fy+aR/uGXamcJBg==
|
||||
sass-loader@^12.1.0:
|
||||
version "12.1.0"
|
||||
resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.1.0.tgz#b73324622231009da6fba61ab76013256380d201"
|
||||
integrity sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg==
|
||||
dependencies:
|
||||
klona "^2.0.4"
|
||||
neo-async "^2.6.2"
|
||||
@@ -7922,6 +8059,13 @@ strip-indent@^1.0.1:
|
||||
dependencies:
|
||||
get-stdin "^4.0.1"
|
||||
|
||||
strip-indent@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
|
||||
integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
|
||||
dependencies:
|
||||
min-indent "^1.0.0"
|
||||
|
||||
strip-json-comments@^2.0.1, strip-json-comments@~2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz"
|
||||
@@ -7932,13 +8076,10 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
|
||||
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
|
||||
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
|
||||
|
||||
style-loader@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c"
|
||||
integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==
|
||||
dependencies:
|
||||
loader-utils "^2.0.0"
|
||||
schema-utils "^3.0.0"
|
||||
style-loader@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.0.0.tgz#2eafcd0dbe70b07438e0256a9714ea94dd63cbe0"
|
||||
integrity sha512-pqJTDiCtLr8D2eyVWXPiwNkLsAMDuvPHnu+Z/Edo9hu+DzdJwdO5eZv9zUBF6tWI8GJGhAkenWJaVjXI+sHnuQ==
|
||||
|
||||
sumchecker@^2.0.2:
|
||||
version "2.0.2"
|
||||
@@ -7966,13 +8107,20 @@ supports-color@^5.3.0:
|
||||
dependencies:
|
||||
has-flag "^3.0.0"
|
||||
|
||||
supports-color@^7.0.0, supports-color@^7.1.0:
|
||||
supports-color@^7.1.0:
|
||||
version "7.2.0"
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
|
||||
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
|
||||
dependencies:
|
||||
has-flag "^4.0.0"
|
||||
|
||||
supports-color@^8.0.0:
|
||||
version "8.1.1"
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
|
||||
integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
|
||||
dependencies:
|
||||
has-flag "^4.0.0"
|
||||
|
||||
svg-inline-loader@^0.8.2:
|
||||
version "0.8.2"
|
||||
resolved "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.2.tgz"
|
||||
@@ -8083,17 +8231,17 @@ term-size@^1.2.0:
|
||||
dependencies:
|
||||
execa "^0.7.0"
|
||||
|
||||
terser-webpack-plugin@^5.1.1:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz#7effadee06f7ecfa093dbbd3e9ab23f5f3ed8673"
|
||||
integrity sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q==
|
||||
terser-webpack-plugin@^5.1.3:
|
||||
version "5.1.3"
|
||||
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.3.tgz#30033e955ca28b55664f1e4b30a1347e61aa23af"
|
||||
integrity sha512-cxGbMqr6+A2hrIB5ehFIF+F/iST5ZOxvOmy9zih9ySbP1C2oEWQSOUS+2SNBTjzx5xLKO4xnod9eywdfq1Nb9A==
|
||||
dependencies:
|
||||
jest-worker "^26.6.2"
|
||||
jest-worker "^27.0.2"
|
||||
p-limit "^3.1.0"
|
||||
schema-utils "^3.0.0"
|
||||
serialize-javascript "^5.0.1"
|
||||
source-map "^0.6.1"
|
||||
terser "^5.5.1"
|
||||
terser "^5.7.0"
|
||||
|
||||
terser@^4.6.3:
|
||||
version "4.8.0"
|
||||
@@ -8104,10 +8252,10 @@ terser@^4.6.3:
|
||||
source-map "~0.6.1"
|
||||
source-map-support "~0.5.12"
|
||||
|
||||
terser@^5.5.1:
|
||||
version "5.5.1"
|
||||
resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.1.tgz#540caa25139d6f496fdea056e414284886fb2289"
|
||||
integrity sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==
|
||||
terser@^5.7.0:
|
||||
version "5.7.0"
|
||||
resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693"
|
||||
integrity sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==
|
||||
dependencies:
|
||||
commander "^2.20.0"
|
||||
source-map "~0.7.2"
|
||||
@@ -8283,6 +8431,11 @@ trim-newlines@^1.0.0:
|
||||
resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz"
|
||||
integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=
|
||||
|
||||
trim-newlines@^3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144"
|
||||
integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==
|
||||
|
||||
"true-case-path@^1.0.2":
|
||||
version "1.0.3"
|
||||
resolved "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz"
|
||||
@@ -8312,10 +8465,10 @@ tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
|
||||
resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"
|
||||
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
|
||||
|
||||
tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c"
|
||||
integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==
|
||||
tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e"
|
||||
integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
|
||||
|
||||
tsutils@^3.17.1, tsutils@^3.21.0:
|
||||
version "3.21.0"
|
||||
@@ -8353,11 +8506,21 @@ type-fest@^0.13.1:
|
||||
resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz"
|
||||
integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
|
||||
|
||||
type-fest@^0.18.0:
|
||||
version "0.18.1"
|
||||
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f"
|
||||
integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==
|
||||
|
||||
type-fest@^0.20.2:
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
|
||||
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
|
||||
|
||||
type-fest@^0.6.0:
|
||||
version "0.6.0"
|
||||
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
|
||||
integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
|
||||
|
||||
type-fest@^0.8.1:
|
||||
version "0.8.1"
|
||||
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
|
||||
@@ -8777,10 +8940,10 @@ webpack-sources@^2.3.0:
|
||||
source-list-map "^2.0.1"
|
||||
source-map "^0.6.1"
|
||||
|
||||
webpack@^5.38.1:
|
||||
version "5.38.1"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.38.1.tgz#5224c7f24c18e729268d3e3bc97240d6e880258e"
|
||||
integrity sha512-OqRmYD1OJbHZph6RUMD93GcCZy4Z4wC0ele4FXyYF0J6AxO1vOSuIlU1hkS/lDlR9CDYBz64MZRmdbdnFFoT2g==
|
||||
webpack@^5.40.0:
|
||||
version "5.40.0"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.40.0.tgz#3182cfd324759d715252cf541901a226e57b5061"
|
||||
integrity sha512-c7f5e/WWrxXWUzQqTBg54vBs5RgcAgpvKE4F4VegVgfo4x660ZxYUF2/hpMkZUnLjgytVTitjeXaN4IPlXCGIw==
|
||||
dependencies:
|
||||
"@types/eslint-scope" "^3.7.0"
|
||||
"@types/estree" "^0.0.47"
|
||||
@@ -8791,7 +8954,7 @@ webpack@^5.38.1:
|
||||
browserslist "^4.14.5"
|
||||
chrome-trace-event "^1.0.2"
|
||||
enhanced-resolve "^5.8.0"
|
||||
es-module-lexer "^0.4.0"
|
||||
es-module-lexer "^0.6.0"
|
||||
eslint-scope "5.1.1"
|
||||
events "^3.2.0"
|
||||
glob-to-regexp "^0.4.1"
|
||||
@@ -8802,7 +8965,7 @@ webpack@^5.38.1:
|
||||
neo-async "^2.6.2"
|
||||
schema-utils "^3.0.0"
|
||||
tapable "^2.1.1"
|
||||
terser-webpack-plugin "^5.1.1"
|
||||
terser-webpack-plugin "^5.1.3"
|
||||
watchpack "^2.2.0"
|
||||
webpack-sources "^2.3.0"
|
||||
|
||||
@@ -9101,6 +9264,11 @@ yargs-parser@^20.2.2:
|
||||
resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz"
|
||||
integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==
|
||||
|
||||
yargs-parser@^20.2.3:
|
||||
version "20.2.9"
|
||||
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
|
||||
integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
|
||||
|
||||
yargs-parser@^9.0.2:
|
||||
version "9.0.2"
|
||||
resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz"
|
||||
|
Reference in New Issue
Block a user