Check for unread notes and messages

This commit is contained in:
Mr. Stallion 2020-11-27 00:12:47 -06:00
parent 4282fa544a
commit 9ff0d2210f
13 changed files with 639 additions and 87 deletions

4
.gitignore vendored
View File

@ -11,3 +11,7 @@ node_modules/
.DS_Store
test.ts

View File

@ -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

View File

@ -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);

View File

@ -98,8 +98,9 @@
<recent-conversations ref="recentDialog"></recent-conversations>
<image-preview ref="imagePreview"></image-preview>
<add-pm-partner ref="addPmPartnerDialog"></add-pm-partner>
<note-status></note-status>
</div>
</template>
</template>/me
<script lang="ts">
import {Component, Hook} from '@f-list/vue-ts';
@ -127,6 +128,7 @@
import ImagePreview from './preview/ImagePreview.vue';
import PrivateConversation = Conversation.PrivateConversation;
import * as _ from 'lodash';
import NoteStatus from '../site/NoteStatus.vue';
const unreadClasses = {
[Conversation.UnreadState.None]: '',
@ -140,7 +142,8 @@
settings: SettingsView, conversation: ConversationView, 'report-dialog': ReportDialog, sidebar: Sidebar,
'user-menu': UserMenu, 'recent-conversations': RecentConversations,
'image-preview': ImagePreview,
'add-pm-partner': PmPartnerAdder
'add-pm-partner': PmPartnerAdder,
'note-status': NoteStatus
}
})
export default class ChatView extends Vue {

View File

@ -7,6 +7,7 @@ import Conversations from './conversations';
import {Channel, Character, Connection, Conversation, Logs, Notifications, Settings, State as StateInterface} from './interfaces';
import { AdCoordinatorGuest } from './ads/ad-coordinator-guest';
import { GeneralSettings } from '../electron/common';
import { SiteSession } from '../site/site-session';
function createBBCodeParser(): BBCodeParser {
const parser = new BBCodeParser();
@ -68,6 +69,7 @@ const data = {
notifications: <Notifications | undefined>undefined,
cache: <CacheManager | undefined>undefined,
adCoordinator: <AdCoordinatorGuest | undefined>undefined,
siteSession: <SiteSession | undefined>undefined,
register<K extends 'characters' | 'conversations' | 'channels'>(module: K, subState: VueState[K]): void {
Vue.set(vue, module, subState);
@ -92,6 +94,7 @@ export function init(
data.notifications = new notificationsClass();
data.cache = new CacheManager();
data.adCoordinator = new AdCoordinatorGuest();
data.siteSession = new SiteSession();
(data.state as any).generalSettings = settings;
@ -117,6 +120,7 @@ export interface Core {
readonly notifications: Notifications
readonly cache: CacheManager
readonly adCoordinator: AdCoordinatorGuest;
readonly siteSession: SiteSession;
watch<T>(getter: (this: VueState) => T, callback: WatchHandler<T>): void
}

View File

@ -3,6 +3,7 @@ import { Character } from '../../site/character_page/interfaces';
import { Message } from '../common';
import { Conversation } from '../interfaces';
import ChannelConversation = Conversation.ChannelConversation;
import { NoteCheckerCount } from '../../site/note-checker';
/**
* 'imagepreview-dismiss': {url: string}
@ -14,6 +15,7 @@ import ChannelConversation = Conversation.ChannelConversation;
* 'channel-ad': {message: Message, channel: Conversation, profile: ComplexCharacter | undefined}
* 'channel-message': {message: Message, channel: Conversation}
* 'select-conversation': { conversation: Conversation }
* 'note-counts-update': {}
*/
@ -39,5 +41,10 @@ export interface SelectConversationEvent extends EventBusEvent {
conversation: Conversation;
}
// tslint:disable-next-line no-empty-interface
export interface NoteCountsUpdate extends EventBusEvent, NoteCheckerCount {}
export const EventBus = new Vue();

View File

@ -320,6 +320,8 @@
try {
if(!this.saveLogin) await keyStore.deletePassword('f-list.net', this.settings.account);
core.siteSession.setCredentials(this.settings.account, this.password);
const data = <{ticket?: string, error: string, characters: {[key: string]: number}, default_character: number}>
(await Axios.post('https://www.f-list.net/json/getApiTicket.php', qs.stringify({
account: this.settings.account, password: this.password, no_friends: true, no_bookmarks: true,

4
electron/yarn.lock Normal file
View File

@ -0,0 +1,4 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1

View File

@ -13,10 +13,12 @@
"@types/node": "^12.12.47",
"@types/node-fetch": "^2.5.7",
"@types/qs": "^6.9.5",
"@types/request-promise": "^4.1.46",
"@types/sortablejs": "^1.10.6",
"@vue/devtools": "^5.3.3",
"any-ascii": "^0.1.7",
"axios": "^0.21.0",
"bluebird": "^3.7.2",
"bootstrap": "^4.5.3",
"copy-webpack-plugin": "^6.2.1",
"css-loader": "^5.0.0",
@ -33,6 +35,8 @@
"qs": "^6.9.4",
"raven-js": "^3.27.2",
"raw-loader": "^4.0.2",
"request": "^2.88.2",
"request-promise": "^4.2.6",
"sass-loader": "^10.0.4",
"sortablejs": "^1.12.0",
"style-loader": "^2.0.0",
@ -48,7 +52,6 @@
},
"dependencies": {
"@cliqz/adblocker-electron": "^1.18.3",
"bluebird": "^3.7.2",
"jquery": "^3.5.1",
"keytar": "^7.0.0",
"node-fetch": "^2.6.1"

172
site/NoteStatus.vue Normal file
View File

@ -0,0 +1,172 @@
<template>
<div id="note-status" :class="{active: hasReports()}">
<div v-for="(report, index) in reports" :key="`report-${index}`" :class="`status-report ${report.type} ${(report.count > 0) && (report.count !== report.dismissedCount) ? 'active': ''}`">
<a :href="report.url">
<span class="count">{{report.count}}</span>
{{ report.title }}
</a>
<a @click="dismissReport(report)" class="dismiss"><i class="fas fa-times-circle"></i></a>
</div>
</div>
</template>
<script lang="ts">
import _ from 'lodash';
import { Component, Hook } from '@f-list/vue-ts';
import Vue from 'vue';
import core from '../chat/core';
import { EventBus } from '../chat/preview/event-bus';
interface ReportState {
type: string;
title: string;
count: number;
dismissedCount: number;
url: string;
}
@Component
export default class NoteStatus extends Vue {
reports: ReportState[] = [
{
type: 'message',
title: 'Messages',
count: 0,
dismissedCount: 0,
url: 'https://www.f-list.net/messages.php'
},
{
type: 'note',
title: 'Notes',
count: 0,
dismissedCount: 0,
url: 'https://www.f-list.net/read_notes.php'
}
]
interval?: any;
callback?: any;
@Hook('mounted')
mounted(): void {
this.processCounts();
this.callback = () => this.processCounts();
EventBus.$on('note-counts-update', this.callback);
}
@Hook('beforeDestroy')
destroying(): void {
EventBus.$off('note-counts-update', this.callback);
}
dismissReport(report: ReportState): void {
report.dismissedCount = report.count;
}
hasReports(): boolean {
return !!_.find(this.reports, (r) => ((r.count > 0) && (r.dismissedCount !== r.count)));
}
processCounts() {
const v = core.siteSession.interfaces.notes.getCounts();
const mapper = {
message: 'unreadMessages',
note: 'unreadNotes'
}
_.each(
mapper,
(field, type) => {
const report = _.find(this.reports, (r) => r.type === type);
if (!report) {
throw new Error(`Did not find report ${type}`);
}
const count = (v as any)[field] as number;
if (count !== report.dismissedCount) {
report.dismissedCount = 0;
}
report.count = count;
}
);
}
}
</script>
<style lang="scss">
#note-status {
position: absolute;
right: 3em;
bottom: 0;
z-index: 1000;
opacity: 0;
transition: all 0.25s;
border: 1px solid var(--input-color);
background-color: var(--input-bg);
padding: 0;
border-radius: 3px;
&.active {
opacity: 1;
right: 0;
}
.status-report {
display: none;
text-align: center;
text-transform: uppercase;
font-size: 10pt;
padding: 0;
&.active {
display: block;
}
a {
padding: 5px;
padding-bottom: 3px;
display: block;
}
a:hover {
text-decoration: none;
background-color: var(--secondary);
}
.count {
font-size: 30pt;
display: block;
line-height: 80%;
padding: 0;
margin: 0;
}
.dismiss {
position: absolute;
top: -0.4rem;
right: -0.4rem;
background-color: var(--input-bg);
border-radius: 8px;
margin: 0;
padding: 0;
line-height: 0;
}
}
}
</style>

85
site/note-checker.ts Normal file
View File

@ -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<void> {
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<void> {
if (this.timer) {
clearInterval(this.timer);
delete this.timer;
}
this.latestCount = { unreadNotes: 0, unreadMessages: 0, onlineUsers: 0 };
}
private async check(): Promise<NoteCheckerCount> {
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;
}
}

201
site/site-session.ts Normal file
View File

@ -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<void>;
stop(): Promise<void>;
}
export interface SiteSessionInterfaceCollection extends Record<string, SiteSessionInterface> {
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<void> {
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<void> {
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<void> {
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(/<input.*?csrf_token.*?>/);
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<void> {
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<void> {
if (this.state !== 'active') {
throw new Error('Site session not active');
}
}
private async prepareRequest(
method: string,
uri: string,
mustBeLoggedIn: boolean,
config: Partial<request.Options>
): Promise<request.OptionsWithUri> {
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<request.Options> = {}): Promise<request.RequestPromise> {
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<string, any>,
mustBeLoggedIn: boolean = false,
config: Partial<request.Options> = {}
): Promise<request.RequestPromise> {
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<void> {
await this.stop();
}
async onConnectionEstablished(): Promise<void> {
await this.start();
}
}

230
yarn.lock
View File

@ -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==