site JS refactor WIP

refactor-site-js
Thibault Duplessis 2020-09-02 11:16:24 +02:00
parent b0228c8319
commit 45f7b16679
20 changed files with 582 additions and 458 deletions

View File

@ -6,12 +6,12 @@
"license": "AGPL-3.0-or-later",
"main": "index.js",
"dependencies": {
"@rollup/plugin-commonjs": "^13.0.0",
"@rollup/plugin-node-resolve": "^8.1.0",
"@rollup/plugin-typescript": "^5.0.1",
"rollup": "^2.18.1",
"rollup-plugin-terser": "^6.1.0",
"tslib": "^2.0.0",
"typescript": "^3.9.5"
"@rollup/plugin-commonjs": "^15.0.0",
"@rollup/plugin-node-resolve": "^9.0.0",
"@rollup/plugin-typescript": "^5.0.2",
"rollup": "^2.26.9",
"rollup-plugin-terser": "^7.0.1",
"tslib": "^2.0.1",
"typescript": "^4.0.2"
}
}

View File

@ -1,17 +1,14 @@
interface Lichess {
// components
requestIdleCallback(f: () => void): void;
dispatchEvent(el: HTMLElement | Window, eventName: string): void;
hasTouchEvents: boolean;
sri: string;
isCol1(): boolean;
storage: LichessStorageHelper;
tempStorage: LichessStorageHelper; // TODO: unused
once(key: string, mod?: 'always'): boolean;
debounce(func: (...args: any[]) => void, wait: number, immediate?: boolean): (...args: any[]) => void;
powertip: any;
widget: any;
hoverable?: boolean;
spinnerHtml: string;
assetUrl(url: string, opts?: AssetUrlOpts): string;
soundUrl: string;
@ -46,7 +43,7 @@ interface Lichess {
initAll(): void;
};
miniGame: {
init(node: HTMLElement, data?: string): string;
init(node: HTMLElement): string | null;
initAll(): void;
update(node: HTMLElement, data: { fen: string, lm: string, wc?: number, bc?: number }): void;
finish(node: HTMLElement, win?: Color): void;
@ -89,7 +86,7 @@ interface Lichess {
}
interface SoundBoxI {
loadOggOrMp3(name: string, path: string): Promise<void>;
loadOggOrMp3(name: string, path: string): void;
play(name: string): void;
getVolume(): number;
setVolume(v: number): void;
@ -354,6 +351,7 @@ interface JQuery {
clock: any;
watchers(): JQuery;
watchers(method: 'set', data: any): void;
friends(): JQuery; // TODO remove friends widget
highcharts(conf?: any): any;
slider(key: string, value: any): any;
slider(opts: any): any;

View File

@ -1,6 +1,10 @@
import { rollupProject } from '@build/rollupProject';
export default rollupProject({
main: {
input: 'src/site.ts',
output: 'lichess.site',
},
tv: {
input: 'src/tv-embed.ts',
output: 'lichess.tv.embed',

View File

@ -9,7 +9,7 @@ const kill = () => {
$('#announce').remove();
};
const announce = (d?: { msg: string, date: Date }) => {
const announce = (d?: LichessAnnouncement) => {
if (!d) return;
kill();
if (d.msg) {

View File

@ -1,38 +1,40 @@
import widget from './widget';
widget("clock", {
_create: function() {
this.target = this.options.time * 1000 + Date.now();
if (!this.options.pause) this.interval = setInterval(this.render.bind(this), 1000);
this.render();
},
export default function loadClockWidget() {
widget("clock", {
_create: function() {
this.target = this.options.time * 1000 + Date.now();
if (!this.options.pause) this.interval = setInterval(this.render.bind(this), 1000);
this.render();
},
set: function(opts) {
this.options = opts;
this.target = this.options.time * 1000 + Date.now();
this.render();
clearInterval(this.interval);
if (!opts.pause) this.interval = setInterval(this.render.bind(this), 1000);
},
set: function(opts) {
this.options = opts;
this.target = this.options.time * 1000 + Date.now();
this.render();
clearInterval(this.interval);
if (!opts.pause) this.interval = setInterval(this.render.bind(this), 1000);
},
render: function() {
if (document.body.contains(this.element[0])) {
this.element.text(this.formatMs(this.target - Date.now()));
this.element.toggleClass('clock--run', !this.options.pause);
} else clearInterval(this.interval);
},
render: function() {
if (document.body.contains(this.element[0])) {
this.element.text(this.formatMs(this.target - Date.now()));
this.element.toggleClass('clock--run', !this.options.pause);
} else clearInterval(this.interval);
},
pad: function(x) {
return (x < 10 ? '0' : '') + x;
},
pad: function(x) {
return (x < 10 ? '0' : '') + x;
},
formatMs: function(msTime) {
const date = new Date(Math.max(0, msTime + 500)),
hours = date.getUTCHours(),
minutes = date.getUTCMinutes(),
seconds = date.getUTCSeconds();
return hours > 0 ?
hours + ':' + this.pad(minutes) + ':' + this.pad(seconds) :
minutes + ':' + this.pad(seconds);
}
});
formatMs: function(msTime) {
const date = new Date(Math.max(0, msTime + 500)),
hours = date.getUTCHours(),
minutes = date.getUTCMinutes(),
seconds = date.getUTCSeconds();
return hours > 0 ?
hours + ':' + this.pad(minutes) + ':' + this.pad(seconds) :
minutes + ':' + this.pad(seconds);
}
});
}

View File

@ -2,106 +2,110 @@ import widget from './widget';
import trans from './trans';
import pubsub from './pubsub';
widget("friends", (() => {
const getId = function(titleName) {
return titleName.toLowerCase().replace(/^\w+\s/, '');
};
const makeUser = function(titleName) {
const split = titleName.split(' ');
return {
id: split[split.length - 1].toLowerCase(),
name: split[split.length - 1],
title: (split.length > 1) ? split[0] : undefined,
playing: false,
patron: false
// TODO doesn't need to be a widget.
// all interactions come from pubsub
export default function loadFriendsWidget() {
widget("friends", (() => {
const getId = function(titleName) {
return titleName.toLowerCase().replace(/^\w+\s/, '');
};
};
const renderUser = function(user) {
const icon = '<i class="line' + (user.patron ? ' patron' : '') + '"></i>',
titleTag = user.title ? ('<span class="utitle"' + (user.title === 'BOT' ? ' data-bot' : '') + '>' + user.title + '</span>&nbsp;') : '',
url = '/@/' + user.name,
tvButton = user.playing ? '<a data-icon="1" class="tv ulpt" data-pt-pos="nw" href="' + url + '/tv" data-href="' + url + '"></a>' : '';
return '<div><a class="user-link ulpt" data-pt-pos="nw" href="' + url + '">' + icon + titleTag + user.name + '</a>' + tvButton + '</div>';
};
return {
_create: function() {
const self: any = this,
el = self.element;
self.$friendBoxTitle = el.find('.friend_box_title').click(function() {
el.find('.content_wrap').toggleNone();
if (!self.loaded) {
self.loaded = true;
window.lichess.socket.send('following_onlines');
}
});
self.$nobody = el.find(".nobody");
const data = {
users: [],
playing: [],
patrons: [],
...el.data('preload')
const makeUser = function(titleName) {
const split = titleName.split(' ');
return {
id: split[split.length - 1].toLowerCase(),
name: split[split.length - 1],
title: (split.length > 1) ? split[0] : undefined,
playing: false,
patron: false
};
self.trans = trans(data.i18n);
self.set(data);
};
const renderUser = function(user) {
const icon = '<i class="line' + (user.patron ? ' patron' : '') + '"></i>',
titleTag = user.title ? ('<span class="utitle"' + (user.title === 'BOT' ? ' data-bot' : '') + '>' + user.title + '</span>&nbsp;') : '',
url = '/@/' + user.name,
tvButton = user.playing ? '<a data-icon="1" class="tv ulpt" data-pt-pos="nw" href="' + url + '/tv" data-href="' + url + '"></a>' : '';
return '<div><a class="user-link ulpt" data-pt-pos="nw" href="' + url + '">' + icon + titleTag + user.name + '</a>' + tvButton + '</div>';
};
return {
_create: function() {
const self: any = this,
el = self.element;
pubsub.on('socket.in.following_onlines', d => {
d.users = d.d;
self.set(d);
});
['enters', 'leaves', 'playing', 'stopped_playing'].forEach(k =>
pubsub.on('socket.in.following_' + k, self[k])
);
},
repaint: function() {
const self: any = this;
if (self.loaded) requestAnimationFrame(function() {
const users = self.users,
ids = Object.keys(users).sort();
self.$friendBoxTitle.html(self.trans.vdomPlural('nbFriendsOnline', ids.length, self.loaded ? $('<strong>').text(ids.length) : '-'));
self.$nobody.toggleNone(!ids.length);
self.element.find('.list').html(
ids.map(function(id) {
return renderUser(users[id]);
}).join('')
self.$friendBoxTitle = el.find('.friend_box_title').click(function() {
el.find('.content_wrap').toggleNone();
if (!self.loaded) {
self.loaded = true;
window.lichess.socket.send('following_onlines');
}
});
self.$nobody = el.find(".nobody");
const data = {
users: [],
playing: [],
patrons: [],
...el.data('preload')
};
self.trans = trans(data.i18n);
self.set(data);
pubsub.on('socket.in.following_onlines', d => {
d.users = d.d;
self.set(d);
});
['enters', 'leaves', 'playing', 'stopped_playing'].forEach(k =>
pubsub.on('socket.in.following_' + k, self[k])
);
}.bind(self));
},
insert: function(titleName) {
const self: any = this;
const id = getId(titleName);
if (!self.users[id]) self.users[id] = makeUser(titleName);
return self.users[id];
},
set: function(d) {
const self: any = this;
self.users = {};
let i;
for (i in d.users) this.insert(d.users[i]);
for (i in d.playing) this.insert(d.playing[i]).playing = true;
for (i in d.patrons) this.insert(d.patrons[i]).patron = true;
this.repaint();
},
enters: function(d) {
const user = this.insert(d.d);
user.playing = d.playing;
user.patron = d.patron;
this.repaint();
},
leaves: function(titleName) {
const self: any = this;
delete self.users[getId(titleName)];
this.repaint();
},
playing: function(titleName) {
this.insert(titleName).playing = true;
this.repaint();
},
stopped_playing: function(titleName) {
this.insert(titleName).playing = false;
this.repaint();
}
};
})());
},
repaint: function() {
const self: any = this;
if (self.loaded) requestAnimationFrame(function() {
const users = self.users,
ids = Object.keys(users).sort();
self.$friendBoxTitle.html(self.trans.vdomPlural('nbFriendsOnline', ids.length, self.loaded ? $('<strong>').text(ids.length) : '-'));
self.$nobody.toggleNone(!ids.length);
self.element.find('.list').html(
ids.map(function(id) {
return renderUser(users[id]);
}).join('')
);
}.bind(self));
},
insert: function(titleName) {
const self: any = this;
const id = getId(titleName);
if (!self.users[id]) self.users[id] = makeUser(titleName);
return self.users[id];
},
set: function(d) {
const self: any = this;
self.users = {};
let i;
for (i in d.users) this.insert(d.users[i]);
for (i in d.playing) this.insert(d.playing[i]).playing = true;
for (i in d.patrons) this.insert(d.patrons[i]).patron = true;
this.repaint();
},
enters: function(d) {
const user = this.insert(d.d);
user.playing = d.playing;
user.patron = d.patron;
this.repaint();
},
leaves: function(titleName) {
const self: any = this;
delete self.users[getId(titleName)];
this.repaint();
},
playing: function(titleName) {
this.insert(titleName).playing = true;
this.repaint();
},
stopped_playing: function(titleName) {
this.insert(titleName).playing = false;
this.repaint();
}
};
})());
}

View File

@ -3,8 +3,6 @@ import { loadCssPath } from './assets';
export const requestIdleCallback = (window.requestIdleCallback || window.setTimeout).bind(window);
export const dispatchEvent = (el: HTMLElement, eventName: string) => el.dispatchEvent(new Event(eventName));
export const once = (key: string, mod: 'always' | undefined) => {
if (mod === 'always') return true;
if (!storage.get(key)) {
@ -14,7 +12,9 @@ export const once = (key: string, mod: 'always' | undefined) => {
return false;
};
export const debounce = (func, wait, immediate) => {
type Debounced = (...args) => any;
export const debounce = (func: (...args) => any, wait: number, immediate = false): Debounced => {
let timeout, lastBounce = 0;
return function(this: any) {
let context = this,

View File

@ -1,8 +1,9 @@
import { spinnerHtml } from './intro';
import pubsub from './pubsub';
export default function loadInfiniteScroll(el: HTMLElement) {
$(el).each(function(this: HTMLElement) {
export default function loadInfiniteScroll(selector: string) {
$(selector).each(function(this: HTMLElement) {
const self = this;
if (!$('.pager a', this).length) return;
var $scroller = $(this).infinitescroll({
navSelector: ".pager",
@ -18,7 +19,7 @@ export default function loadInfiniteScroll(el: HTMLElement) {
$("#infscr-loading").remove();
pubsub.emit('content_loaded');
const ids: string[] = [];
$(el).find('.paginated[data-dedup]').each(function(this: HTMLElement) {
$(self).find('.paginated[data-dedup]').each(function(this: HTMLElement) {
const id = $(this).data('dedup');
if (id) {
if (ids.includes(id)) $(this).remove();

View File

@ -63,32 +63,33 @@ function gamePowertip(el: HTMLElement) {
}).data('powertip', spinnerHtml);
};
function powerTipWith(el, ev, f) {
function powerTipWith(el: HTMLElement, ev, f) {
if (isHoverable()) {
f(el);
$.powerTip.show(el, ev);
}
};
function onIdleForAll(par, sel, fun) {
function onIdleForAll(par: HTMLElement, sel, fun) {
requestIdleCallback(() =>
Array.prototype.forEach.call(par.querySelectorAll(sel), el => fun(el)) // do not codegolf to `fun`
Array.prototype.forEach.call(par.querySelectorAll(sel), (el: HTMLElement) => fun(el)) // do not codegolf to `fun`
)
}
const powertip = {
mouseover(e) {
var t = e.target,
cl = t.classList;
if (cl.contains('ulpt')) powerTipWith(t, e, userPowertip);
else if (cl.contains('glpt')) powerTipWith(t, e, gamePowertip);
watchMouse() {
document.body.addEventListener('mouseover', e => {
const t = e.target as HTMLElement, cl = t.classList;
if (cl.contains('ulpt')) powerTipWith(t, e, userPowertip);
else if (cl.contains('glpt')) powerTipWith(t, e, gamePowertip);
});
},
manualGameIn(parent) {
manualGameIn(parent: HTMLElement) {
onIdleForAll(parent, '.glpt', gamePowertip);
},
manualGame: gamePowertip,
manualUser: userPowertip,
manualUserIn(parent) {
manualUserIn(parent: HTMLElement) {
onIdleForAll(parent, '.ulpt', userPowertip);
}
};

View File

@ -1,4 +1,4 @@
export let redirectInProgress: false | string = false;
let redirectInProgress: false | string = false;
export const redirect = obj => {
let url;

View File

@ -287,7 +287,7 @@ StrongSocket.defaults = {
};
let resolveFirstConnect;
StrongSocket.firstConnect = new Promise(r => {
StrongSocket.firstConnect = new Promise<(tpe: string, data: any) => void>(r => {
resolveFirstConnect = r;
});

View File

@ -51,35 +51,46 @@ function formatter() {
)
}
function render(nodes: any[]) {
var cl, abs, set, str, diff, now = Date.now();
nodes.forEach(function(node) {
cl = node.classList,
abs = cl.contains('abs'),
set = cl.contains('set');
node.date = node.date || toDate(node.getAttribute('datetime'));
if (!set) {
str = formatter()(node.date);
if (abs) node.textContent = str;
else node.setAttribute('title', str);
cl.add('set');
if (abs || cl.contains('once')) cl.remove('timeago');
}
if (!abs) {
diff = (now - node.date) / 1000;
node.textContent = formatDiff(diff);
if (Math.abs(diff) > 9999) cl.remove('timeago'); // ~3h
}
});
}
function findAndRender() {
requestAnimationFrame(() =>
render([].slice.call(document.getElementsByClassName('timeago'), 0, 99))
)
}
function updateRegularly(interval: number) {
findAndRender();
setTimeout(() => updateRegularly(interval * 1.1), interval);
}
const timeago = {
render: function(nodes) {
var cl, abs, set, str, diff, now = Date.now();
nodes.forEach(function(node) {
cl = node.classList,
abs = cl.contains('abs'),
set = cl.contains('set');
node.date = node.date || toDate(node.getAttribute('datetime'));
if (!set) {
str = formatter()(node.date);
if (abs) node.textContent = str;
else node.setAttribute('title', str);
cl.add('set');
if (abs || cl.contains('once')) cl.remove('timeago');
}
if (!abs) {
diff = (now - node.date) / 1000;
node.textContent = formatDiff(diff);
if (Math.abs(diff) > 9999) cl.remove('timeago'); // ~3h
}
});
},
render,
// relative
format: function(date) {
return formatDiff((Date.now() - toDate(date).getTime()) / 1000);
},
absolute: function(date) {
return formatter()(toDate(date));
}
format: date => formatDiff((Date.now() - toDate(date).getTime()) / 1000),
absolute: date => formatter()(toDate(date)),
findAndRender,
updateRegularly
};
export default timeago;

View File

@ -1,4 +1,4 @@
const builder = i18n => {
const trans = i18n => {
var format = function(str, args) {
if (args.length && str.includes('$s'))
for (var i = 1; i < 4; i++)
@ -47,4 +47,4 @@ const builder = i18n => {
return trans;
};
export default builder;
export default trans;

View File

@ -1,8 +1,13 @@
lichess.userAutocomplete = ($input, opts) => {
import {loadCssPath, loadScript} from "./assets";
import {debounce} from "./functions";
import {spinnerHtml} from "./intro";
import pubsub from "./pubsub";
export default function($input: JQuery, opts?: any) {
opts = opts || {};
const cache = {};
lichess.loadCssPath('autocomplete');
const sendXhr = lichess.debounce((query, runAsync) =>
loadCssPath('autocomplete');
const sendXhr = debounce((query, runAsync) =>
$.ajax({
url: '/player/autocomplete',
cache: true,
@ -21,7 +26,7 @@ lichess.userAutocomplete = ($input, opts) => {
runAsync(res);
}
}), 150);
return lichess.loadScript('javascripts/vendor/typeahead.jquery.min.js').done(function() {
return loadScript('javascripts/vendor/typeahead.jquery.min.js').done(function() {
$input.typeahead({
minLength: opts.minLength || 3,
}, {
@ -44,7 +49,7 @@ lichess.userAutocomplete = ($input, opts) => {
displayKey: 'name',
templates: {
empty: '<div class="empty">No player found</div>',
pending: lichess.spinnerHtml,
pending: spinnerHtml,
suggestion(o) {
const tag = opts.tag || 'a';
return '<' + tag + ' class="ulpt user-link' + (o.online ? ' online' : '') + '" ' + (tag === 'a' ? '' : 'data-') + 'href="/@/' + o.name + '">' +
@ -52,11 +57,11 @@ lichess.userAutocomplete = ($input, opts) => {
'</' + tag + '>';
}
}
}).on('typeahead:render', () => lichess.pubsub.emit('content_loaded'));
}).on('typeahead:render', () => pubsub.emit('content_loaded'));
if (opts.focus) $input.focus();
if (opts.onSelect) $input
.on('typeahead:select', (_, sel) => opts.onSelect(sel))
.on('keypress', function(e) {
.on('keypress', function(this: HTMLElement, e) {
if (e.which == 10 || e.which == 13) opts.onSelect($(this).val());
});
});

View File

@ -1,24 +1,29 @@
lichess.widget('watchers', {
_create: function() {
this.list = this.element.find(".list");
this.number = this.element.find(".number");
lichess.pubsub.on('socket.in.crowd', data => this.set(data.watchers || data));
lichess.watchersData && this.set(lichess.watchersData);
},
set: function(data) {
lichess.watchersData = data;
if (!data || !data.nb) return this.element.addClass('none');
if (this.number.length) this.number.text(data.nb);
if (data.users) {
const tags = data.users.map(u => {
const split = u.split(' ');
const id = split.length == 1 ? split[0] : split[1];
return u ? '<a class="user-link ulpt ' + (klass || '') + '" href="/@/' + id + '">' + (limit ? u.substring(0, limit) : u) + '</a>' : 'Anonymous';
});
if (data.anons === 1) tags.push('Anonymous');
else if (data.anons) tags.push('Anonymous (' + data.anons + ')');
this.list.html(tags.join(', '));
} else if (!this.number.length) this.list.html(data.nb + ' players in the chat');
this.element.removeClass('none');
}
});
import widget from './widget';
import pubsub from './pubsub';
export default function loadWatchersWidget() {
let watchersData;
widget('watchers', {
_create: function() {
this.list = this.element.find(".list");
this.number = this.element.find(".number");
pubsub.on('socket.in.crowd', data => this.set(data.watchers || data));
watchersData && this.set(watchersData);
},
set: function(data) {
watchersData = data;
if (!data || !data.nb) return this.element.addClass('none');
if (this.number.length) this.number.text(data.nb);
if (data.users) {
const tags = data.users.map(u =>
u ? `<a class="user-link ulpt" href="/@/${u.includes(' ') ? u.split(' ')[1] : u}">${u}</a>` : 'Anonymous'
);
if (data.anons === 1) tags.push('Anonymous');
else if (data.anons) tags.push('Anonymous (' + data.anons + ')');
this.list.html(tags.join(', '));
} else if (!this.number.length) this.list.html(data.nb + ' players in the chat');
this.element.removeClass('none');
}
});
}

View File

@ -1,4 +1,4 @@
const builder = (name: string, prototype: any) => {
const widget = (name: string, prototype: any) => {
const constructor = $[name] = function(options, element) {
const self: any = this;
self.element = $(element);
@ -20,4 +20,4 @@ const builder = (name: string, prototype: any) => {
};
};
export default builder;
export default widget;

View File

@ -0,0 +1,62 @@
import StrongSocket from "./component/socket";
import { requestIdleCallback, once, debounce, makeChat, formAjax, numberFormat, escapeHtml } from "./component/functions";
import { hasTouchEvents, sri, spinnerHtml } from "./component/intro";
import { isCol1 } from "./component/is-col1";
import { storage } from "./component/storage";
import powertip from "./component/powertip";
import { assetUrl, soundUrl, loadCss, loadCssPath, jsModule, loadScript, hopscotch, slider } from "./component/assets";
import widget from "./component/widget";
import idleTimer from "./component/idle-timer";
import pubsub from "./component/pubsub";
import { unload, redirect, reload } from "./component/reload";
import announce from "./component/announce";
import trans from "./component/trans";
import sound from "./component/sound";
import soundBox from "./component/soundbox";
import userAutocomplete from "./component/user-autocomplete";
import miniBoard from "./component/mini-board";
import miniGame from "./component/mini-game";
import timeago from "./component/timeago";
import modal from "./component/modal";
export default function() {
return {
StrongSocket,
requestIdleCallback,
hasTouchEvents,
sri,
isCol1,
storage,
once,
debounce,
powertip,
widget,
spinnerHtml,
assetUrl,
soundUrl,
loadCss,
loadCssPath,
jsModule,
loadScript,
hopscotch,
slider,
makeChat,
formAjax,
numberFormat,
idleTimer,
pubsub,
unload,
redirect,
reload,
escapeHtml,
announce,
trans,
sound,
soundBox,
userAutocomplete,
miniBoard,
miniGame,
timeago,
modal
};
}

View File

@ -1,11 +1,28 @@
import exportLichessGlobals from "./site.lichess.globals"
import StrongSocket from "./component/socket";
import { unload, redirect } from "./component/reload";
import { unload, redirect, reload } from "./component/reload";
import announce from './component/announce';
import moduleLaunchers from "./component/module-launchers";
import pubsub from "./component/pubsub";
import miniBoard from "./component/mini-board";
import miniGame from "./component/mini-game";
import {requestIdleCallback} from "./component/functions";
import { requestIdleCallback } from "./component/functions";
import powertip from "./component/powertip";
import timeago from "./component/timeago";
import topBar from "./component/top-bar";
import userAutocomplete from "./component/user-autocomplete";
import loadInfiniteScroll from "./component/infinite-scroll";
import { storage } from "./component/storage";
import { assetUrl } from "./component/assets";
import serviceWorker from "./component/service-worker";
import loadFriendsWidget from "./component/friends-widget";
import loadWatchersWidget from "./component/watchers-widget";
import loadClockWidget from "./component/clock-widget";
window.lichess = {
...window.lichess,
...exportLichessGlobals()
};
StrongSocket.defaults.events = {
redirect(o) {
@ -37,8 +54,8 @@ $(() => {
moduleLaunchers();
pubsub.on('content_loaded', miniBoard.initAll);
pubsub.on('content_loaded', miniGame.initAll);
loadWatchersWidget();
loadClockWidget();
pubsub.on('socket.in.fen', e =>
document.querySelectorAll('.mini-game-' + e.id).forEach((el: HTMLElement) => miniGame.update(el, e))
@ -49,24 +66,25 @@ $(() => {
requestIdleCallback(() => {
loadFriendsWidget();
$('#friend_box').friends();
$('#main-wrap')
.on('click', '.autoselect', function() {
.on('click', '.autoselect', function(this: HTMLElement) {
$(this).select();
})
.on('click', 'button.copy', function() {
.on('click', 'button.copy', function(this: HTMLElement) {
$('#' + $(this).data('rel')).select();
document.execCommand('copy');
$(this).attr('data-icon', 'E');
});
$('body').on('click', 'a.relation-button', function() {
var $a = $(this).addClass('processing').css('opacity', 0.3);
$('body').on('click', 'a.relation-button', function(this: HTMLElement) {
const $a = $(this).addClass('processing').css('opacity', 0.3);
$.ajax({
url: $a.attr('href'),
type: 'post',
success: function(html) {
success(html) {
if (html.includes('relation-actions')) $a.parent().replaceWith(html);
else $a.replaceWith(html);
}
@ -74,90 +92,81 @@ $(() => {
return false;
});
$('.mselect .button').on('click', function() {
$('.mselect .button').on('click', function(this: HTMLElement) {
const $p = $(this).parent();
$p.toggleClass('shown');
setTimeout(function() {
const handler = function(e) {
if ($.contains($p[0], e.target)) return;
requestIdleCallback(() => {
const handler = (e: Event) => {
if ($p[0].contains(e.target as HTMLElement)) return;
$p.removeClass('shown');
$('html').off('click', handler);
};
$('html').on('click', handler);
}, 10);
});
});
document.body.addEventListener('mouseover', lichess.powertip.mouseover);
powertip.watchMouse();
{ // timeago
const renderTimeago = () =>
requestAnimationFrame(() =>
lichess.timeago.render([].slice.call(document.getElementsByClassName('timeago'), 0, 99))
);
const setTimeago = interval => {
renderTimeago();
setTimeout(() => setTimeago(interval * 1.1), interval);
}
setTimeago(1200);
lichess.pubsub.on('content_loaded', renderTimeago);
}
timeago.updateRegularly(1000);
pubsub.on('content_loaded', timeago.findAndRender);
if (!window.customWS) setTimeout(() => {
if (!lichess.socket)
lichess.socket = lichess.StrongSocket("/socket/v5", false);
if (!window.lichess.socket)
window.lichess.socket = StrongSocket("/socket/v5", false);
}, 300);
lichess.topBar();
topBar();
window.addEventListener('resize', () => lichess.dispatchEvent(document.body, 'chessground.resize'));
window.addEventListener('resize', () => document.body.dispatchEvent(new Event('chessground.resize')));
$('.user-autocomplete').each(function() {
$('.user-autocomplete').each(function(this: HTMLElement) {
const opts = {
focus: 1,
friend: $(this).data('friend'),
tag: $(this).data('tag')
};
if ($(this).attr('autofocus')) lichess.userAutocomplete($(this), opts);
else $(this).one('focus', function() {
lichess.userAutocomplete($(this), opts);
if ($(this).attr('autofocus')) userAutocomplete($(this), opts);
else $(this).one('focus', function(this: HTMLElement) {
userAutocomplete($(this), opts);
});
});
lichess.loadInfiniteScroll('.infinitescroll');
loadInfiniteScroll('.infinitescroll');
$('a.delete, input.delete').click(() => confirm('Delete?'));
$('input.confirm, button.confirm').click(function() {
$('input.confirm, button.confirm').click(function(this: HTMLElement) {
return confirm($(this).attr('title') || 'Confirm this action?');
});
$('#main-wrap').on('click', 'a.bookmark', function() {
const t = $(this).toggleClass("bookmarked");
$.post(t.attr("href"));
const count = (parseInt(t.text(), 10) || 0) + (t.hasClass("bookmarked") ? 1 : -1);
t.find('span').html(count > 0 ? count : "");
$('#main-wrap').on('click', 'a.bookmark', function(this: HTMLElement) {
const t = $(this).toggleClass('bookmarked');
$.post(t.attr('href'));
const count = (parseInt(t.text(), 10) || 0) + (t.hasClass('bookmarked') ? 1 : -1);
t.find('span').html('' + (count > 0 ? count : ''));
return false;
});
// still bind esc even in form fields
Mousetrap.prototype.stopCallback = function(e, el, combo) {
return combo != 'esc' && (el.isContentEditable || el.tagName == 'INPUT' || el.tagName == 'SELECT' || el.tagName == 'TEXTAREA');
window.Mousetrap.prototype.stopCallback = function(_, el, combo) {
return combo != 'esc' && (
el.isContentEditable || el.tagName == 'INPUT' || el.tagName == 'SELECT' || el.tagName == 'TEXTAREA'
);
};
Mousetrap.bind('esc', function() {
var $oc = $('#modal-wrap .close');
window.Mousetrap.bind('esc', function() {
const $oc = $('#modal-wrap .close');
if ($oc.length) $oc.trigger('click');
else {
var $input = $(':focus');
const $input = $(':focus');
if ($input.length) $input.trigger('blur');
}
return false;
});
if (!lichess.storage.get('grid')) setTimeout(() => {
if (!storage.get('grid')) setTimeout(() => {
if (getComputedStyle(document.body).getPropertyValue('--grid'))
lichess.storage.set('grid', 1);
storage.set('grid', 1);
else
$.get(lichess.assetUrl('oops/browser.html'), html => $('body').prepend(html))
$.get(assetUrl('oops/browser.html'), html => $('body').prepend(html))
}, 3000);
/* A disgusting hack for a disgusting browser
@ -170,12 +179,14 @@ $(() => {
// prevent zoom when keyboard shows on iOS
if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
const el = document.querySelector('meta[name=viewport]');
const el = document.querySelector('meta[name=viewport]') as HTMLElement;
el.setAttribute('content', el.getAttribute('content') + ',maximum-scale=1.0');
}
lichess.miniBoard.initAll();
lichess.miniGame.initAll();
miniBoard.initAll();
miniGame.initAll();
pubsub.on('content_loaded', miniBoard.initAll);
pubsub.on('content_loaded', miniGame.initAll);
$('.chat__members').watchers();
@ -183,8 +194,8 @@ $(() => {
$.post('/toggle-blind-mode', {
enable: 1,
redirect: '/'
}, lichess.reload);
}, reload);
lichess.serviceWorker();
serviceWorker();
});
});

View File

@ -1,8 +1,8 @@
{
"extends": "../tsconfig.base.json",
"include": ["src/*.ts", "src/*.js"],
"include": ["src/**/*.ts"],
"compilerOptions": {
"allowJs": true,
"allowJs": false,
"noImplicitAny": false,
"noImplicitReturns": false
}

372
yarn.lock
View File

@ -2,7 +2,7 @@
# yarn lockfile v1
"@babel/code-frame@^7.8.3":
"@babel/code-frame@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
@ -47,33 +47,32 @@
normalize-path "^2.0.1"
through2 "^2.0.3"
"@rollup/plugin-commonjs@^13.0.0":
version "13.0.2"
resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-13.0.2.tgz#b7783f0db049450c72d60bc06cf48d4951515e58"
integrity sha512-9JXf2k8xqvMYfqmhgtB6eCgMN9fbxwF1XDF3mGKJc6pkAmt0jnsqurxQ0tC1akQKNSXCm7c3unQxa3zuxtZ7mQ==
"@rollup/plugin-commonjs@^15.0.0":
version "15.0.0"
resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-15.0.0.tgz#690d15a9d54ba829db93555bff9b98ff34e08574"
integrity sha512-8uAdikHqVyrT32w1zB9VhW6uGwGjhKgnDNP4pQJsjdnyF4FgCj6/bmv24c7v2CuKhq32CcyCwRzMPEElaKkn0w==
dependencies:
"@rollup/pluginutils" "^3.0.8"
"@rollup/pluginutils" "^3.1.0"
commondir "^1.0.1"
estree-walker "^1.0.1"
glob "^7.1.2"
is-reference "^1.1.2"
magic-string "^0.25.2"
resolve "^1.11.0"
estree-walker "^2.0.1"
glob "^7.1.6"
is-reference "^1.2.1"
magic-string "^0.25.7"
resolve "^1.17.0"
"@rollup/plugin-node-resolve@^8.1.0":
version "8.4.0"
resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.4.0.tgz#261d79a680e9dc3d86761c14462f24126ba83575"
integrity sha512-LFqKdRLn0ShtQyf6SBYO69bGE1upV6wUhBX0vFOUnLAyzx5cwp8svA0eHUnu8+YU57XOkrMtfG63QOpQx25pHQ==
"@rollup/plugin-node-resolve@^9.0.0":
version "9.0.0"
resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz#39bd0034ce9126b39c1699695f440b4b7d2b62e6"
integrity sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg==
dependencies:
"@rollup/pluginutils" "^3.1.0"
"@types/resolve" "1.17.1"
builtin-modules "^3.1.0"
deep-freeze "^0.0.1"
deepmerge "^4.2.2"
is-module "^1.0.0"
resolve "^1.17.0"
"@rollup/plugin-typescript@^5.0.1":
"@rollup/plugin-typescript@^5.0.2":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-5.0.2.tgz#e879b73354851868b805bbd43f15c229123b8a71"
integrity sha512-CkS028Itwjqm1uLbFVfpJgtVtnNvZ+og/m6UlNRR5wOOnNTWPcVQzOu5xGdEX+WWJxdvWIqUq2uR/RBt2ZipWg==
@ -81,7 +80,7 @@
"@rollup/pluginutils" "^3.0.1"
resolve "^1.14.1"
"@rollup/pluginutils@^3.0.1", "@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0":
"@rollup/pluginutils@^3.0.1", "@rollup/pluginutils@^3.1.0":
version "3.1.0"
resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b"
integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==
@ -106,9 +105,9 @@
integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
"@types/jquery@*":
version "3.5.0"
resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.0.tgz#ccb7dfd317d02d4227dd3803c75297d0c10dad68"
integrity sha512-C7qQUjpMWDUNYQRTXsP5nbYYwCwwgy84yPgoTT7fPN69NH92wLeCtFaMsWeolJD1AF/6uQw3pYt62rzv83sMmw==
version "3.5.1"
resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.1.tgz#cebb057acf5071c40e439f30e840c57a30d406c3"
integrity sha512-Tyctjh56U7eX2b9udu3wG853ASYP0uagChJcQJXLUXEU6C/JiW5qt5dl8ao01VRj1i5pgXPAf8f1mq4+FDLRQg==
dependencies:
"@types/sizzle" "*"
@ -125,9 +124,9 @@
"@types/jquery" "*"
"@types/node@*":
version "14.0.23"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.23.tgz#676fa0883450ed9da0bb24156213636290892806"
integrity sha512-Z4U8yDAl5TFkmYsZdFPdjeMa57NOvnaf1tljHzhouaPEp7LCj2JKkejpI1ODviIAQuW4CcQmxkQ77rnLsOOoKw==
version "14.6.2"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.2.tgz#264b44c5a28dfa80198fc2f7b6d3c8a054b9491f"
integrity sha512-onlIwbaeqvZyniGPfdw/TEhKIh79pz66L1q06WUQqJLnAb6wbjvOtepLYTGHTqzdXgBYIE3ZdmqHDGsRsbBz7A==
"@types/resolve@1.17.1":
version "1.17.1"
@ -179,14 +178,14 @@ acorn@5.X, acorn@^5.0.3:
integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==
acorn@^7.0.0:
version "7.3.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd"
integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==
version "7.4.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c"
integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==
ajv@^6.5.5:
version "6.12.3"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706"
integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==
ajv@^6.12.3:
version "6.12.4"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234"
integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==
dependencies:
fast-deep-equal "^3.1.1"
fast-json-stable-stringify "^2.0.0"
@ -421,14 +420,15 @@ arrify@^1.0.0:
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
asn1.js@^4.0.0:
version "4.10.1"
resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==
asn1.js@^5.2.0:
version "5.4.1"
resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
dependencies:
bn.js "^4.0.0"
inherits "^2.0.1"
minimalistic-assert "^1.0.0"
safer-buffer "^2.1.0"
asn1@~0.2.3:
version "0.2.4"
@ -493,13 +493,13 @@ atob@^2.1.2:
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
autoprefixer@^9.6.1:
version "9.8.5"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.5.tgz#2c225de229ddafe1d1424c02791d0c3e10ccccaa"
integrity sha512-C2p5KkumJlsTHoNv9w31NrBRgXhf6eCMteJuHZi2xhkgC+5Vm40MEtCKPhc0qdgAOhox0YPy1SQHTAky05UoKg==
version "9.8.6"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f"
integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==
dependencies:
browserslist "^4.12.0"
caniuse-lite "^1.0.30001097"
colorette "^1.2.0"
caniuse-lite "^1.0.30001109"
colorette "^1.2.1"
normalize-range "^0.1.2"
num2fraction "^1.2.2"
postcss "^7.0.32"
@ -511,9 +511,9 @@ aws-sign2@~0.7.0:
integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
aws4@^1.8.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2"
integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==
version "1.10.1"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428"
integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==
bach@^1.0.0:
version "1.2.0"
@ -598,9 +598,9 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0:
integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==
bn.js@^5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0"
integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==
version "5.1.3"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b"
integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==
brace-expansion@^1.1.7:
version "1.1.11"
@ -657,12 +657,12 @@ browser-pack@^6.0.1:
through2 "^2.0.0"
umd "^3.0.0"
browser-resolve@^1.11.0, browser-resolve@^1.7.0:
version "1.11.3"
resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6"
integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==
browser-resolve@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b"
integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==
dependencies:
resolve "1.1.7"
resolve "^1.17.0"
browserify-aes@^1.0.0, browserify-aes@^1.0.4:
version "1.2.0"
@ -704,15 +704,15 @@ browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
randombytes "^2.0.1"
browserify-sign@^4.0.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11"
integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==
version "4.2.1"
resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
dependencies:
bn.js "^5.1.1"
browserify-rsa "^4.0.1"
create-hash "^1.2.0"
create-hmac "^1.1.7"
elliptic "^6.5.2"
elliptic "^6.5.3"
inherits "^2.0.4"
parse-asn1 "^5.1.5"
readable-stream "^3.6.0"
@ -726,14 +726,14 @@ browserify-zlib@~0.2.0:
pako "~1.0.5"
browserify@^16, browserify@^16.1.0:
version "16.5.1"
resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.5.1.tgz#3c13c97436802930d5c3ae28658ddc33bfd37dc2"
integrity sha512-EQX0h59Pp+0GtSRb5rL6OTfrttlzv+uyaUVlK6GX3w11SQ0jKPKyjC/54RhPR2ib2KmfcELM06e8FxcI5XNU2A==
version "16.5.2"
resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.5.2.tgz#d926835e9280fa5fd57f5bc301f2ef24a972ddfe"
integrity sha512-TkOR1cQGdmXU9zW4YukWzWVSJwrxmNdADFbqbE3HFgQWe5wqZmOawqZ7J/8MPCwk/W8yY7Y0h+7mOtcZxLP23g==
dependencies:
JSONStream "^1.0.3"
assert "^1.4.0"
browser-pack "^6.0.1"
browser-resolve "^1.11.0"
browser-resolve "^2.0.0"
browserify-zlib "~0.2.0"
buffer "~5.2.1"
cached-path-relative "^1.0.0"
@ -754,7 +754,7 @@ browserify@^16, browserify@^16.1.0:
insert-module-globals "^7.0.0"
labeled-stream-splicer "^2.0.0"
mkdirp-classic "^0.5.2"
module-deps "^6.0.0"
module-deps "^6.2.3"
os-browserify "~0.3.0"
parents "^1.0.1"
path-browserify "~0.0.0"
@ -780,14 +780,14 @@ browserify@^16, browserify@^16.1.0:
xtend "^4.0.0"
browserslist@^4.12.0:
version "4.13.0"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.13.0.tgz#42556cba011e1b0a2775b611cba6a8eca18e940d"
integrity sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==
version "4.14.0"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.0.tgz#2908951abfe4ec98737b72f34c3bcedc8d43b000"
integrity sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==
dependencies:
caniuse-lite "^1.0.30001093"
electron-to-chromium "^1.3.488"
escalade "^3.0.1"
node-releases "^1.1.58"
caniuse-lite "^1.0.30001111"
electron-to-chromium "^1.3.523"
escalade "^3.0.2"
node-releases "^1.1.60"
buffer-equal@^1.0.0:
version "1.0.0"
@ -865,10 +865,10 @@ camelcase@^5.0.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
caniuse-lite@^1.0.30001093, caniuse-lite@^1.0.30001097:
version "1.0.30001102"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001102.tgz#3275e7a8d09548f955f665e532df88de0b63741a"
integrity sha512-fOjqRmHjRXv1H1YD6QVLb96iKqnu17TjcLSaX64TwhGYed0P1E1CCWZ9OujbbK4Z/7zax7zAzvQidzdtjx8RcA==
caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001111:
version "1.0.30001122"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001122.tgz#2c8ff631330d986a07a7ba7125cce77a1373b475"
integrity sha512-pxjw28CThdrqfz06nJkpAc5SXM404TXB/h5f4UJX+rrXJKE/1bu/KAILc2AY+O6cQIFtRjV9qOR2vaEp9LDGUA==
caseless@~0.12.0:
version "0.12.0"
@ -1047,7 +1047,7 @@ color-support@^1.1.3:
resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
colorette@^1.2.0:
colorette@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b"
integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==
@ -1152,12 +1152,12 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
create-ecdh@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==
version "4.0.4"
resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
dependencies:
bn.js "^4.1.0"
elliptic "^6.0.0"
elliptic "^6.5.3"
create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
version "1.2.0"
@ -1245,9 +1245,9 @@ dashdash@^1.12.0:
assert-plus "^1.0.0"
date-fns@^2.14.0:
version "2.14.0"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.14.0.tgz#359a87a265bb34ef2e38f93ecf63ac453f9bc7ba"
integrity sha512-1zD+68jhFgDIM0rF05rcwYO8cExdNqxjq4xP1QKM60Q45mnO6zaMWB4tOzrIr4M4GSLntsKeE4c9Bdl2jhL/yw==
version "2.16.1"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.16.1.tgz#05775792c3f3331da812af253e1a935851d3834b"
integrity sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ==
dateformat@^2.0.0:
version "2.2.0"
@ -1287,11 +1287,6 @@ decode-uri-component@^0.2.0:
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
deep-freeze@^0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84"
integrity sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=
deepmerge@^4.2.2:
version "4.2.2"
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
@ -1424,9 +1419,9 @@ duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2:
readable-stream "^2.0.2"
duplexer@^0.1.1, duplexer@~0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=
version "0.1.2"
resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
duplexify@^3.2.0, duplexify@^3.5.0, duplexify@^3.6.0:
version "3.7.1"
@ -1454,12 +1449,12 @@ ecc-jsbn@~0.1.1:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
electron-to-chromium@^1.3.488:
version "1.3.499"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.499.tgz#06949f19877dafa42915e57dfeb4c1cfb86a8649"
integrity sha512-y7FwtQm/8xuLMnYQfBQDYzCpNn+VkSnf4c3Km5TWMNXg7JA5RQBuxmcLaKdDVcIK0K5xGIa7TlxpRt4BdNxNoA==
electron-to-chromium@^1.3.523:
version "1.3.558"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.558.tgz#a329d3139cb33e8652a7e7db4c5ae26e294b9f60"
integrity sha512-r6th6b/TU2udqVoUDGWHF/z2ACJVnEei0wvWZf/nt+Qql1Vxh60ZYPhQP46j4D73T/Jou7hl4TqQfxben+qJTg==
elliptic@^6.0.0, elliptic@^6.5.2:
elliptic@^6.5.3:
version "6.5.3"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6"
integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==
@ -1527,7 +1522,7 @@ es6-weak-map@^2.0.1, es6-weak-map@^2.0.2:
es6-iterator "^2.0.3"
es6-symbol "^3.1.1"
escalade@^3.0.1:
escalade@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4"
integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==
@ -1542,6 +1537,11 @@ estree-walker@^1.0.1:
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700"
integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==
estree-walker@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.1.tgz#f8e030fb21cefa183b44b7ad516b747434e7a3e0"
integrity sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg==
event-emitter@^0.3.5:
version "0.3.5"
resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
@ -1695,6 +1695,11 @@ fast-json-stable-stringify@^2.0.0:
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
fast-levenshtein@^1.0.0:
version "1.1.4"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz#e6a754cc8f15e58987aa9cbd27af66fd6f4e5af9"
integrity sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=
fast-safe-stringify@^2.0.7:
version "2.0.7"
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743"
@ -2002,15 +2007,16 @@ glob-stream@^6.1.0:
unique-stream "^2.0.2"
glob-watcher@^5.0.3:
version "5.0.3"
resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.3.tgz#88a8abf1c4d131eb93928994bc4a593c2e5dd626"
integrity sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==
version "5.0.5"
resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.5.tgz#aa6bce648332924d9a8489be41e3e5c52d4186dc"
integrity sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==
dependencies:
anymatch "^2.0.0"
async-done "^1.2.0"
chokidar "^2.0.0"
is-negated-glob "^1.0.0"
just-debounce "^1.0.0"
normalize-path "^3.0.0"
object.defaults "^1.1.0"
glob@^5.0.3:
@ -2024,7 +2030,7 @@ glob@^5.0.3:
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@^7.0.0, glob@^7.0.3, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1:
glob@^7.0.0, glob@^7.0.3, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@~7.1.1:
version "7.1.6"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
@ -2228,13 +2234,14 @@ gulp-sourcemaps@^2.6.5:
through2 "2.X"
gulp-terser@^1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/gulp-terser/-/gulp-terser-1.2.0.tgz#41df2a1d0257d011ba8b05efb2568432ecd0495b"
integrity sha512-lf+jE2DALg2w32p0HRiYMlFYRYelKZPNunHp2pZccCYrrdCLOs0ItbZcN63yr2pbz116IyhUG9mD/QbtRO1FKA==
version "1.4.0"
resolved "https://registry.yarnpkg.com/gulp-terser/-/gulp-terser-1.4.0.tgz#0ac4dfdbed4ab46906007c5b358810c1642b9764"
integrity sha512-7df9leJna3WOmj76tYHxjpn7BSU+vmKVjVSd6bz3uLEyrzCfZI97KPhRcIabrSNzs0UY/UXTt+JwkxPw3sF85w==
dependencies:
is-promise "^4.0.0"
plugin-error "^1.0.1"
terser "^4.0.0"
through2 "^3.0.1"
terser ">=4"
through2 "^4.0.2"
vinyl-sourcemaps-apply "^0.2.1"
gulp-util@^3.0.8:
@ -2292,11 +2299,11 @@ har-schema@^2.0.0:
integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
har-validator@~5.1.3:
version "5.1.3"
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==
version "5.1.5"
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
dependencies:
ajv "^6.5.5"
ajv "^6.12.3"
har-schema "^2.0.0"
has-ansi@^2.0.0:
@ -2710,7 +2717,12 @@ is-promise@^2.1:
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
is-reference@^1.1.2:
is-promise@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3"
integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==
is-reference@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7"
integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==
@ -2793,11 +2805,12 @@ isstream@~0.1.2:
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
jest-worker@^26.0.0:
version "26.1.0"
resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.1.0.tgz#65d5641af74e08ccd561c240e7db61284f82f33d"
integrity sha512-Z9P5pZ6UC+kakMbNJn+tA2RdVdNX5WH1x+5UCBZ9MxIK24pjYtFt96fK+UwBTrjLYm232g1xz0L3eTh51OW+yQ==
jest-worker@^26.2.1:
version "26.3.0"
resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.3.0.tgz#7c8a97e4f4364b4f05ed8bca8ca0c24de091871f"
integrity sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==
dependencies:
"@types/node" "*"
merge-stream "^2.0.0"
supports-color "^7.0.0"
@ -2814,9 +2827,9 @@ jquery@>=1.7.2:
integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==
js-base64@^2.1.8:
version "2.6.3"
resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.3.tgz#7afdb9b57aa7717e15d370b66e8f36a9cb835dc3"
integrity sha512-fiUvdfCaAXoQTHdKMgTvg6IkecXDcVz6V5rlftUTclF9IKBjMizvSdQaCl/z/6TApDeby5NL+axYou3i0mu1Pg==
version "2.6.4"
resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4"
integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
js-tokens@^4.0.0:
version "4.0.0"
@ -3101,9 +3114,9 @@ lodash.templatesettings@^3.0.0:
lodash.escape "^3.0.0"
lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.4, lodash@~4.17.10:
version "4.17.19"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b"
integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==
version "4.17.20"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
loud-rejection@^1.0.0:
version "1.6.0"
@ -3128,7 +3141,7 @@ lru-queue@0.1:
dependencies:
es5-ext "~0.10.2"
magic-string@^0.25.2:
magic-string@^0.25.7:
version "0.25.7"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051"
integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==
@ -3343,13 +3356,13 @@ mkdirp-classic@^0.5.2:
dependencies:
minimist "^1.2.5"
module-deps@^6.0.0:
version "6.2.2"
resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.2.tgz#d8a15c2265dfc119153c29bb47386987d0ee423b"
integrity sha512-a9y6yDv5u5I4A+IPHTnqFxcaKr4p50/zxTjcQJaX2ws9tN/W6J6YXnEKhqRyPhl494dkcxx951onSKVezmI+3w==
module-deps@^6.2.3:
version "6.2.3"
resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.3.tgz#15490bc02af4b56cf62299c7c17cba32d71a96ee"
integrity sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==
dependencies:
JSONStream "^1.0.3"
browser-resolve "^1.7.0"
browser-resolve "^2.0.0"
cached-path-relative "^1.0.2"
concat-stream "~1.6.0"
defined "^1.0.0"
@ -3446,10 +3459,10 @@ node-gyp@^3.8.0:
tar "^2.0.0"
which "1"
node-releases@^1.1.58:
version "1.1.59"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.59.tgz#4d648330641cec704bff10f8e4fe28e453ab8e8e"
integrity sha512-H3JrdUczbdiwxN5FuJPyCHnGHIFqQ0wWxo+9j1kAXAzqNMAHlo+4I/sYYxpyK0irQ73HgdiyzD32oqQDcU2Osw==
node-releases@^1.1.60:
version "1.1.60"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.60.tgz#6948bdfce8286f0b5d0e5a88e8384e954dfe7084"
integrity sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==
node-sass@^4.8.3:
version "4.14.1"
@ -3718,13 +3731,12 @@ parents@^1.0.0, parents@^1.0.1:
path-platform "~0.11.15"
parse-asn1@^5.0.0, parse-asn1@^5.1.5:
version "5.1.5"
resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e"
integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==
version "5.1.6"
resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
dependencies:
asn1.js "^4.0.0"
asn1.js "^5.2.0"
browserify-aes "^1.0.0"
create-hash "^1.1.0"
evp_bytestokey "^1.0.0"
pbkdf2 "^3.0.3"
safe-buffer "^5.1.1"
@ -4060,7 +4072,7 @@ read-pkg@^1.0.0:
normalize-package-data "^2.3.2"
path-type "^1.0.0"
"readable-stream@2 || 3", readable-stream@^3.6.0:
"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@ -4260,12 +4272,7 @@ resolve-url@^0.2.1:
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
resolve@1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.14.1, resolve@^1.17.0, resolve@^1.4.0:
resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.1, resolve@^1.17.0, resolve@^1.4.0:
version "1.17.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
@ -4292,20 +4299,20 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
hash-base "^3.0.0"
inherits "^2.0.1"
rollup-plugin-terser@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-6.1.0.tgz#071866585aea104bfbb9dd1019ac523e63c81e45"
integrity sha512-4fB3M9nuoWxrwm39habpd4hvrbrde2W2GG4zEGPQg1YITNkM3Tqur5jSuXlWNzbv/2aMLJ+dZJaySc3GCD8oDw==
rollup-plugin-terser@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.1.tgz#df72d8272e03fcb504a76f414b9509c63c5eaf54"
integrity sha512-HL0dgzSxBYG/Ly9i/E5Sc+PuKKZ0zBzk11VmLCfdUtpqH4yYqkLclPkTqRy85FU9246yetImOClaQ/ufnj08vg==
dependencies:
"@babel/code-frame" "^7.8.3"
jest-worker "^26.0.0"
serialize-javascript "^3.0.0"
terser "^4.7.0"
"@babel/code-frame" "^7.10.4"
jest-worker "^26.2.1"
serialize-javascript "^4.0.0"
terser "^5.0.0"
rollup@^2.18.1:
version "2.21.0"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.21.0.tgz#d2e114533812043d5c9b7b0a83f1b2a242e4e1d6"
integrity sha512-BEGgy+wSzux7Ycq58pRiWEOBZaXRXTuvzl1gsm7gqmsAHxkWf9nyA5V2LN9fGSHhhDQd0/C13iRzSh4bbIpWZQ==
rollup@^2.26.9:
version "2.26.9"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.26.9.tgz#4b6ce4e9044dd257d7314d8ed9b4d4d8a7d166c9"
integrity sha512-XIiWYLayLqV+oY4S2Lub/shJq4uk/QQLwWToYCL4LjZbYHbFK3czea4UDVRUJu+zNmKmxq5Zb/OG7c5HSvH2TQ==
optionalDependencies:
fsevents "~2.1.2"
@ -4386,10 +4393,10 @@ semver@~5.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8=
serialize-javascript@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea"
integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==
serialize-javascript@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==
dependencies:
randombytes "^2.1.0"
@ -4810,9 +4817,9 @@ supports-color@^6.1.0:
has-flag "^3.0.0"
supports-color@^7.0.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
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"
@ -4855,10 +4862,10 @@ ternary-stream@^2.0.1:
merge-stream "^1.0.0"
through2 "^2.0.1"
terser@^4.0.0, terser@^4.7.0:
version "4.8.0"
resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
terser@>=4, terser@^5.0.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/terser/-/terser-5.2.1.tgz#40b971b8d28b4fe98c9e8c0d073ab48e7bb96cd8"
integrity sha512-/AOtjRtAMNGO0fIF6m8HfcvXTw/2AKpsOzDn36tA5RfhRdeXyb4RvHxJ5Pah7iL6dFkLk+gOnCaNHGwJPl6TrQ==
dependencies:
commander "^2.20.0"
source-map "~0.6.1"
@ -4904,6 +4911,13 @@ through2@^3.0.1:
inherits "^2.0.4"
readable-stream "2 || 3"
through2@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764"
integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==
dependencies:
readable-stream "3"
through@2, "through@>=2.2.7 <3", through@~2.3, through@~2.3.1:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
@ -5018,10 +5032,10 @@ tsify@^4.0.0:
through2 "^2.0.0"
tsconfig "^5.0.3"
tslib@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.0.tgz#18d13fc2dce04051e20f074cc8387fd8089ce4f3"
integrity sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==
tslib@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e"
integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==
tty-browserify@0.0.1:
version "0.0.1"
@ -5046,9 +5060,9 @@ type@^1.0.1:
integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
type@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3"
integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==
version "2.1.0"
resolved "https://registry.yarnpkg.com/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f"
integrity sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==
typedarray@^0.0.6:
version "0.0.6"
@ -5060,11 +5074,16 @@ types-serviceworker@^0.0.1:
resolved "https://registry.yarnpkg.com/types-serviceworker/-/types-serviceworker-0.0.1.tgz#3d356e176d3b987d2164b34e609c591e67d31f1c"
integrity sha512-EKO/SZ3AsHEZsqv+bsdlTCz5k955riOksnYGlG6JhVwNTVsPWj/TScTbiNVZ5+mmX8TcEXF0C8aSxUw0jTDpIw==
typescript@^3, typescript@^3.9.5:
typescript@^3:
version "3.9.7"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa"
integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==
typescript@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.2.tgz#7ea7c88777c723c681e33bf7988be5d008d05ac2"
integrity sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==
umd@^3.0.0:
version "3.0.3"
resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf"
@ -5092,15 +5111,16 @@ undertaker-registry@^1.0.0:
integrity sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=
undertaker@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.2.1.tgz#701662ff8ce358715324dfd492a4f036055dfe4b"
integrity sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==
version "1.3.0"
resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.3.0.tgz#363a6e541f27954d5791d6fa3c1d321666f86d18"
integrity sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==
dependencies:
arr-flatten "^1.0.1"
arr-map "^2.0.0"
bach "^1.0.0"
collection-map "^1.0.0"
es6-weak-map "^2.0.1"
fast-levenshtein "^1.0.0"
last-run "^1.1.0"
object.defaults "^1.0.0"
object.reduce "^1.0.0"
@ -5143,9 +5163,9 @@ upath@^1.1.1:
integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
uri-js@^4.2.2:
version "4.2.2"
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==
version "4.4.0"
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602"
integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==
dependencies:
punycode "^2.1.0"