Browse Source

Merge branch 'master' into master

pull/207/head
SouraDutta 6 years ago
committed by GitHub
parent
commit
60f8b15300
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 15
      .eslintrc.js
  2. 2
      .github/workflows/publish.yml
  3. 9
      .github/workflows/rebase.yml
  4. 44
      README.md
  5. 1
      docker-compose.yml
  6. 99
      docs/API.md
  7. 20
      package.json
  8. 83
      src/client/index.ts
  9. 6
      src/client/wetty.scss
  10. 1
      src/server/index.ts
  11. 1
      src/server/interfaces.ts
  12. 2
      src/server/server.ts
  13. 2
      src/server/ssl.ts
  14. 4
      src/server/term.ts
  15. 10
      src/server/wetty.ts
  16. 8
      webpack.config.babel.js
  17. 183
      yarn.lock

15
.eslintrc.js

@ -1,6 +1,6 @@
module.exports = {
parser: 'eslint-plugin-typescript/parser',
plugins: ['typescript', 'prettier'],
parser: '@typescript-eslint/parser',
plugins: ['@typescript-eslint', 'prettier'],
env: {
es6: true,
node: true,
@ -9,24 +9,23 @@ module.exports = {
root: true,
extends: [
'airbnb-base',
'plugin:typescript/recommended',
'plugin:prettier/recommended',
'plugin:@typescript-eslint/recommended',
'prettier',
'prettier/@typescript-eslint',
],
rules: {
'typescript/indent': 'off',
'linebreak-style': ['error', 'unix'],
'arrow-parens': ['error', 'as-needed'],
'no-param-reassign': ['error', { props: false }],
'func-style': ['error', 'declaration', { allowArrowFunctions: true }],
'no-use-before-define': ['error', { functions: false }],
'typescript/no-use-before-define': ['error', { functions: false }],
'@typescript-eslint/no-use-before-define': ['error', { functions: false }],
},
settings: {
'import/resolver': {
'typescript-eslint-parser': ['.ts', '.tsx'],
node: {
extensions: ['.ts', '.js'],
},
},
},
}
};

2
.github/workflows/publish.yml

@ -18,7 +18,7 @@ jobs:
- run: yarn
name: Install dependencies
- name: ESLint checks
uses: gimenete/eslint-action@1.0
run: yarn lint
- run: yarn build
name: Compile Typescript
- name: Publish

9
.github/workflows/rebase.yml

@ -1,13 +1,16 @@
---
name: Automatic Rebase
on: issue_comment
on:
issue_comment:
types: [created]
jobs:
rebase:
name: Rebase
if: contains(github.event.comment.body, '/rebase')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Automatic Rebase
uses: cirrus-actions/rebase@1.0
uses: cirrus-actions/rebase@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.node_github_token }}

44
README.md

