From 9ff0d2210fb08875e954cea2342704ea40895378 Mon Sep 17 00:00:00 2001 From: "Mr. Stallion" Date: Fri, 27 Nov 2020 00:12:47 -0600 Subject: [PATCH] Check for unread notes and messages --- .gitignore | 4 + CHANGELOG.md | 3 +- chat/Chat.vue | 2 + chat/ChatView.vue | 7 +- chat/core.ts | 4 + chat/preview/event-bus.ts | 7 ++ electron/Index.vue | 2 + electron/yarn.lock | 4 + package.json | 5 +- site/NoteStatus.vue | 172 ++++++++++++++++++++++++++++ site/note-checker.ts | 85 ++++++++++++++ site/site-session.ts | 201 +++++++++++++++++++++++++++++++++ yarn.lock | 230 ++++++++++++++++++++++++-------------- 13 files changed, 639 insertions(+), 87 deletions(-) create mode 100644 electron/yarn.lock create mode 100644 site/NoteStatus.vue create mode 100644 site/note-checker.ts create mode 100644 site/site-session.ts diff --git a/.gitignore b/.gitignore index 66d21b6..8758258 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,7 @@ node_modules/ .DS_Store + + +test.ts + diff --git a/CHANGELOG.md b/CHANGELOG.md index 8733e91..437a2ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ # Changelog ## Canary -* Fixed max ad length for automated ads to be 50,000 characters +* Show number of unread notes and messages in the bottom right corner +* Fixed max ad length for automated ads to 50,000 characters * Fixed 'unsure' sexual orientation to display correctly in character preview diff --git a/chat/Chat.vue b/chat/Chat.vue index 2dfef62..da9df2b 100644 --- a/chat/Chat.vue +++ b/chat/Chat.vue @@ -140,6 +140,7 @@ import {InlineDisplayMode} from '../interfaces'; AdManager.onConnectionClosed(); core.adCoordinator.clear(); + core.siteSession.onConnectionClosed(); document.title = l('title'); }); @@ -173,6 +174,7 @@ import {InlineDisplayMode} from '../interfaces'; this.connected = true; core.notifications.playSound('login'); document.title = l('title.connected', core.connection.character); + core.siteSession.onConnectionEstablished(); }); core.watch(() => core.conversations.hasNew, (hasNew) => { document.title = (hasNew ? '💬 ' : '') + l(core.connection.isOpen ? 'title.connected' : 'title', core.connection.character); diff --git a/chat/ChatView.vue b/chat/ChatView.vue index 5034ee1..ecdd55f 100644 --- a/chat/ChatView.vue +++ b/chat/ChatView.vue @@ -98,8 +98,9 @@ + - +/me + diff --git a/site/note-checker.ts b/site/note-checker.ts new file mode 100644 index 0000000..79fc025 --- /dev/null +++ b/site/note-checker.ts @@ -0,0 +1,85 @@ +import { SiteSession, SiteSessionInterface } from './site-session'; +import log from 'electron-log'; +import { EventBus } from '../chat/preview/event-bus'; + +export interface NoteCheckerCount { + unreadNotes: number; + unreadMessages: number; + onlineUsers: number; +} + + +export class NoteChecker implements SiteSessionInterface { + private static readonly CHECK_FREQUENCY = 10 * 60 * 1000; + + private latestCount: NoteCheckerCount = { unreadNotes: 0, unreadMessages: 0, onlineUsers: 0 }; + private timer?: any; + + + constructor(private session: SiteSession) { + + } + + + async start(): Promise { + try { + await this.stop(); + await this.check(); + + this.timer = setInterval( + async() => { + try { + await this.check(); + } catch(err) { + log.error('notechecker.check.error', err); + } + }, + NoteChecker.CHECK_FREQUENCY + ); + + } catch(err) { + log.error('notechecker.start.error', err); + } + } + + + async stop(): Promise { + if (this.timer) { + clearInterval(this.timer); + delete this.timer; + } + + this.latestCount = { unreadNotes: 0, unreadMessages: 0, onlineUsers: 0 }; + } + + + private async check(): Promise { + log.debug('notechecker.check'); + + const res = await this.session.get('/', true); + const messagesMatch = res.body.match(/NavigationMessages.*?([0-9]+?) Messages/); + const notesMatch = res.body.match(/NavigationNotecount.*?([0-9]+?) Notes/); + const statsMatch = res.body.match(/Frontpage_Stats.*?([0-9]+?) characters/); + + // console.log('MATCH', messagesMatch[1], notesMatch[1], statsMatch[1]); + + const summary = { + unreadNotes: (notesMatch && notesMatch.length > 1) ? parseInt(notesMatch[1], 10) : 0, + unreadMessages: (messagesMatch && messagesMatch.length > 1) ? parseInt(messagesMatch[1], 10) : 0, + onlineUsers: (statsMatch && statsMatch.length > 1) ? parseInt(statsMatch[1], 10) : 0 + }; + + this.latestCount = summary; + + log.debug('notechecker.check.success', summary); + EventBus.$emit('note-counts-update', summary); + + return summary; + } + + + getCounts(): NoteCheckerCount { + return this.latestCount; + } + +} diff --git a/site/site-session.ts b/site/site-session.ts new file mode 100644 index 0000000..47eafc1 --- /dev/null +++ b/site/site-session.ts @@ -0,0 +1,201 @@ +// import qs from 'qs'; +import _ from 'lodash'; +import log from 'electron-log'; +import throat from 'throat'; //tslint:disable-line:match-default-export-name +import { NoteChecker } from './note-checker'; + +import request from 'request-promise'; + + +export interface SiteSessionInterface { + start(): Promise; + stop(): Promise; +} + +export interface SiteSessionInterfaceCollection extends Record { + notes: NoteChecker; +} + + +export class SiteSession { + private readonly sessionThroat = throat(1); + + readonly interfaces: SiteSessionInterfaceCollection = { + notes: new NoteChecker(this) + }; + + private state: 'active' | 'inactive' = 'inactive'; + private account = ''; + private password = ''; + + private request: request.RequestPromiseAPI = request.defaults({ jar: request.jar() }); + + private csrf = ''; + + + setCredentials(account: string, password: string): void { + this.account = account; + this.password = password; + } + + + async start(): Promise { + try { + await this.stop(); + await this.init(); + await this.login(); + + this.state = 'active'; + + await Promise.all( + _.map(this.interfaces, (i) => i.start()) + ); + } catch(err) { + this.state = 'inactive'; + log.error('sitesession.start.error', err); + } + } + + + async stop(): Promise { + try { + await Promise.all( + _.map(this.interfaces, (i) => i.stop()) + ); + } catch(err) { + log.error('sitesession.stop.error', err); + } + + this.csrf = ''; + this.state = 'inactive'; + } + + + private async init(): Promise { + log.debug('sitesession.init'); + + this.request = request.defaults({ jar: request.jar() }); + this.csrf = ''; + + const res = await this.get('/'); + + if (res.statusCode !== 200) { + throw new Error(`SiteSession.init: Invalid status code: ${res.status}`); + } + + const input = res.body.match(//); + + if ((!input) || (input.length < 1)) { + throw new Error('SiteSession.init: Missing csrf token'); + } + + const csrf = input[0].match(/value="([a-zA-Z0-9]+)"/); + + if ((!csrf) || (csrf.length < 2)) { + throw new Error('SiteSession.init: Missing csrf token value'); + } + + this.csrf = csrf[1]; + } + + + private async login(): Promise { + log.debug('sitesession.login'); + + if ((this.password === '') || (this.account === '')) { + throw new Error('User credentials not set'); + } + + const res = await this.post( + '/action/script_login.php', + { + username: this.account, + password: this.password, + csrf_token: this.csrf + }, + false, + { + followRedirect: false, + simple: false + } + ); + + if (res.statusCode !== 302) { + throw new Error('Invalid status code'); + } + + // console.log('RES RES RES', res); + + log.debug('sitesession.login.success'); + } + + + // tslint:disable-next-line:prefer-function-over-method + private async ensureLogin(): Promise { + if (this.state !== 'active') { + throw new Error('Site session not active'); + } + } + + + private async prepareRequest( + method: string, + uri: string, + mustBeLoggedIn: boolean, + config: Partial + ): Promise { + if (mustBeLoggedIn) { + await this.ensureLogin(); + } + + return _.merge( + { + method, + uri: `https://www.f-list.net${uri}`, + resolveWithFullResponse: true + }, + config + ); + } + + + async get(uri: string, mustBeLoggedIn: boolean = false, config: Partial = {}): Promise { + const res = await this.sessionThroat( + async() => { + const finalConfig = await this.prepareRequest('get', uri, mustBeLoggedIn, config); + + return this.request(finalConfig); + } + ); + + return res; + } + + + async post( + uri: string, + data: Record, + mustBeLoggedIn: boolean = false, + config: Partial = {} + ): Promise { + const res = await this.sessionThroat( + async() => { + const finalConfig = await this.prepareRequest('post', uri, mustBeLoggedIn, _.merge({ form: data }, config)); + + return this.request(finalConfig); + } + ); + + return res; + } + + + async onConnectionClosed(): Promise { + await this.stop(); + } + + + async onConnectionEstablished(): Promise { + await this.start(); + } +} diff --git a/yarn.lock b/yarn.lock index 62805df..30dbdec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,31 +23,31 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@cliqz/adblocker-content@^1.18.6": - version "1.18.6" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-content/-/adblocker-content-1.18.6.tgz#a65dd518f3e6d1f2e9fee36ca5ae5615ba7b4cfd" - integrity sha512-OXrca20n+cMn9Ase+6oeX3fTmkauQMSb//lMLs56pHyra4foxN5o1rNiBG7qNIypdGQBFiTtGG7Vbp7YO5RQMw== +"@cliqz/adblocker-content@^1.18.8": + version "1.18.8" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-content/-/adblocker-content-1.18.8.tgz#96473f14c098a20091298d34a6addcd430aceebd" + integrity sha512-YZ1xYBVG3LmxsdTYvTs/Bc7pzCw/Dy4HFo6N+oIuGP+Le/0aGSkACUl3ue5I2+Cx0WmL0Z8I4QonTKDc06HR+A== -"@cliqz/adblocker-electron-preload@^1.18.6": - version "1.18.6" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.18.6.tgz#57ec2dac09bbacb03b143609345638e98132f985" - integrity sha512-cOK6ZuN3j0qLCZUj8oCf2PmPY837VTxtZM6bZl1x5xWLy/31x7186Wk0DP3C9MXU7gUhlqYxxKpbJDLZgFJ7Qw== +"@cliqz/adblocker-electron-preload@^1.18.8": + version "1.18.8" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.18.8.tgz#c2058647e015b6f61c222e7d58040347324c63b0" + integrity sha512-/FAzyhNUj+8fwqSGth7ndaC+8huEANvVquYkDVmjM38uryxFgcJJI6Bij1l1zABIbskAaSN4G4RI3oERyd9/KQ== dependencies: - "@cliqz/adblocker-content" "^1.18.6" + "@cliqz/adblocker-content" "^1.18.8" "@cliqz/adblocker-electron@^1.18.3": - version "1.18.6" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron/-/adblocker-electron-1.18.6.tgz#e387a1dc6f3f4a4005d299b37723899be4f0967b" - integrity sha512-RGy003FHsvcLoGYaQIJVNWX8ZUQmK+Dbo0LeQAcsP96vOaTHHFOVj0Auhwkg7mZASiR9/XnoNepKIifO2zQVfw== + version "1.18.8" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron/-/adblocker-electron-1.18.8.tgz#5f697c5dc65cd936b3908078a6e4516ec995567a" + integrity sha512-CrsFjSwenWQogsAg4sHFaXZbu7hzs9dMdsZM5wxb+5QfZ3MSH3PBYAeAUnsmP3UOTZ423+6ErOUE1vzj3UrK9w== dependencies: - "@cliqz/adblocker" "^1.18.6" - "@cliqz/adblocker-electron-preload" "^1.18.6" + "@cliqz/adblocker" "^1.18.8" + "@cliqz/adblocker-electron-preload" "^1.18.8" tldts-experimental "^5.6.21" -"@cliqz/adblocker@^1.18.6": - version "1.18.6" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker/-/adblocker-1.18.6.tgz#07d075c45017db7cd2aff19afe466ad53217d318" - integrity sha512-+ro8DoqBaMt9nmfjJF+0Om03/9hdDhRx6NJKzwmW7Pfvd/XhqJ+NiDtdusABSERhCE3nUXCWdu5j09X9HiX6Vg== +"@cliqz/adblocker@^1.18.8": + version "1.18.8" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker/-/adblocker-1.18.8.tgz#f6e5724fe6573c2e68f2545d90bcce3e1ecfbae9" + integrity sha512-19m0GhlOcdSvQ/BqVuaMgbYkgQ4ys8koBRW4K7Ua4V5fFWL0t8ckdcZ/gBOqwECS2m8agXSpEbbyJjNmHBHpMQ== dependencies: "@remusao/guess-url-type" "^1.1.2" "@remusao/small" "^1.1.2" @@ -193,7 +193,7 @@ dependencies: defer-to-connect "^2.0.0" -"@types/bluebird@^3.5.33": +"@types/bluebird@*", "@types/bluebird@^3.5.33": version "3.5.33" resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.33.tgz#d79c020f283bd50bd76101d7d300313c107325fc" integrity sha512-ndEo1xvnYeHxm7I/5sF6tBvnsA4Tdi3zj1keRKRs12SP+2ye2A27NDJ1B6PqkfMbGAcT+mqQVqbZRIrhfOp5PQ== @@ -208,6 +208,11 @@ "@types/node" "*" "@types/responselike" "*" +"@types/caseless@*": + version "0.12.2" + resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8" + integrity sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w== + "@types/chrome@^0.0.126": version "0.0.126" resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.126.tgz#f9f3436712f0c7c12ea9798abc9b95575ad7b23a" @@ -303,14 +308,14 @@ form-data "^3.0.0" "@types/node@*": - version "14.14.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.9.tgz#04afc9a25c6ff93da14deabd65dc44485b53c8d6" - integrity sha512-JsoLXFppG62tWTklIoO4knA+oDTYsmqWxHRvd4lpmfQRNhX6osheUOWETP2jMoV/2bEHuMra8Pp3Dmo/stBFcw== + version "14.14.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.10.tgz#5958a82e41863cfc71f2307b3748e3491ba03785" + integrity sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ== "@types/node@^12.0.12", "@types/node@^12.12.47": - version "12.19.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.6.tgz#fbf249fa46487dd8c7386d785231368b92a33a53" - integrity sha512-U2VopDdmBoYBmtm8Rz340mvvSz34VgX/K9+XCuckvcLGMkt3rbMX8soqFOikIPlPBc5lmw8By9NUK7bEFSBFlQ== + version "12.19.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.7.tgz#cf8b6ac088dd9182ac9a1d765f787a8d12490c04" + integrity sha512-zvjOU1g4CpPilbTDUATnZCUb/6lARMRAqzT7ILwl1P3YvU2leEcZ2+fw9+Jrw/paXB1CgQyXTrN4hWDtqT9O2A== "@types/q@^1.5.1": version "1.5.4" @@ -322,6 +327,24 @@ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b" integrity sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ== +"@types/request-promise@^4.1.46": + version "4.1.46" + resolved "https://registry.yarnpkg.com/@types/request-promise/-/request-promise-4.1.46.tgz#37df6efae984316dfbfbbe8fcda37f3ba52822f2" + integrity sha512-3Thpj2Va5m0ji3spaCk8YKrjkZyZc6RqUVOphA0n/Xet66AW/AiOAs5vfXhQIL5NmkaO7Jnun7Nl9NEjJ2zBaw== + dependencies: + "@types/bluebird" "*" + "@types/request" "*" + +"@types/request@*": + version "2.48.5" + resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.5.tgz#019b8536b402069f6d11bee1b2c03e7f232937a0" + integrity sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ== + dependencies: + "@types/caseless" "*" + "@types/node" "*" + "@types/tough-cookie" "*" + form-data "^2.5.0" + "@types/responselike@*", "@types/responselike@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" @@ -334,6 +357,11 @@ resolved "https://registry.yarnpkg.com/@types/sortablejs/-/sortablejs-1.10.6.tgz#98725ae08f1dfe28b8da0fdf302c417f5ff043c0" integrity sha512-QRz8Z+uw2Y4Gwrtxw8hD782zzuxxugdcq8X/FkPsXUa1kfslhGzy13+4HugO9FXNo+jlWVcE6DYmmegniIQ30A== +"@types/tough-cookie@*": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.0.tgz#fef1904e4668b6e5ecee60c52cc6a078ffa6697d" + integrity sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A== + "@types/yauzl@^2.9.1": version "2.9.1" resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af" @@ -1692,9 +1720,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001157: - version "1.0.30001159" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001159.tgz#bebde28f893fa9594dadcaa7d6b8e2aa0299df20" - integrity sha512-w9Ph56jOsS8RL20K9cLND3u/+5WASWdhC/PPrf+V3/HsM3uHOavWOR1Xzakbv4Puo/srmPHudkmCRWM7Aq+/UA== + version "1.0.30001161" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001161.tgz#64f7ffe79ee780b8c92843ff34feb36cea4651e0" + integrity sha512-JharrCDxOqPLBULF9/SPa6yMcBRTjZARJ6sc3cuKrPfyIk64JN6kuMINWqA99Xc8uElMFcROliwtz0n9pYej+g== caseless@~0.12.0: version "0.12.0" @@ -2039,14 +2067,14 @@ copy-webpack-plugin@^6.2.1: webpack-sources "^1.4.3" core-js@^2.4.0, core-js@^2.5.0: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.6.5: - version "3.7.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.7.0.tgz#b0a761a02488577afbf97179e4681bf49568520f" - integrity sha512-NwS7fI5M5B85EwpWuIwJN4i/fbisQUwLwiSNUWeXlkAZ0sbBjLEvLvFLf1uzAUV66PcEPt4xCGCmOZSxVf3xzA== + version "3.8.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.0.tgz#0fc2d4941cadf80538b030648bb64d230b4da0ce" + integrity sha512-W2VYNB0nwQQE7tKS7HzXd7r2y/y2SVJl4ga6oH/dnaLFzM0o2lB2P3zCkWj5Wc/zyMYjtgd5Hmhk0ObkQFZOIA== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -2154,10 +2182,10 @@ css-tree@1.0.0-alpha.37: mdn-data "2.0.4" source-map "^0.6.1" -css-tree@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.1.tgz#30b8c0161d9fb4e9e2141d762589b6ec2faebd2e" - integrity sha512-NVN42M2fjszcUNpDbdkvutgQSlFYsr1z7kqeuCagHnNLBfYor6uP1WL1KrkmdYZ5Y1vTBCIOI/C/+8T98fJ71w== +css-tree@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5" + integrity sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ== dependencies: mdn-data "2.0.14" source-map "^0.6.1" @@ -2241,11 +2269,11 @@ cssnano@^4.1.10: postcss "^7.0.0" csso@^4.0.2: - version "4.1.1" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.1.1.tgz#e0cb02d6eb3af1df719222048e4359efd662af13" - integrity sha512-Rvq+e1e0TFB8E8X+8MQjHSY6vtol45s5gxtLI/018UsAn2IBMmwNEZRM/h+HVnAJRHjasLIKKUO3uvoMM28LvA== + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== dependencies: - css-tree "^1.0.0" + css-tree "^1.1.2" cuint@^0.2.2: version "0.2.2" @@ -2576,9 +2604,9 @@ electron-squirrel-startup@^1.0.0: debug "^2.2.0" electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.591: - version "1.3.603" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.603.tgz#1b71bec27fb940eccd79245f6824c63d5f7e8abf" - integrity sha512-J8OHxOeJkoSLgBXfV9BHgKccgfLMHh+CoeRo6wJsi6m0k3otaxS/5vrHpMNSEYY4MISwewqanPOuhAtuE8riQQ== + version "1.3.608" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.608.tgz#e1f962beeaa008698fb89b7e5387535251610eb4" + integrity sha512-dZsqCe7WgOcFse1QxIrm3eR+ebF13f0HfzM5QW9WtP1XVsQVrl/6R3DjexfVdupfwaS6znEDcP0NTBlJii7sOA== electron-winstaller@^4.0.1: version "4.0.1" @@ -3138,6 +3166,15 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" + integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + form-data@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" @@ -3849,9 +3886,9 @@ is-color-stop@^1.0.0: rgba-regex "^1.0.0" is-core-module@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946" - integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== dependencies: has "^1.0.3" @@ -4381,7 +4418,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.10: +lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.10: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== @@ -5066,13 +5103,13 @@ object.pick@^1.3.0: isobject "^3.0.1" object.values@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" + integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.1" has "^1.0.3" on-finished@~2.3.0: @@ -5166,11 +5203,11 @@ p-limit@^2.0.0, p-limit@^2.2.0: p-try "^2.0.0" p-limit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" - integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: - p-try "^2.0.0" + yocto-queue "^0.1.0" p-locate@^2.0.0: version "2.0.0" @@ -5708,9 +5745,9 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.27: supports-color "^6.1.0" postcss@^8.1.4: - version "8.1.9" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.1.9.tgz#20ff4b598a6f5015c5f7fe524b8ed5313d7ecade" - integrity sha512-oWuBpEl1meaMKkQXn0ic78TUrgsMvrAZLE/6ZY0H3LTteq2O3L8PGWwMbPLctpksTJIHjQeossMUMNQW7qRIHQ== + version "8.1.10" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.1.10.tgz#129834f94c720554d2cfdaeb27d5542ac4a026ea" + integrity sha512-iBXEV5VTTYaRRdxiFYzTtuv2lGMQBExqkZKSzkJe+Fl6rvQrA/49UVGKqB+LG54hpW/TtDBMGds8j33GFNW7pg== dependencies: colorette "^1.2.1" nanoid "^3.1.18" @@ -6028,6 +6065,23 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + dependencies: + lodash "^4.17.19" + +request-promise@^4.2.6: + version "4.2.6" + resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.6.tgz#7e7e5b9578630e6f598e3813c0f8eb342a27f0a2" + integrity sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ== + dependencies: + bluebird "^3.5.0" + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + request@^2.87.0, request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" @@ -6625,6 +6679,11 @@ stdout-stream@^1.4.0: dependencies: readable-stream "^2.0.1" +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + stream-buffers@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" @@ -6666,20 +6725,20 @@ string-width@^4.1.0, string-width@^4.2.0: strip-ansi "^6.0.0" string.prototype.trimend@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz#6ddd9a8796bc714b489a3ae22246a208f37bfa46" - integrity sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw== + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" + integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" string.prototype.trimstart@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz#22d45da81015309cd0cdd79787e8919fc5c613e7" - integrity sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" + integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" string_decoder@^1.1.1: version "1.3.0" @@ -6833,7 +6892,7 @@ tapable@^1.0.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tapable@^2.0.0: +tapable@^2.0.0, tapable@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.1.1.tgz#b01cc1902d42a7bb30514e320ce21c456f72fd3f" integrity sha512-Wib1S8m2wdpLbmQz0RBEVosIyvb/ykfKXf3ZIDqvWoMg/zTNm6G/tDSuUM61J1kNCDXWJrLHGSFeMhAG+gAGpQ== @@ -6932,17 +6991,17 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= -tldts-core@^5.6.72: - version "5.6.72" - resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-5.6.72.tgz#195332f89bffb9af352aad5b2dbbdeddbf2c0a6a" - integrity sha512-/GyG6M3XCP1VPWhROjOgWeEMATWWCjoy1Qx3LSJCzegefYDtQuCiNO6ZU/Cnil5a0NWGJ4Gi38BNbiEOGFqEHw== +tldts-core@^5.6.73: + version "5.6.73" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-5.6.73.tgz#0bc71f4b93f6e7d53ba8d4ec5314aebccf0de922" + integrity sha512-fNLyl2Heuo1mvs/QYhUMrteLxUJGkR/hOlOF1M3ZXiB6Na8AfPrkJi/jUr697400Ob7zhmD/rtKwJcix5As4Pg== tldts-experimental@^5.6.21: - version "5.6.72" - resolved "https://registry.yarnpkg.com/tldts-experimental/-/tldts-experimental-5.6.72.tgz#87b5f9f52b3a274c3f366e9d05cb11b4a825ba53" - integrity sha512-wD0gEFwmdZ/9a8eUnF644hsdZt8iVQ7Txa6gVg9NOD7eL+vk7Uc28Ty/GaNW2h30sMG4rPvLs/6s/eGaABI6Bw== + version "5.6.73" + resolved "https://registry.yarnpkg.com/tldts-experimental/-/tldts-experimental-5.6.73.tgz#8efb8ef6d0c1bf75d22bdb6e4116eb0774e19b8e" + integrity sha512-rAGLu2Tjpl2sxrzgjyXQIFYp3TA0ucqO3zWqJfbPQJd9TR9j4kgZQyLfZrUVfNzIsXJ5OMFeG1Wz72Y38X1Vuw== dependencies: - tldts-core "^5.6.72" + tldts-core "^5.6.73" tmp-promise@^1.0.5: version "1.1.0" @@ -7018,7 +7077,7 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== -tough-cookie@~2.5.0: +tough-cookie@^2.3.3, tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -7376,9 +7435,9 @@ webpack-sources@^2.1.1: source-map "^0.6.1" webpack@^5.3.2: - version "5.6.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.6.0.tgz#282d10434c403b070ed91d459b385e873b51a07d" - integrity sha512-SIeFuBhuheKElRbd84O35UhKc0nxlgSwtzm2ksZ0BVhRJqxVJxEguT/pYhfiR0le/pxTa1VsCp7EOYyTsa6XOA== + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.8.0.tgz#65f00a181708279ff982c2d7338e1dd5505364c4" + integrity sha512-X2yosPiHip3L0TE+ylruzrOqSgEgsdGyBOGFWKYChcwlKChaw9VodZIUovG1oo7s0ss6e3ZxBMn9tXR+nkPThA== dependencies: "@types/eslint-scope" "^3.7.0" "@types/estree" "^0.0.45" @@ -7400,7 +7459,7 @@ webpack@^5.3.2: neo-async "^2.6.2" pkg-dir "^4.2.0" schema-utils "^3.0.0" - tapable "^2.0.0" + tapable "^2.1.1" terser-webpack-plugin "^5.0.3" watchpack "^2.0.0" webpack-sources "^2.1.1" @@ -7582,3 +7641,8 @@ yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==