html: add tslint to webpack

This commit is contained in:
Shuanglei Tao
2019-05-17 11:21:33 +08:00
parent ccea4d2cfa
commit 2aa2035195
8 changed files with 315 additions and 98 deletions

View File

@@ -1,11 +1,11 @@
import '../sass/app.scss'; import '../sass/app.scss';
import { Terminal, ITerminalOptions, IDisposable } from 'xterm'; import { Terminal, ITerminalOptions, IDisposable } from 'xterm';
import * as fit from 'xterm/lib/addons/fit/fit' import * as fit from 'xterm/lib/addons/fit/fit';
import * as Zmodem from 'zmodem.js/src/zmodem_browser'; import * as Zmodem from 'zmodem.js/src/zmodem_browser';
import * as overlay from './overlay' import * as overlay from './overlay';
import { Modal } from './zmodem' import { Modal } from './zmodem';
Terminal.applyAddon(fit); Terminal.applyAddon(fit);
Terminal.applyAddon(overlay); Terminal.applyAddon(overlay);
@@ -28,31 +28,31 @@ declare let window: IWindowWithTerminal;
const modal = new Modal(); const modal = new Modal();
const terminalContainer = document.getElementById('terminal-container'); const terminalContainer = document.getElementById('terminal-container');
const protocol = window.location.protocol === 'https:' ? 'wss://': 'ws://'; const protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://';
const wsPath = window.location.pathname.endsWith('/') ? 'ws' : '/ws'; const wsPath = window.location.pathname.endsWith('/') ? 'ws' : '/ws';
const url = [protocol, window.location.host, window.location.pathname, wsPath, window.location.search].join(''); const url = [protocol, window.location.host, window.location.pathname, wsPath, window.location.search].join('');
const textDecoder = new TextDecoder(); const textDecoder = new TextDecoder();
const textEncoder = new TextEncoder(); const textEncoder = new TextEncoder();
let authToken = (typeof window.tty_auth_token !== 'undefined') ? window.tty_auth_token : null; const authToken = (typeof window.tty_auth_token !== 'undefined') ? window.tty_auth_token : null;
let autoReconnect = -1; let autoReconnect = -1;
let term: ITtydTerminal; let term: ITtydTerminal;
let title: string; let title: string;
let wsError: boolean; let wsError: boolean;
let openWs = function() { const openWs = function(): void {
let ws = new WebSocket(url, ['tty']); const ws = new WebSocket(url, ['tty']);
let sendMessage = function (message) { const sendMessage = function (message: string): void {
if (ws.readyState === WebSocket.OPEN) { if (ws.readyState === WebSocket.OPEN) {
ws.send(textEncoder.encode(message)); ws.send(textEncoder.encode(message));
} }
}; };
let unloadCallback = function (event) { const unloadCallback = function (event: BeforeUnloadEvent): string {
let message = 'Close terminal? this will also terminate the command.'; const message = 'Close terminal? this will also terminate the command.';
event.returnValue = message; event.returnValue = message;
return message; return message;
}; };
let resetTerm = function() { const resetTerm = function(): void {
modal.hide(); modal.hide();
clearTimeout(term.reconnectTimeout); clearTimeout(term.reconnectTimeout);
if (ws.readyState !== WebSocket.CLOSED) { if (ws.readyState !== WebSocket.CLOSED) {
@@ -61,31 +61,31 @@ let openWs = function() {
openWs(); openWs();
}; };
let zsentry = new Zmodem.Sentry({ const zsentry = new Zmodem.Sentry({
to_terminal: function _to_terminal(octets) { to_terminal: function(octets: ArrayBuffer): any {
let buffer = new Uint8Array(octets).buffer; const buffer = new Uint8Array(octets).buffer;
term.write(textDecoder.decode(buffer)); term.write(textDecoder.decode(buffer));
}, },
sender: function _ws_sender_func(octets) { sender: function(octets: number[]): any {
// limit max packet size to 4096 // limit max packet size to 4096
while (octets.length) { while (octets.length) {
let chunk = octets.splice(0, 4095); const chunk = octets.splice(0, 4095);
let buffer = new Uint8Array(chunk.length + 1); const buffer = new Uint8Array(chunk.length + 1);
buffer[0]= '0'.charCodeAt(0); buffer[0] = '0'.charCodeAt(0);
buffer.set(chunk, 1); buffer.set(chunk, 1);
ws.send(buffer); ws.send(buffer);
} }
}, },
on_retract: function _on_retract() { on_retract: function(): any {
// console.log('on_retract'); // console.log('on_retract');
}, },
on_detect: function _on_detect(detection) { on_detect: function(detection: any): any {
term.setOption('disableStdin', true); term.setOption('disableStdin', true);
let zsession = detection.confirm(); const zsession = detection.confirm();
let promise = zsession.type === 'send' ? modal.handleSend(zsession) : modal.handleReceive(zsession); const promise = zsession.type === 'send' ? modal.handleSend(zsession) : modal.handleReceive(zsession);
promise.catch(console.error.bind(console)).then(() => { promise.catch(console.error.bind(console)).then(() => {
modal.hide(); modal.hide();
term.setOption('disableStdin', false); term.setOption('disableStdin', false);
@@ -95,7 +95,7 @@ let openWs = function() {
ws.binaryType = 'arraybuffer'; ws.binaryType = 'arraybuffer';
ws.onopen = function() { ws.onopen = function(): void {
console.log('[ttyd] websocket opened'); console.log('[ttyd] websocket opened');
wsError = false; wsError = false;
sendMessage(JSON.stringify({AuthToken: authToken})); sendMessage(JSON.stringify({AuthToken: authToken}));
@@ -163,11 +163,11 @@ let openWs = function() {
term.focus(); term.focus();
}; };
ws.onmessage = function(event: MessageEvent) { ws.onmessage = function(event: MessageEvent): void {
let rawData = new Uint8Array(event.data), const rawData = new Uint8Array(event.data);
cmd = String.fromCharCode(rawData[0]), const cmd = String.fromCharCode(rawData[0]);
data = rawData.slice(1).buffer; const data = rawData.slice(1).buffer;
switch(cmd) { switch (cmd) {
case '0': case '0':
try { try {
zsentry.consume(data); zsentry.consume(data);
@@ -181,7 +181,7 @@ let openWs = function() {
document.title = title; document.title = title;
break; break;
case '2': case '2':
let preferences = JSON.parse(textDecoder.decode(data)); const preferences = JSON.parse(textDecoder.decode(data));
Object.keys(preferences).forEach((key) => { Object.keys(preferences).forEach((key) => {
console.log('[ttyd] xterm option: ' + key + '=' + preferences[key]); console.log('[ttyd] xterm option: ' + key + '=' + preferences[key]);
term.setOption(key, preferences[key]); term.setOption(key, preferences[key]);
@@ -197,7 +197,7 @@ let openWs = function() {
} }
}; };
ws.onclose = function(event: CloseEvent) { ws.onclose = function(event: CloseEvent): void {
console.log('[ttyd] websocket closed, code: ' + event.code); console.log('[ttyd] websocket closed, code: ' + event.code);
modal.hide(); modal.hide();
if (term) { if (term) {

View File

@@ -3,15 +3,16 @@
import { Terminal } from 'xterm'; import { Terminal } from 'xterm';
interface IOverlayAddonTerminal extends Terminal { interface IOverlayAddonTerminal extends Terminal {
__overlayNode?: HTMLElement __overlayNode?: HTMLElement;
__overlayTimeout?: number __overlayTimeout?: number;
} }
export function showOverlay(term: Terminal, msg: string, timeout: number): void { export function showOverlay(term: Terminal, msg: string, timeout: number): void {
const addonTerminal = <IOverlayAddonTerminal> term; const addonTerminal = <IOverlayAddonTerminal> term;
if (!addonTerminal.__overlayNode) { if (!addonTerminal.__overlayNode) {
if (!term.element) if (!term.element) {
return; return;
}
addonTerminal.__overlayNode = document.createElement('div'); addonTerminal.__overlayNode = document.createElement('div');
addonTerminal.__overlayNode.style.cssText = ( addonTerminal.__overlayNode.style.cssText = (
'border-radius: 15px;' + 'border-radius: 15px;' +
@@ -29,14 +30,15 @@ export function showOverlay(term: Terminal, msg: string, timeout: number): void
e.stopPropagation(); e.stopPropagation();
}, true); }, true);
} }
addonTerminal.__overlayNode.style.color = "#101010"; addonTerminal.__overlayNode.style.color = '#101010';
addonTerminal.__overlayNode.style.backgroundColor = "#f0f0f0"; addonTerminal.__overlayNode.style.backgroundColor = '#f0f0f0';
addonTerminal.__overlayNode.textContent = msg; addonTerminal.__overlayNode.textContent = msg;
addonTerminal.__overlayNode.style.opacity = '0.75'; addonTerminal.__overlayNode.style.opacity = '0.75';
if (!addonTerminal.__overlayNode.parentNode) if (!addonTerminal.__overlayNode.parentNode) {
term.element.appendChild(addonTerminal.__overlayNode); term.element.appendChild(addonTerminal.__overlayNode);
}
const divSize = term.element.getBoundingClientRect(); const divSize = term.element.getBoundingClientRect();
const overlaySize = addonTerminal.__overlayNode.getBoundingClientRect(); const overlaySize = addonTerminal.__overlayNode.getBoundingClientRect();
@@ -44,17 +46,20 @@ export function showOverlay(term: Terminal, msg: string, timeout: number): void
addonTerminal.__overlayNode.style.top = (divSize.height - overlaySize.height) / 2 + 'px'; addonTerminal.__overlayNode.style.top = (divSize.height - overlaySize.height) / 2 + 'px';
addonTerminal.__overlayNode.style.left = (divSize.width - overlaySize.width) / 2 + 'px'; addonTerminal.__overlayNode.style.left = (divSize.width - overlaySize.width) / 2 + 'px';
if (addonTerminal.__overlayTimeout) if (addonTerminal.__overlayTimeout) {
clearTimeout(addonTerminal.__overlayTimeout); clearTimeout(addonTerminal.__overlayTimeout);
}
if (timeout === null) if (timeout === null) {
return; return;
}
addonTerminal.__overlayTimeout = <number><any>setTimeout(() => { addonTerminal.__overlayTimeout = <number><any>setTimeout(() => {
addonTerminal.__overlayNode.style.opacity = '0'; addonTerminal.__overlayNode.style.opacity = '0';
addonTerminal.__overlayTimeout = <number><any>setTimeout(() => { addonTerminal.__overlayTimeout = <number><any>setTimeout(() => {
if (addonTerminal.__overlayNode.parentNode) if (addonTerminal.__overlayNode.parentNode) {
addonTerminal.__overlayNode.parentNode.removeChild(addonTerminal.__overlayNode); addonTerminal.__overlayNode.parentNode.removeChild(addonTerminal.__overlayNode);
}
addonTerminal.__overlayTimeout = null; addonTerminal.__overlayTimeout = null;
addonTerminal.__overlayNode.style.opacity = '0.75'; addonTerminal.__overlayNode.style.opacity = '0.75';
}, 200); }, 200);

View File

@@ -49,9 +49,9 @@ function bytesHuman (bytes: any, precision: number): string {
if (isNaN(parseFloat(bytes)) || !isFinite(bytes)) return '-'; if (isNaN(parseFloat(bytes)) || !isFinite(bytes)) return '-';
if (bytes === 0) return '0'; if (bytes === 0) return '0';
if (typeof precision === 'undefined') precision = 1; if (typeof precision === 'undefined') precision = 1;
let units = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB'], const units = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];
number = Math.floor(Math.log(bytes) / Math.log(1024)); const num = Math.floor(Math.log(bytes) / Math.log(1024));
return (bytes / Math.pow(1024, Math.floor(number))).toFixed(precision) + ' ' + units[number]; return (bytes / Math.pow(1024, Math.floor(num))).toFixed(precision) + ' ' + units[num];
} }
export class Modal { export class Modal {
@@ -69,7 +69,7 @@ export class Modal {
this.progress = new Progress(); this.progress = new Progress();
} }
public reset(title): void { public reset(title: string): void {
this.header.textContent = title; this.header.textContent = title;
this.status.element.style.display = 'none'; this.status.element.style.display = 'none';
this.choose.element.style.display = 'none'; this.choose.element.style.display = 'none';
@@ -85,7 +85,7 @@ export class Modal {
this.element.classList.remove('is-active'); this.element.classList.remove('is-active');
} }
public updateFileInfo(fileInfo): void { public updateFileInfo(fileInfo: any): void {
this.status.element.style.display = ''; this.status.element.style.display = '';
this.choose.element.style.display = 'none'; this.choose.element.style.display = 'none';
this.progress.element.style.display = ''; this.progress.element.style.display = '';
@@ -94,11 +94,11 @@ export class Modal {
this.progress.fileName.textContent = fileInfo.name; this.progress.fileName.textContent = fileInfo.name;
} }
public showReceive(xfer): void { public showReceive(xfer: any): void {
this.reset('Receiving files'); this.reset('Receiving files');
this.updateFileInfo(xfer.get_details()); this.updateFileInfo(xfer.get_details());
this.progress.skip.disabled = false; this.progress.skip.disabled = false;
this.progress.skip.onclick = function () { this.progress.skip.onclick = function (): void {
(<HTMLLinkElement>this).disabled = true; (<HTMLLinkElement>this).disabled = true;
xfer.skip(); xfer.skip();
}; };
@@ -106,17 +106,17 @@ export class Modal {
this.element.classList.add('is-active'); this.element.classList.add('is-active');
} }
public showSend(callback): void { public showSend(callback: (files: FileList) => any): void {
this.reset('Sending files'); this.reset('Sending files');
this.choose.element.style.display = ''; this.choose.element.style.display = '';
this.choose.files.disabled = false; this.choose.files.disabled = false;
this.choose.files.value = ''; this.choose.files.value = '';
this.choose.filesNames.textContent = ''; this.choose.filesNames.textContent = '';
let self:Modal = this; const self: Modal = this;
this.choose.files.onchange = function () { this.choose.files.onchange = function (): void {
(<HTMLInputElement>this).disabled = true; (<HTMLInputElement>this).disabled = true;
let files:FileList = (<HTMLInputElement>this).files; const files: FileList = (<HTMLInputElement>this).files;
let fileNames:string = ''; let fileNames: string = '';
for (let i = 0; i < files.length; i++) { for (let i = 0; i < files.length; i++) {
if (i === 0) { if (i === 0) {
fileNames = files[i].name; fileNames = files[i].name;
@@ -130,20 +130,20 @@ export class Modal {
this.element.classList.add('is-active'); this.element.classList.add('is-active');
} }
public updateProgress(xfer): void { public updateProgress(xfer: any): void {
let size = xfer.get_details().size; const size = xfer.get_details().size;
let offset = xfer.get_offset(); const offset = xfer.get_offset();
this.progress.bytesReceived.textContent = bytesHuman(offset, 2); this.progress.bytesReceived.textContent = bytesHuman(offset, 2);
this.progress.bytesFile.textContent = bytesHuman(size, 2); this.progress.bytesFile.textContent = bytesHuman(size, 2);
let percentReceived = (100 * offset / size).toFixed(2); const percentReceived = (100 * offset / size).toFixed(2);
this.progress.percentReceived.textContent = percentReceived + '%'; this.progress.percentReceived.textContent = percentReceived + '%';
this.progress.progressBar.textContent = percentReceived + '%'; this.progress.progressBar.textContent = percentReceived + '%';
this.progress.progressBar.setAttribute('value', percentReceived); this.progress.progressBar.setAttribute('value', percentReceived);
} }
public handleSend(zsession): Promise<any> { public handleSend(zsession: any): Promise<any> {
return new Promise((res) => { return new Promise((res) => {
this.showSend((files) => { this.showSend((files) => {
Zmodem.Browser.send_files( Zmodem.Browser.send_files(
@@ -166,10 +166,10 @@ export class Modal {
}); });
} }
public handleReceive(zsession): Promise<any> { public handleReceive(zsession: any): Promise<any> {
zsession.on('offer', (xfer) => { zsession.on('offer', (xfer) => {
this.showReceive(xfer); this.showReceive(xfer);
let fileBuffer = []; const fileBuffer = [];
xfer.on('input', (payload) => { xfer.on('input', (payload) => {
this.updateProgress(xfer); this.updateProgress(xfer);
fileBuffer.push(new Uint8Array(payload)); fileBuffer.push(new Uint8Array(payload));
@@ -181,10 +181,10 @@ export class Modal {
); );
}, console.error.bind(console)); }, console.error.bind(console));
}); });
let promise = new Promise((res) => { const promise = new Promise((res) => {
zsession.on('session_end', () => res()); zsession.on('session_end', () => res());
}); });
zsession.start(); zsession.start();
return promise; return promise;
} }
} }

View File

@@ -10,8 +10,9 @@
"author": "Shuanglei Tao <tsl0922@gmail.com>", "author": "Shuanglei Tao <tsl0922@gmail.com>",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
"build": "NODE_ENV=production npx wp --config webpack.prod.js && gulp", "build": "NODE_ENV=production webpack --config webpack.prod.js && gulp",
"start": "gulp clean && npx webpack-dev-server --config webpack.dev.js" "prestart": "gulp clean",
"start": "webpack-dev-server --config webpack.dev.js"
}, },
"dependencies": { "dependencies": {
"xterm": "^3.13.0", "xterm": "^3.13.0",
@@ -32,11 +33,13 @@
"style-loader": "^0.23.1", "style-loader": "^0.23.1",
"terser-webpack-plugin": "^1.2.4", "terser-webpack-plugin": "^1.2.4",
"ts-loader": "^6.0.0", "ts-loader": "^6.0.0",
"tslint": "^5.16.0",
"tslint-consistent-codestyle": "^1.15.1",
"tslint-loader": "^3.5.4",
"typescript": "^3.4.5", "typescript": "^3.4.5",
"webpack": "^4.31.0", "webpack": "^4.31.0",
"webpack-cli": "^3.3.2", "webpack-cli": "^3.3.2",
"webpack-dev-server": "^3.3.1", "webpack-dev-server": "^3.3.1",
"webpack-merge": "^4.2.1", "webpack-merge": "^4.2.1"
"webpack-nano": "^0.6.2"
} }
} }

111
html/tslint.json Normal file
View File

@@ -0,0 +1,111 @@
{
"rulesDirectory": [
"tslint-consistent-codestyle"
],
"rules": {
"array-type": [
true,
"array"
],
"class-name": true,
"comment-format": [
true,
"check-space"
],
"curly": [
true,
"ignore-same-line"
],
"indent": [
true,
"spaces"
],
"interface-name": [
true,
"always-prefix"
],
"interface-over-type-literal": true,
"typedef": [
true,
"call-signature",
"parameter"
],
"eofline": true,
"new-parens": true,
"no-duplicate-imports": true,
"no-eval": true,
"no-internal-module": true,
"no-trailing-whitespace": true,
"one-variable-per-declaration": true,
"no-unsafe-finally": true,
"no-var-keyword": true,
"prefer-const": true,
"quotemark": [
true,
"single"
],
"semicolon": [
true,
"always"
],
"trailing-comma": [
true,
{
"multiline": {
"objects": "never",
"arrays": "never",
"functions": "never",
"typeLiterals": "ignore"
},
"esSpecCompliant": true
}
],
"triple-equals": true,
"typedef-whitespace": [
true,
{
"call-signature": "nospace",
"index-signature": "nospace",
"parameter": "nospace",
"property-declaration": "nospace",
"variable-declaration": "nospace"
}
],
"variable-name": [
true,
"ban-keywords",
"check-format",
"allow-leading-underscore"
],
"whitespace": [
true,
"check-branch",
"check-decl",
"check-module",
"check-operator",
"check-rest-spread",
"check-separator",
"check-type",
"check-type-operator",
"check-preblock"
],
"naming-convention": [
true,
{"type": "default", "format": "camelCase", "leadingUnderscore": "forbid"},
{"type": "type", "format": "PascalCase"},
{"type": "class", "format": "PascalCase"},
{"type": "property", "modifiers": ["const"], "format": "UPPER_CASE"},
{"type": "member", "modifiers": ["protected"], "format": "camelCase", "leadingUnderscore": "allow"},
{"type": "member", "modifiers": ["protected"], "format": "camelCase", "leadingUnderscore": "require"},
{"type": "member", "modifiers": ["private"], "format": "camelCase", "leadingUnderscore": "require"},
{"type": "variable", "modifiers": ["const"], "format": ["camelCase", "UPPER_CASE"]},
{"type": "interface", "prefix": "I"}
],
"no-else-after-return": {
"options": "allow-else-if"
},
"prefer-const-enum": [
true
]
}
}

View File

@@ -12,6 +12,11 @@ module.exports = {
}, },
module: { module: {
rules: [ rules: [
{
test: /\.ts$/,
enforce: 'pre',
use: 'tslint-loader',
},
{ {
test: /\.tsx?$/, test: /\.tsx?$/,
use: 'ts-loader', use: 'ts-loader',

View File

@@ -2,6 +2,41 @@
# yarn lockfile v1 # yarn lockfile v1
"@babel/code-frame@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8"
integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==
dependencies:
"@babel/highlight" "^7.0.0"
"@babel/highlight@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4"
integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==
dependencies:
chalk "^2.0.0"
esutils "^2.0.2"
js-tokens "^4.0.0"
"@fimbul/bifrost@^0.17.0":
version "0.17.0"
resolved "https://registry.yarnpkg.com/@fimbul/bifrost/-/bifrost-0.17.0.tgz#f0383ba7e40992e3193dc87e2ddfde2ad62a9cf4"
integrity sha512-gVTkJAOef5HtN6LPmrtt5fAUmBywwlgmObsU3FBhPoNeXPLaIl2zywXkJEtvvVLQnaFmtff3x+wIj5lHRCDE3Q==
dependencies:
"@fimbul/ymir" "^0.17.0"
get-caller-file "^2.0.0"
tslib "^1.8.1"
tsutils "^3.5.0"
"@fimbul/ymir@^0.17.0":
version "0.17.0"
resolved "https://registry.yarnpkg.com/@fimbul/ymir/-/ymir-0.17.0.tgz#4f28389b9f804d1cd202e11983af1743488b7815"
integrity sha512-xMXM9KTXRLHLVS6dnX1JhHNEkmWHcAVCQ/4+DA1KKwC/AFnGHzu/7QfQttEPgw3xplT+ILf9e3i64jrFwB3JtA==
dependencies:
inversify "^5.0.0"
reflect-metadata "^0.1.12"
tslib "^1.8.1"
"@types/events@*": "@types/events@*":
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
@@ -790,7 +825,7 @@ buffer@^4.3.0:
ieee754 "^1.1.4" ieee754 "^1.1.4"
isarray "^1.0.0" isarray "^1.0.0"
builtin-modules@^1.0.0: builtin-modules@^1.0.0, builtin-modules@^1.1.1:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=
@@ -926,7 +961,7 @@ chalk@^1.1.1:
strip-ansi "^3.0.0" strip-ansi "^3.0.0"
supports-color "^2.0.0" supports-color "^2.0.0"
chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2:
version "2.4.2" version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -1119,7 +1154,7 @@ commander@2.15.x:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
integrity sha1-30boZ9D8Kuxmo0ZitAapzK//Ww8= integrity sha1-30boZ9D8Kuxmo0ZitAapzK//Ww8=
commander@^2.19.0: commander@^2.12.1, commander@^2.19.0:
version "2.20.0" version "2.20.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
@@ -1724,6 +1759,11 @@ detect-node@^2.0.4:
resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==
diff@^3.2.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
diffie-hellman@^5.0.0: diffie-hellman@^5.0.0:
version "5.0.3" version "5.0.3"
resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
@@ -2067,6 +2107,11 @@ estraverse@^4.1.0, estraverse@^4.1.1:
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=
esutils@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=
etag@~1.8.1: etag@~1.8.1:
version "1.8.1" version "1.8.1"
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
@@ -2510,6 +2555,11 @@ get-caller-file@^1.0.1:
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
get-caller-file@^2.0.0:
version "2.0.5"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
get-stdin@^4.0.1: get-stdin@^4.0.1:
version "4.0.1" version "4.0.1"
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
@@ -3144,6 +3194,11 @@ interpret@^1.1.0:
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296"
integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
inversify@^5.0.0:
version "5.0.1"
resolved "https://registry.yarnpkg.com/inversify/-/inversify-5.0.1.tgz#500d709b1434896ce5a0d58915c4a4210e34fb6e"
integrity sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ==
invert-kv@^1.0.0: invert-kv@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
@@ -3509,7 +3564,12 @@ js-base64@^2.1.8:
resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.0.tgz#9e566fee624751a1d720c966cd6226d29d4025aa" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.0.tgz#9e566fee624751a1d720c966cd6226d29d4025aa"
integrity sha1-nlZv7mJHUaHXIMlmzWIm0p1AJao= integrity sha1-nlZv7mJHUaHXIMlmzWIm0p1AJao=
js-yaml@^3.13.1: js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
js-yaml@^3.13.0, js-yaml@^3.13.1:
version "3.13.1" version "3.13.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
@@ -5441,13 +5501,6 @@ rechoir@^0.6.2:
dependencies: dependencies:
resolve "^1.1.6" resolve "^1.1.6"
rechoir@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca"
integrity sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==
dependencies:
resolve "^1.9.0"
redent@^1.0.0: redent@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
@@ -5456,6 +5509,11 @@ redent@^1.0.0:
indent-string "^2.1.0" indent-string "^2.1.0"
strip-indent "^1.0.1" strip-indent "^1.0.1"
reflect-metadata@^0.1.12:
version "0.1.13"
resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
regex-not@^1.0.0, regex-not@^1.0.2: regex-not@^1.0.0, regex-not@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
@@ -5606,7 +5664,7 @@ resolve-url@^0.2.1:
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
resolve@^1.1.6, resolve@^1.10.0, resolve@^1.4.0, resolve@^1.9.0: resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.4.0:
version "1.11.0" version "1.11.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232"
integrity sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw== integrity sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==
@@ -5642,7 +5700,7 @@ rimraf@2:
dependencies: dependencies:
glob "^7.0.5" glob "^7.0.5"
rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: rimraf@^2.4.4, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3:
version "2.6.3" version "2.6.3"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
@@ -6499,11 +6557,64 @@ ts-loader@^6.0.0:
micromatch "^4.0.0" micromatch "^4.0.0"
semver "^6.0.0" semver "^6.0.0"
tslib@^1.9.0: tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
version "1.9.3" version "1.9.3"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
tslint-consistent-codestyle@^1.15.1:
version "1.15.1"
resolved "https://registry.yarnpkg.com/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.15.1.tgz#a0c5cd5a5860d40b659c490d8013c5732e02af8c"
integrity sha512-38Y3Dz4zcABe/PlPAQSGNEWPGVq0OzcIQR7SEU6dNujp/SgvhxhJOhIhI9gY4r0I3/TNtvVQwARWor9O9LPZWg==
dependencies:
"@fimbul/bifrost" "^0.17.0"
tslib "^1.7.1"
tsutils "^2.29.0"
tslint-loader@^3.5.4:
version "3.5.4"
resolved "https://registry.yarnpkg.com/tslint-loader/-/tslint-loader-3.5.4.tgz#052af7f0772434451ea1b247bb55407f878a4c40"
integrity sha512-jBHNNppXut6SgZ7CsTBh+6oMwVum9n8azbmcYSeMlsABhWWoHwjq631vIFXef3VSd75cCdX3rc6kstsB7rSVVw==
dependencies:
loader-utils "^1.0.2"
mkdirp "^0.5.1"
object-assign "^4.1.1"
rimraf "^2.4.4"
semver "^5.3.0"
tslint@^5.16.0:
version "5.16.0"
resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.16.0.tgz#ae61f9c5a98d295b9a4f4553b1b1e831c1984d67"
integrity sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==
dependencies:
"@babel/code-frame" "^7.0.0"
builtin-modules "^1.1.1"
chalk "^2.3.0"
commander "^2.12.1"
diff "^3.2.0"
glob "^7.1.1"
js-yaml "^3.13.0"
minimatch "^3.0.4"
mkdirp "^0.5.1"
resolve "^1.3.2"
semver "^5.3.0"
tslib "^1.8.0"
tsutils "^2.29.0"
tsutils@^2.29.0:
version "2.29.0"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99"
integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==
dependencies:
tslib "^1.8.1"
tsutils@^3.5.0:
version "3.10.0"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.10.0.tgz#6f1c95c94606e098592b0dff06590cf9659227d6"
integrity sha512-q20XSMq7jutbGB8luhKKsQldRKWvyBO2BGqni3p4yq8Ys9bEP/xQw3KepKmMRt9gJ4lvQSScrihJrcKdKoSU7Q==
dependencies:
tslib "^1.8.1"
tty-browserify@0.0.0: tty-browserify@0.0.0:
version "0.0.0" version "0.0.0"
resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
@@ -6927,16 +7038,6 @@ webpack-merge@^4.2.1:
dependencies: dependencies:
lodash "^4.17.5" lodash "^4.17.5"
webpack-nano@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/webpack-nano/-/webpack-nano-0.6.2.tgz#9a8224b693f6a903371fbc4a731b5a10cef4d37d"
integrity sha512-N6BgPssm3vsKfx9zLPJh8DdgzmoXvyh9OKtdum44ahZvGgHOwuLswIxuQvtC8QQXgQGL4tNZ3lXfXbhqaafPVA==
dependencies:
chalk "^2.4.1"
import-local "^2.0.0"
rechoir "^0.7.0"
yargs-parser "^13.0.0"
webpack-sources@^1.1.0, webpack-sources@^1.3.0: webpack-sources@^1.1.0, webpack-sources@^1.3.0:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85"
@@ -7077,14 +7178,6 @@ yargs-parser@^11.1.1:
camelcase "^5.0.0" camelcase "^5.0.0"
decamelize "^1.2.0" decamelize "^1.2.0"
yargs-parser@^13.0.0:
version "13.1.0"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.0.tgz#7016b6dd03e28e1418a510e258be4bff5a31138f"
integrity sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA==
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@^5.0.0: yargs-parser@^5.0.0:
version "5.0.0" version "5.0.0"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"

4
src/index.html vendored

File diff suppressed because one or more lines are too long