@ -9,6 +9,17 @@ websockets rather then Ajax and hence better response time.
## Install
### Requiments
To instal WeTTy you'll need to have the following installed:
- Node.JS 10+
- make
- python
- build-essential
### From source
WeTTy can be installed from source or from npm.
To install from source run:
@ -20,11 +31,15 @@ $ yarn
$ yarn build
```
### From NPM
To install it globally from npm use yarn or npm:
- yarn, `yarn global add wetty`
- npm, `npm i -g wetty`
### Autologin
For auto-login feature you'll need sshpass installed (NOT required for rest of
the program).
@ -119,6 +134,35 @@ the user like this (Only while running wetty as a non root account):
This is not a required feature and the security implications for passing the
password in the url will have to be considered by the user
### File Downloading
Wetty supports file downloads by printing terminal escape sequences between a
base64 encoded file.
The terminal escape sequences used are `^[[5i` and `^[[4i` (VT100 for "enter
auto print" and "exit auto print" respectively -
https://vt100.net/docs/tp83/appendixc.html).
An example of a helper script that prints the terminal escape characters and
base64s stdin:
```
$ cat wetty-download.sh
#!/bin/sh
echo '^[[5i'$(cat /dev/stdin | base64)'^[[4i'
```
You are then able to download files via wetty!
```
$ cat my-pdf-file.pdf | ./wetty-download.sh
```
Wetty will then issue a popup like the following that links to a local file
blob:
`Download ready: file-20191015233654.pdf`
## Run wetty behind nginx or apache
As said earlier you can use a proxy to add https to WeTTy.

1
docker-compose.yml

@ -32,6 +32,7 @@ services:
build:
context: .
dockerfile: Dockerfile-ssh
image: butlerx/wetty:ssh
container_name: 'wetty-ssh'
networks:

99
docs/API.md

@ -1,93 +1,88 @@
<a name="module_WeTTy"></a>
## WeTTy
Create WeTTY server
* [WeTTy](#module_WeTTy)
* [~start](#module_WeTTy..start) ⇒ <code>Promise</code>
* ["connection"](#event_connection)
* ["spawn"](#event_spawn)
* ["exit"](#event_exit)
* ["disconnect"](#event_disconnect)
* ["server"](#event_server)
<a name="module_WeTTy..start"></a>
- [WeTTy](#module_WeTTy)
- [start](#module_WeTTy..start) ⇒ `Promise`
- [connection](#event_connection)
- [spawn](#event_spawn)
- [exit](#event_exit)
- [disconnect](#event_disconnect)
- [server](#event_server)
### WeTTy~start ⇒ <code>Promise</code>
### WeTTy.start ⇒ `Promise`
Starts WeTTy Server
**Kind**: inner property of [<code>WeTTy</code>](#module_WeTTy)
**Returns**: <code>Promise</code> - Promise resolves once server is running
**Kind**: inner property of [`WeTTy`](#module_WeTTy)
**Returns**: `Promise` - Promise resolves once server is running
| Param | Type | Default | Description |
| ------------ | ------------------- | ------------------------------------- | --------------------------- |
| [ssh] | <code>Object</code> | | SSH settings |
| [ssh.user] | <code>string</code> | <code>&quot;&#x27;&#x27;&quot;</code> | default user for ssh |
| [ssh.host] | <code>string</code> | <code>&quot;localhost&quot;</code> | machine to ssh too |
| [ssh.auth] | <code>string</code> | <code>&quot;password&quot;</code> | authtype to use |
| [ssh.port] | <code>number</code> | <code>22</code> | port to connect to over ssh |
| [serverPort] | <code>number</code> | <code>3000</code> | Port to run server on |
| [ssl] | <code>Object</code> | | SSL settings |
| [ssl.key] | <code>string</code> | | Path to ssl key |
| [ssl.cert] | <code>string</code> | | Path to ssl cert |
<a name="event_connection"></a>
| :------------------------ | --------- | ------------- | ---------------------------------------------------------------------------------------------------------------------- |
| [ssh] | `Object` | | SSH settings |
| [ssh.user] | `string` | `"''"` | default user for ssh |
| [ssh.host] | `string` | `"localhost"` | machine to ssh too |
| [ssh.auth] | `string` | `"password"` | authtype to use |
| [ssh.port] | `number` | `22` | port to connect to over ssh |
| [ssh.pass] | `string` | | Optional param of a password to use for ssh |
| [ssh.key] | `string` | | path to an optional client private key (connection will be password-less and insecure!) |
| [serverConf] | `Object` | | Server settings |
| [serverConf.base] | `Object` | `'/wetty/'` | Server settings |
| [serverConf.port] | `number` | `3000` | Port to run server on |
| [serverConf.host] | `string` | `'0.0.0.0'` | Host address for server |
| [serverConf.title] | `string` | `'WeTTy'` | Title of the server |
| [serverConf.bypasshelmet] | `boolean` | `false` | if helmet should be disabled on the sever |
| [command] | `string` | `"''"` | The command to execute. If running as root and no host specified this will be login if a host is specified will be ssh |
| [ssl] | `Object` | | SSL settings |
| [ssl.key] | `string` | | Path to ssl key |
| [ssl.cert] | `string` | | Path to ssl cert |
### "connection"
**Kind**: event emitted by [<code>WeTTy</code>](#module_WeTTy)
**Kind**: event emitted by [`WeTTy`](#module_WeTTy)
**Properties**
| Name | Type | Description |
| ---- | ------------------- | --------------------------- |
| msg | <code>string</code> | Message for logs |
| date | <code>Date</code> | date and time of connection |
<a name="event_spawn"></a>
| ---- | -------- | --------------------------- |
| msg | `string` | Message for logs |
| date | `Date` | date and time of connection |
### "spawn"
Terminal process spawned
**Kind**: event emitted by [<code>WeTTy</code>](#module_WeTTy)
**Kind**: event emitted by [`WeTTy`](#module_WeTTy)
**Properties**
| Name | Type | Description |
| ------- | ------------------- | -------------------------------------- |
| msg | <code>string</code> | Message containing pid info and status |
| pid | <code>number</code> | Pid of the terminal |
| address | <code>string</code> | address of connecting user |
<a name="event_exit"></a>
| ------- | -------- | -------------------------------------- |
| msg | `string` | Message containing pid info and status |
| pid | `number` | Pid of the terminal |
| address | `string` | address of connecting user |
### "exit"
Terminal process exits
**Kind**: event emitted by [<code>WeTTy</code>](#module_WeTTy)
**Kind**: event emitted by [`WeTTy`](#module_WeTTy)
**Properties**
| Name | Type | Description |
| ---- | ------------------- | -------------------------------------- |
| code | <code>number</code> | the exit code |
| msg | <code>string</code> | Message containing pid info and status |
<a name="event_disconnect"></a>
| ---- | -------- | -------------------------------------- |
| code | `number` | the exit code |
| msg | `string` | Message containing pid info and status |
### "disconnect"
**Kind**: event emitted by [<code>WeTTy</code>](#module_WeTTy)
<a name="event_server"></a>
**Kind**: event emitted by [`WeTTy`](#module_WeTTy)
### "server"
**Kind**: event emitted by [<code>WeTTy</code>](#module_WeTTy)
**Kind**: event emitted by [`WeTTy`](#module_WeTTy)
**Properties**
| Name | Type | Description |
| ---------- | ------------------- | ------------------------------- |
| msg | <code>string</code> | Message for logging |
| port | <code>number</code> | port sever is on |
| connection | <code>string</code> | connection type for web traffic |
| ---------- | -------- | ------------------------------- |
| msg | `string` | Message for logging |
| port | `number` | port sever is on |
| connection | `string` | connection type for web traffic |

20
package.json

@ -1,6 +1,6 @@
{
"name": "wetty",
"version": "1.1.5",
"version": "1.1.8",
"description": "WeTTY = Web + TTY. Terminal access in browser over http/https",
"homepage": "https://github.com/krishnasrinivas/wetty",
"repository": {
@ -14,7 +14,7 @@
},
"main": "index.js",
"scripts": {
"lint": "eslint --ext .js,.ts .",
"lint": "eslint --ext .ts .",
"build": "babel-node node_modules/.bin/webpack",
"start": "node .",
"dev": "NODE_ENV=development concurrently --kill-others --success first \"babel-node node_modules/.bin/webpack --watch\" \"nodemon .\"",
@ -51,15 +51,17 @@
"dependencies": {
"compression": "^1.7.4",
"express": "^4.17.1",
"file-type": "^12.3.0",
"fs-extra": "^8.1.0",
"helmet": "^3.20.1",
"lodash": "^4.17.15",
"morgan": "^1.9.1",
"node-pty": "^0.8.1",
"node-pty": "0.9.0-beta28",
"serve-favicon": "^2.5.0",
"socket.io": "^2.2.0",
"socket.io-client": "^2.2.0",
"source-map-loader": "^0.2.4",
"toastify-js": "^1.6.1",
"winston": "^3.2.1",
"xterm": "^3.14.5",
"yargs": "^14.0.0"
@ -82,16 +84,17 @@
"@types/socket.io-client": "^1.4.32",
"@types/webpack-env": "^1.14.0",
"@types/yargs": "^13.0.2",
"@typescript-eslint/eslint-plugin": "^2.5.0",
"@typescript-eslint/parser": "^2.5.0",
"babel-loader": "^8.0.6",
"babel-plugin-lodash": "^3.3.4",
"concurrently": "^4.1.2",
"css-loader": "^3.2.0",
"eslint": "^6.3.0",
"eslint-config-airbnb-base": "^14.0.0",
"eslint-config-prettier": "^6.2.0",
"eslint": "6.1.0",
"eslint-config-airbnb-base": "14.0.0",
"eslint-config-prettier": "^6.4.0",
"eslint-plugin-import": "^2.18.2",
"eslint-plugin-prettier": "^3.1.0",
"eslint-plugin-typescript": "^1.0.0-rc.1",
"file-loader": "^4.2.0",
"husky": "^3.0.5",
"lint-staged": "~9.2.5",
@ -125,6 +128,7 @@
"Strubbl <github@linux4tw.de>",
"koushikmln <mln02koushik@gmail.com>",
"mirtouf <mirtouf@gmail.com>",
"nosemeocurrenada <nosemeocurrenada93@gmail.com>"
"nosemeocurrenada <nosemeocurrenada93@gmail.com>",
"Ben Letchford <contact@benl.com.au>"
]
}

83
src/client/index.ts

@ -2,6 +2,8 @@ import { Terminal } from 'xterm';
import { isUndefined } from 'lodash';
import * as io from 'socket.io-client';
import { fit } from 'xterm/lib/addons/fit/fit';
import * as fileType from 'file-type';
import Toastify from 'toastify-js';
import './wetty.scss';
import './favicon.ico';
@ -12,6 +14,9 @@ const socket = io(window.location.origin, {
path: `${trim(socketBase)}/socket.io`,
});
const FILE_BEGIN = '\u001b[5i';
const FILE_END = '\u001b[4i';
//NOTE text selection on double click or select
const copyToClipboard = (text: string) => {
if (window.clipboardData && window.clipboardData.setData) {
@ -35,11 +40,13 @@ const copyToClipboard = (text: string) => {
socket.on('connect', () => {
const term = new Terminal();
let fileBuffer = [];
term.open(document.getElementById('terminal'));
const defaultOptions = {
fontSize: 14
};
let options: any;
let options: object;
try {
if (localStorage.options === undefined) {
options = defaultOptions;
@ -54,9 +61,9 @@ socket.on('connect', () => {
term.setOption(key, value);
});
const code = JSON.stringify(options, null, 2);
const editor = document.querySelector('#options .editor');
const editor = document.querySelector('#options .editor') || {value: code};
editor.value = code;
editor.addEventListener('keyup', e => {
editor.addEventListener('keyup', () => {
try {
const updated = JSON.parse(editor.value);
const updatedCode = JSON.stringify(updated, null, 2);
@ -114,6 +121,52 @@ socket.on('connect', () => {
disconnect(data);
}
function onCompleteFile() {
let bufferCharacters = fileBuffer.join('');
bufferCharacters = bufferCharacters.substring(bufferCharacters.lastIndexOf(FILE_BEGIN) + FILE_BEGIN.length, bufferCharacters.lastIndexOf(FILE_END));
// Try to decode it as base64, if it fails we assume it's not base64
try {
bufferCharacters = window.atob(bufferCharacters);
} catch (err) {
// Assuming it's not base64...
}
const bytes = new Uint8Array(bufferCharacters.length);
for (let i = 0; i < bufferCharacters.length; i += 1) {
bytes[i] = bufferCharacters.charCodeAt(i);
}
let mimeType = 'application/octet-stream';
let fileExt = '';
const typeData = fileType(bytes);
if (typeData) {
mimeType = typeData.mime;
fileExt = typeData.ext;
}
const fileName = `file-${new Date()
.toISOString()
.split('.')[0]
.replace(/-/g, '')
.replace('T', '')
.replace(/:/g, '')}${fileExt ? `.${fileExt}` : ''}`;
const blob = new Blob([new Uint8Array(bytes.buffer)], { type: mimeType });
const blobUrl = URL.createObjectURL(blob);
fileBuffer = [];
Toastify({
text: `Download ready: <a href="${blobUrl}" target="_blank" download="${fileName}">${fileName}</a>`,
duration: 10000,
newWindow: true,
gravity: 'bottom',
position: 'right',
backgroundColor: '#fff',
stopOnFocus: true,
}).showToast();
}
term.on('data', data => {
socket.emit('input', data);
});
@ -122,7 +175,31 @@ socket.on('connect', () => {
});
socket
.on('data', (data: string) => {
const indexOfFileBegin = data.indexOf(FILE_BEGIN);
const indexOfFileEnd = data.indexOf(FILE_END);
// If we've got the entire file in one chunk
if (indexOfFileBegin !== -1 && indexOfFileEnd !== -1) {
fileBuffer.push(data);
onCompleteFile();
}
// If we've found a beginning marker
else if (indexOfFileBegin !== -1) {
fileBuffer.push(data);
}
// If we've found an ending marker
else if (indexOfFileEnd !== -1) {
fileBuffer.push(data);
onCompleteFile();
}
// If we've found the continuation of a file
else if (fileBuffer.length > 0) {
fileBuffer.push(data);
}
// Just treat it as normal data
else {
term.write(data);
}
})
.on('login', () => {
term.writeln('');

6
src/client/wetty.scss

@ -1,4 +1,5 @@
@import '~xterm/dist/xterm';
@import '~toastify-js/src/toastify.css';
$black: #000;
$grey: rgba(0, 0, 0, 0.75);
@ -94,4 +95,9 @@ body {
display: flex;
}
}
.toastify {
border-radius: 0;
color: $black;
}
}

1
src/server/index.ts

@ -58,7 +58,6 @@ export default class Server {
host: sshhost,
auth: sshauth,
port: sshport,
title,
pass: sshpass,
key: sshkey,
},

1
src/server/interfaces.ts

@ -20,6 +20,7 @@ export interface SSLBuffer {
export interface Server {
port: number;
host: string;
title: string;
base: string;
bypasshelmet: boolean;
}

2
src/server/server.ts

@ -67,7 +67,7 @@ export default function createServer(
.use(favicon(path.join(distDir, 'favicon.ico')))
.use(`${basePath}/public`, express.static(distDir))
.use((req, res, next) => {
if (req.url === basePath) res.redirect(301, req.url + '/');
if (req.url === basePath) res.redirect(301, `${req.url }/`);
else next();
});

2
src/server/ssl.ts

@ -4,7 +4,7 @@ import { isUndefined } from 'lodash';
import { SSL, SSLBuffer } from './interfaces';
export default async function loadSSL(ssl: SSL): Promise<SSLBuffer> {
if (isUndefined(ssl.key) || isUndefined(ssl.cert)) return {};
if (isUndefined(ssl) || isUndefined(ssl.key) || isUndefined(ssl.cert)) return {};
const files = [readFile(resolve(ssl.key)), readFile(resolve(ssl.cert))];
const [key, cert]: Buffer[] = await Promise.all(files);
return { key, cert };

4
src/server/term.ts

@ -44,9 +44,9 @@ export default class Term {
public static login(socket: SocketIO.Socket): Promise<string> {
// Check request-header for username
let remoteUser = socket.request.headers['remote-user'];
const remoteUser = socket.request.headers['remote-user'];
if (remoteUser) {
return new Promise((resolve,reject) => {
return new Promise(resolve => {
resolve(remoteUser);
});
}

10
src/server/wetty.ts

@ -16,8 +16,14 @@ export default class WeTTy extends EventEmitter {
*/
public start(
ssh: SSH = { user: '', host: 'localhost', auth: 'password', port: 22 },
serverConf: Server = { base: '/wetty/', port: 3000, host: '0.0.0.0' },
command: string = '',
serverConf: Server = {
base: '/wetty/',
port: 3000,
host: '0.0.0.0',
title: 'WeTTy',
bypasshelmet: false,
},
command = '',
ssl?: SSL
): Promise<void> {
return loadSSL(ssl).then((sslBuffer: SSLBuffer) => {

8
webpack.config.babel.js

@ -4,8 +4,7 @@ import MiniCssExtractPlugin from 'mini-css-extract-plugin';
import nodeExternals from 'webpack-node-externals';
const template = override =>
Object.assign(
{
({
mode: process.env.NODE_ENV || 'development',
resolve: {
modules: [path.resolve(__dirname, 'src'), 'node_modules'],
@ -15,9 +14,8 @@ const template = override =>
stats: {
colors: true,
},
},
override
);
...override
});
const entry = (folder, file) =>
path.join(__dirname, 'src', folder, `${file}.ts`);

183
yarn.lock

@ -756,6 +756,11 @@
dependencies:
"@types/node" "*"
"@types/eslint-visitor-keys@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d"
integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==
"@types/events@*":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
@ -801,6 +806,11 @@
dependencies:
"@types/express" "*"
"@types/json-schema@^7.0.3":
version "7.0.3"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636"
integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==
"@types/lodash@^4.14.138":
version "4.14.138"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.138.tgz#34f52640d7358230308344e579c15b378d91989e"
@ -882,6 +892,47 @@
dependencies:
"@types/yargs-parser" "*"
"@typescript-eslint/eslint-plugin@^2.5.0":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.5.0.tgz#101d96743ce3365b3223df73d641078c9b775903"
integrity sha512-ddrJZxp5ns1Lh5ofZQYk3P8RyvKfyz/VcRR4ZiJLHO/ljnQAO8YvTfj268+WJOOadn99mvDiqJA65+HAKoeSPA==
dependencies:
"@typescript-eslint/experimental-utils" "2.5.0"
eslint-utils "^1.4.2"
functional-red-black-tree "^1.0.1"
regexpp "^2.0.1"
tsutils "^3.17.1"
"@typescript-eslint/experimental-utils@2.5.0":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.5.0.tgz#383a97ded9a7940e5053449f6d73995e782b8fb1"
integrity sha512-UgcQGE0GKJVChyRuN1CWqDW8Pnu7+mVst0aWrhiyuUD1J9c+h8woBdT4XddCvhcXDodTDVIfE3DzGHVjp7tUeQ==
dependencies:
"@types/json-schema" "^7.0.3"
"@typescript-eslint/typescript-estree" "2.5.0"
eslint-scope "^5.0.0"
"@typescript-eslint/parser@^2.5.0":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.5.0.tgz#858030ddd808fbbe88e03f42e5971efaccb8218a"
integrity sha512-9UBMiAwIDWSl79UyogaBdj3hidzv6exjKUx60OuZuFnJf56tq/UMpdPcX09YmGqE8f4AnAueYtBxV8IcAT3jdQ==
dependencies:
"@types/eslint-visitor-keys" "^1.0.0"
"@typescript-eslint/experimental-utils" "2.5.0"
"@typescript-eslint/typescript-estree" "2.5.0"
eslint-visitor-keys "^1.1.0"
"@typescript-eslint/typescript-estree@2.5.0":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.5.0.tgz#40ada624d6217ef092a3a79ed30d947ad4f212ce"
integrity sha512-AXURyF8NcA3IsnbjNX1v9qbwa0dDoY9YPcKYR2utvMHoUcu3636zrz0gRWtVAyxbPCkhyKuGg6WZIyi2Fc79CA==
dependencies:
debug "^4.1.1"
glob "^7.1.4"
is-glob "^4.0.1"
lodash.unescape "4.0.1"
semver "^6.3.0"
"@webassemblyjs/ast@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359"
@ -1051,20 +1102,20 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
mime-types "~2.1.24"
negotiator "0.6.2"
acorn-jsx@^5.0.2:
version "5.0.2"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.2.tgz#84b68ea44b373c4f8686023a551f61a21b7c4a4f"
integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==
acorn-jsx@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384"
integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==
acorn@^6.2.1:
version "6.3.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e"
integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==
acorn@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.0.0.tgz#26b8d1cd9a9b700350b71c0905546f64d1284e7a"
integrity sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==
acorn@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c"
integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==
after@0.8.2:
version "0.8.2"
@ -2667,7 +2718,7 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
eslint-config-airbnb-base@^14.0.0:
eslint-config-airbnb-base@14.0.0:
version "14.0.0"
resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz#8a7bcb9643d13c55df4dd7444f138bf4efa61e17"
integrity sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA==
@ -2676,10 +2727,10 @@ eslint-config-airbnb-base@^14.0.0:
object.assign "^4.1.0"
object.entries "^1.1.0"
eslint-config-prettier@^6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.2.0.tgz#80e0b8714e3f6868c4ac2a25fbf39c02e73527a7"
integrity sha512-VLsgK/D+S/FEsda7Um1+N8FThec6LqE3vhcMyp8mlmto97y3fGf3DX7byJexGuOb1QY0Z/zz222U5t+xSfcZDQ==
eslint-config-prettier@^6.4.0:
version "6.4.0"
resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.4.0.tgz#0a04f147e31d33c6c161b2dd0971418ac52d0477"
integrity sha512-YrKucoFdc7SEko5Sxe4r6ixqXPDP1tunGw91POeZTTRKItf/AMFYt/YLEQtZMkR2LVpAVhcAcZgcWpm1oGPW7w==
dependencies:
get-stdin "^6.0.0"
@ -2723,15 +2774,7 @@ eslint-plugin-prettier@^3.1.0:
dependencies:
prettier-linter-helpers "^1.0.0"
eslint-plugin-typescript@^1.0.0-rc.1:
version "1.0.0-rc.3"
resolved "https://registry.yarnpkg.com/eslint-plugin-typescript/-/eslint-plugin-typescript-1.0.0-rc.3.tgz#aa5359248dc6172ee261bc6574b5b540573e9b67"
integrity sha512-urXH7sKqRkFLcDj6dP3tvQALfWIRGn8J8Kg9dYSoavXvy62FxfUv6JgjDAHQZudi9fSRQpEZA/LqdJXDOwKHPA==
dependencies:
requireindex "^1.2.0"
typescript-eslint-parser "21.0.2"
eslint-scope@^4.0.0, eslint-scope@^4.0.3:
eslint-scope@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
@ -2747,6 +2790,13 @@ eslint-scope@^5.0.0:
esrecurse "^4.1.0"
estraverse "^4.1.1"
eslint-utils@^1.3.1:
version "1.4.3"
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f"
integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
dependencies:
eslint-visitor-keys "^1.1.0"
eslint-utils@^1.4.2:
version "1.4.2"
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab"
@ -2759,10 +2809,10 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
eslint@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.3.0.tgz#1f1a902f67bfd4c354e7288b81e40654d927eb6a"
integrity sha512-ZvZTKaqDue+N8Y9g0kp6UPZtS4FSY3qARxBs7p4f0H0iof381XHduqVerFWtK8DPtKmemqbqCFENWSQgPR/Gow==
eslint@6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.1.0.tgz#06438a4a278b1d84fb107d24eaaa35471986e646"
integrity sha512-QhrbdRD7ofuV09IuE2ySWBz0FyXCq0rriLTZXZqaWSI79CVtHVRdkFuFTViiqzZhkCgfOh9USpriuGN2gIpZDQ==
dependencies:
"@babel/code-frame" "^7.0.0"
ajv "^6.10.0"
@ -2771,9 +2821,9 @@ eslint@^6.3.0:
debug "^4.0.1"
doctrine "^3.0.0"
eslint-scope "^5.0.0"
eslint-utils "^1.4.2"
eslint-visitor-keys "^1.1.0"
espree "^6.1.1"
eslint-utils "^1.3.1"
eslint-visitor-keys "^1.0.0"
espree "^6.0.0"
esquery "^1.0.1"
esutils "^2.0.2"
file-entry-cache "^5.0.1"
@ -2802,13 +2852,13 @@ eslint@^6.3.0:
text-table "^0.2.0"
v8-compile-cache "^2.0.3"
espree@^6.1.1:
version "6.1.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.1.tgz#7f80e5f7257fc47db450022d723e356daeb1e5de"
integrity sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==
espree@^6.0.0:
version "6.1.2"
resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d"
integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==
dependencies:
acorn "^7.0.0"
acorn-jsx "^5.0.2"
acorn "^7.1.0"
acorn-jsx "^5.1.0"
eslint-visitor-keys "^1.1.0"
esprima@^4.0.0:
@ -3102,6 +3152,11 @@ file-loader@^4.2.0:
loader-utils "^1.2.3"
schema-utils "^2.0.0"
file-type@^12.3.0:
version "12.3.0"
resolved "https://registry.yarnpkg.com/file-type/-/file-type-12.3.0.tgz#74d755e5dc9c5cbc7ee6f182529b453906ac88c2"
integrity sha512-4E4Esq9KLwjYCY32E7qSmd0h7LefcniZHX+XcdJ4Wfx1uGJX7QCigiqw/U0yT7WOslm28yhxl87DJ0wHYv0RAA==
fill-range@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
@ -4910,12 +4965,7 @@ mute-stream@0.0.7:
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
nan@2.12.1:
version "2.12.1"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552"
integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==
nan@^2.12.1, nan@^2.13.2:
nan@^2.12.1, nan@^2.13.2, nan@^2.14.0:
version "2.14.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
@ -5047,12 +5097,12 @@ node-pre-gyp@^0.12.0:
semver "^5.3.0"
tar "^4"
node-pty@^0.8.1:
version "0.8.1"
resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.8.1.tgz#94b457bec013e7a09b8d9141f63b0787fa25c23f"
integrity sha512-j+/g0Q5dR+vkELclpJpz32HcS3O/3EdPSGPvDXJZVJQLCvgG0toEbfmymxAEyQyZEpaoKHAcoL+PvKM+4N9nlw==
node-pty@0.9.0-beta28:
version "0.9.0-beta28"
resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.9.0-beta28.tgz#f086cea157b4640bace2ea787136fde73a26b273"
integrity sha512-qpLJE52oLRIOEvIeVmPzymn+zqUnYhPmlNjSRW60PwEZvhcdmazdP0IJcQfEK6ivwml14TzQLObMjEj8FFO7xg==
dependencies:
nan "2.12.1"
nan "^2.14.0"
node-releases@^1.1.29:
version "1.1.29"
@ -6213,11 +6263,6 @@ require-package-name@^2.0.1:
resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9"
integrity sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk=
requireindex@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef"
integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==
resolve-cwd@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
@ -6428,11 +6473,6 @@ semver-diff@^2.0.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
semver@5.5.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==
semver@^6.1.2, semver@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
@ -7161,6 +7201,11 @@ to-regex@^3.0.1, to-regex@^3.0.2:
regex-not "^1.0.2"
safe-regex "^1.1.0"
toastify-js@^1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/toastify-js/-/toastify-js-1.6.1.tgz#2ec20654925d6f83f935d5a6907c146e6bcb67d6"
integrity sha512-yosiXPEdr3B9KL1rF7M/IMdw8d8Z69UJe2JsvxbfdpaL2/olqSB8tvp7/N6gkT9G46y6nqR2e62CCnf0LxeIBQ==
toidentifier@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
@ -7208,11 +7253,18 @@ triple-beam@^1.2.0, triple-beam@^1.3.0:
dependencies:
glob "^7.1.2"
tslib@^1.9.0:
tslib@^1.8.1, tslib@^1.9.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
tsutils@^3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==
dependencies:
tslib "^1.8.1"
tty-browserify@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
@ -7255,23 +7307,6 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
typescript-eslint-parser@21.0.2:
version "21.0.2"
resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-21.0.2.tgz#270af10e4724528677fbcf34ea495284bec3a894"
integrity sha512-u+pj4RVJBr4eTzj0n5npoXD/oRthvfUCjSKndhNI714MG0mQq2DJw5WP7qmonRNIFgmZuvdDOH3BHm9iOjIAfg==
dependencies:
eslint-scope "^4.0.0"
eslint-visitor-keys "^1.0.0"
typescript-estree "5.3.0"
typescript-estree@5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/typescript-estree/-/typescript-estree-5.3.0.tgz#fb6c977b5e21073eb16cbdc0338a7f752da99ff5"
integrity sha512-Vu0KmYdSCkpae+J48wsFC1ti19Hq3Wi/lODUaE+uesc3gzqhWbZ5itWbsjylLVbjNW4K41RqDzSfnaYNbmEiMQ==
dependencies:
lodash.unescape "4.0.1"
semver "5.5.0"
typescript@~3.6.2:
version "3.6.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.2.tgz#105b0f1934119dde543ac8eb71af3a91009efe54"

Loading…
Cancel
Save