From 9d41c9e3d6b6eb73aedc2cce82459e72139d8fcf Mon Sep 17 00:00:00 2001 From: Zef Hemel Date: Mon, 14 Mar 2022 18:06:28 +0100 Subject: [PATCH] Giant refactor --- .DS_Store | Bin 10244 -> 10244 bytes server/jest.config.js | 12 + server/package.json | 19 +- server/page_index | 0 server/src/api.test.ts | 91 + server/src/api.ts | 540 +++-- server/src/disk_storage.ts | 68 +- server/src/server.ts | 27 +- server/src/types.ts | 8 +- server/yarn.lock | 2680 ++++++++++++++++++++++++- webapp/package.json | 7 +- webapp/src/boot.ts | 13 +- webapp/src/editor.tsx | 12 +- webapp/src/images/logo.png | Bin 56731 -> 67362 bytes webapp/src/index.html | 2 +- webapp/src/indexer.ts | 119 +- webapp/src/manifest.json | 6 +- webapp/src/service_worker.ts | 17 + webapp/src/space.ts | 61 +- webapp/src/styles/editor.scss | 3 +- webapp/src/syscalls/indexer.native.ts | 16 +- webapp/src/syscalls/space.native.ts | 2 +- 22 files changed, 3268 insertions(+), 435 deletions(-) create mode 100644 server/jest.config.js create mode 100644 server/page_index create mode 100644 server/src/api.test.ts create mode 100644 webapp/src/service_worker.ts diff --git a/.DS_Store b/.DS_Store index b25b8769a58afd36912a005d6cc4098026a206c2..bc9d07248b8b648ec89ce814c6f1e56a24ae75f3 100644 GIT binary patch delta 49 zcmZn(XbIS$C%~k&d9s0k0!PJcqxAXj4?6-mVw3X(xY!^9lj{Uj7!x)x7DyBa0JM}5 AcK`qY delta 49 zcmZn(XbIS$C%`1VaI%4b0>_EoiklOj9d-nA#3ttnaIrxICf5n5Fa~U1ERZM;0NE`Q A3IG5A diff --git a/server/jest.config.js b/server/jest.config.js new file mode 100644 index 00000000..796ee81f --- /dev/null +++ b/server/jest.config.js @@ -0,0 +1,12 @@ +export default { + extensionsToTreatAsEsm: [".ts"], + preset: "ts-jest/presets/default-esm", // or other ESM presets + globals: { + "ts-jest": { + useESM: true, + }, + }, + moduleNameMapper: { + "^(\\.{1,2}/.*)\\.js$": "$1", + }, +}; diff --git a/server/package.json b/server/package.json index 5980fa2e..dcdb71e9 100644 --- a/server/package.json +++ b/server/package.json @@ -4,25 +4,34 @@ "license": "MIT", "source": "src/server.ts", "main": "dist/server.js", + "type": "module", "scripts": { "build": "parcel build", - "watch": "parcel watch", - "start": "node dist/server.js", - "nodemon": "nodemon dist/server.js" + "watch": "parcel watch --no-cache", + "start": "node dist/server.js ../pages", + "nodemon": "nodemon dist/server.js ../pages", + "test": "jest" }, "dependencies": { "@codemirror/collab": "^0.19.0", "@codemirror/state": "^0.19.9", + "@vscode/sqlite3": "^5.0.7", + "better-sqlite3": "^7.5.0", "body-parser": "^1.19.2", "cors": "^2.8.5", "express": "^4.17.3", + "knex": "^1.0.4", "socket.io": "^4.4.1", - "typescript": "^4.6.2" + "socket.io-client": "^4.4.1", + "typescript": "^4.6.2", + "yargs": "^17.3.1" }, "devDependencies": { "@types/cors": "^2.8.12", "@types/express": "^4.17.13", + "jest": "^27.5.1", "nodemon": "^2.0.15", - "parcel": "^2.3.2" + "parcel": "^2.3.2", + "ts-jest": "^27.1.3" } } diff --git a/server/page_index b/server/page_index new file mode 100644 index 00000000..e69de29b diff --git a/server/src/api.test.ts b/server/src/api.test.ts new file mode 100644 index 00000000..471ec26e --- /dev/null +++ b/server/src/api.test.ts @@ -0,0 +1,91 @@ +import { test, expect, beforeAll, afterAll, describe } from "@jest/globals"; + +import { createServer } from "http"; +import { io as Client } from "socket.io-client"; +import { Server } from "socket.io"; +import { SocketServer } from "./api"; +import * as path from "path"; +import * as fs from "fs"; + +describe("Server test", () => { + let io, + socketServer: SocketServer, + cleaner, + clientSocket, + reqId = 0; + const tmpDir = path.join(__dirname, "test"); + + function wsCall(eventName: string, ...args: any[]): Promise { + return new Promise((resolve, reject) => { + reqId++; + clientSocket.once(`${eventName}Resp${reqId}`, (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + }); + clientSocket.emit(eventName, reqId, ...args); + }); + } + + beforeAll((done) => { + const httpServer = createServer(); + io = new Server(httpServer); + fs.mkdirSync(tmpDir, { recursive: true }); + fs.writeFileSync(`${tmpDir}/test.md`, "This is a simple test"); + httpServer.listen(async () => { + // @ts-ignore + const port = httpServer.address().port; + // @ts-ignore + clientSocket = new Client(`http://localhost:${port}`); + socketServer = new SocketServer(tmpDir, io); + clientSocket.on("connect", done); + }); + }); + + afterAll(() => { + io.close(); + clientSocket.close(); + socketServer.close(); + fs.rmSync(tmpDir, { recursive: true, force: true }); + }); + + test("List pages", async () => { + let pages = await wsCall("listPages"); + console.log(pages); + expect(pages.length).toBe(1); + }); + + test("Index operations", async () => { + await wsCall("index:clearPageIndexForPage", "test"); + await wsCall("index:set", "test", "testkey", "value"); + expect(await wsCall("index:get", "test", "testkey")).toBe("value"); + await wsCall("index:delete", "test", "testkey"); + expect(await wsCall("index:get", "test", "testkey")).toBe(null); + await wsCall("index:set", "test", "unrelated", 10); + await wsCall("index:set", "test", "unrelated", 12); + await wsCall("index:set", "test2", "complicated", { + name: "Bla", + age: 123123, + }); + await wsCall("index:set", "test", "complicated", { name: "Bla", age: 100 }); + await wsCall("index:set", "test", "complicated2", { + name: "Bla", + age: 101, + }); + expect(await wsCall("index:get", "test", "complicated")).toStrictEqual({ + name: "Bla", + age: 100, + }); + let result = await wsCall("index:scanPrefixForPage", "test", "compli"); + expect(result.length).toBe(2); + let result2 = await wsCall("index:scanPrefixGlobal", "compli"); + expect(result2.length).toBe(3); + await wsCall("index:deletePrefixForPage", "test", "compli"); + let result3 = await wsCall("index:scanPrefixForPage", "test", "compli"); + expect(result3.length).toBe(0); + let result4 = await wsCall("index:scanPrefixGlobal", "compli"); + expect(result4.length).toBe(1); + }); +}); diff --git a/server/src/api.ts b/server/src/api.ts index 43515e86..23df8f62 100644 --- a/server/src/api.ts +++ b/server/src/api.ts @@ -1,229 +1,376 @@ -import fs from "fs"; import { stat } from "fs/promises"; -import path from "path"; import { ChangeSet } from "@codemirror/state"; import { Update } from "@codemirror/collab"; import { Server } from "socket.io"; import { Cursor, cursorEffect } from "../../webapp/src/cursorEffect"; import { Socket } from "socket.io"; import { DiskStorage } from "./disk_storage"; -import { PageMeta } from "./server"; -import { ClientPageState, Page } from "./types"; +import { ClientPageState, Page, PageMeta } from "./types"; import { safeRun } from "./util"; +import * as fs from "fs"; +import * as path from "path"; +import knex, { Knex } from "knex"; -export function exposeSocketAPI(rootPath: string, io: Server) { - const openPages = new Map(); - const connectedSockets: Set = new Set(); - const pageStore = new DiskStorage(rootPath); - fileWatcher(rootPath); +type IndexItem = { + page: string; + key: string; + value: any; +}; - io.on("connection", (socket) => { - const socketOpenPages = new Set(); +class ClientConnection { + openPages = new Set(); + constructor(readonly sock: Socket) {} +} - console.log("Connected", socket.id); - connectedSockets.add(socket); +export class SocketServer { + rootPath: string; + serverSock: Server; + openPages = new Map(); + connectedSockets = new Set(); + pageStore: DiskStorage; + db: Knex; + serverSocket: Server; - socket.on("disconnect", () => { - console.log("Disconnected", socket.id); - socketOpenPages.forEach(disconnectPageSocket); - connectedSockets.delete(socket); - }); - - socket.on("closePage", (pageName: string) => { - console.log("Closing page", pageName); - socketOpenPages.delete(pageName); - disconnectPageSocket(pageName); - }); - - const onCall = ( - eventName: string, - cb: (...args: any[]) => Promise - ) => { - socket.on(eventName, (reqId: number, ...args) => { - cb(...args).then((result) => { - socket.emit(`${eventName}Resp${reqId}`, result); - }); - }); - }; - - const disconnectPageSocket = (pageName: string) => { - let page = openPages.get(pageName); - if (page) { - for (let client of page.clientStates) { - if (client.socket === socket) { - disconnectClient(client, page); - } - } - } - }; - - onCall("openPage", async (pageName: string) => { - let page = openPages.get(pageName); + api = { + openPage: async (clientConn: ClientConnection, pageName: string) => { + let page = this.openPages.get(pageName); if (!page) { try { - let { text, meta } = await pageStore.readPage(pageName); + let { text, meta } = await this.pageStore.readPage(pageName); page = new Page(pageName, text, meta); } catch (e) { console.log("Creating new page", pageName); page = new Page(pageName, "", { name: pageName, lastModified: 0 }); } - openPages.set(pageName, page); + this.openPages.set(pageName, page); } - page.clientStates.add(new ClientPageState(socket, page.version)); - socketOpenPages.add(pageName); + page.clientStates.add(new ClientPageState(clientConn.sock, page.version)); + clientConn.openPages.add(pageName); console.log("Opened page", pageName); - broadcastCursors(page); + this.broadcastCursors(page); return page.toJSON(); - }); + }, + pushUpdates: async ( + clientConn: ClientConnection, + pageName: string, + version: number, + updates: any[] + ): Promise => { + let page = this.openPages.get(pageName); - onCall( - "pushUpdates", - async ( - pageName: string, - version: number, - updates: any[] - ): Promise => { - let page = openPages.get(pageName); - - if (!page) { - console.error( - "Received updates for not open page", - pageName, - openPages.keys() - ); - return false; - } - if (version !== page.version) { - console.error("Invalid version", version, page.version); - return false; - } else { - console.log("Applying", updates.length, "updates to", pageName); - let transformedUpdates = []; - let textChanged = false; - for (let update of updates) { - let changes = ChangeSet.fromJSON(update.changes); - let transformedUpdate = { - changes, - clientID: update.clientID, - effects: update.cursors?.map((c: Cursor) => { - page.cursors.set(c.userId, c); - return cursorEffect.of(c); - }), - }; - page.updates.push(transformedUpdate); - transformedUpdates.push(transformedUpdate); - let oldText = page.text; - page.text = changes.apply(page.text); - if (oldText !== page.text) { - textChanged = true; - } - } - - if (textChanged) { - if (page.saveTimer) { - clearTimeout(page.saveTimer); - } - - page.saveTimer = setTimeout(() => { - flushPageToDisk(pageName, page); - }, 1000); - } - while (page.pending.length) { - page.pending.pop()!(transformedUpdates); - } - return true; - } + if (!page) { + console.error( + "Received updates for not open page", + pageName, + this.openPages.keys() + ); + return false; } - ); - - onCall( - "pullUpdates", - async (pageName: string, version: number): Promise => { - let page = openPages.get(pageName); - // console.log("Pulling updates for", pageName); - if (!page) { - console.error("Fetching updates for not open page"); - return []; - } - // TODO: Optimize this - let oldestVersion = Infinity; - page.clientStates.forEach((client) => { - oldestVersion = Math.min(client.version, oldestVersion); - if (client.socket === socket) { - client.version = version; - } - }); - page.flushUpdates(oldestVersion); - if (version < page.version) { - return page.updatesSince(version); - } else { - return new Promise((resolve) => { - page.pending.push(resolve); - }); - } - } - ); - - onCall( - "readPage", - async (pageName: string): Promise<{ text: string; meta: PageMeta }> => { - let page = openPages.get(pageName); - if (page) { - console.log("Serving page from memory", pageName); - return { - text: page.text.sliceString(0), - meta: page.meta, + if (version !== page.version) { + console.error("Invalid version", version, page.version); + return false; + } else { + console.log("Applying", updates.length, "updates to", pageName); + let transformedUpdates = []; + let textChanged = false; + for (let update of updates) { + let changes = ChangeSet.fromJSON(update.changes); + let transformedUpdate = { + changes, + clientID: update.clientID, + effects: update.cursors?.map((c: Cursor) => { + page.cursors.set(c.userId, c); + return cursorEffect.of(c); + }), }; - } else { - return pageStore.readPage(pageName); + page.updates.push(transformedUpdate); + transformedUpdates.push(transformedUpdate); + let oldText = page.text; + page.text = changes.apply(page.text); + if (oldText !== page.text) { + textChanged = true; + } } - } - ); - onCall("writePage", async (pageName: string, text: string) => { - let page = openPages.get(pageName); + if (textChanged) { + if (page.saveTimer) { + clearTimeout(page.saveTimer); + } + + page.saveTimer = setTimeout(() => { + this.flushPageToDisk(pageName, page); + }, 1000); + } + while (page.pending.length) { + page.pending.pop()!(transformedUpdates); + } + return true; + } + }, + + pullUpdates: async ( + clientConn: ClientConnection, + pageName: string, + version: number + ): Promise => { + let page = this.openPages.get(pageName); + // console.log("Pulling updates for", pageName); + if (!page) { + console.error("Fetching updates for not open page"); + return []; + } + // TODO: Optimize this + let oldestVersion = Infinity; + page.clientStates.forEach((client) => { + oldestVersion = Math.min(client.version, oldestVersion); + if (client.socket === clientConn.sock) { + client.version = version; + } + }); + page.flushUpdates(oldestVersion); + if (version < page.version) { + return page.updatesSince(version); + } else { + return new Promise((resolve) => { + page.pending.push(resolve); + }); + } + }, + + readPage: async ( + clientConn: ClientConnection, + pageName: string + ): Promise<{ text: string; meta: PageMeta }> => { + let page = this.openPages.get(pageName); + if (page) { + console.log("Serving page from memory", pageName); + return { + text: page.text.sliceString(0), + meta: page.meta, + }; + } else { + return this.pageStore.readPage(pageName); + } + }, + + writePage: async ( + clientConn: ClientConnection, + pageName: string, + text: string + ) => { + let page = this.openPages.get(pageName); if (page) { for (let client of page.clientStates) { client.socket.emit("reloadPage", pageName); } - openPages.delete(pageName); + this.openPages.delete(pageName); } - return pageStore.writePage(pageName, text); - }); + return this.pageStore.writePage(pageName, text); + }, - onCall("deletePage", async (pageName: string) => { - openPages.delete(pageName); - socketOpenPages.delete(pageName); + deletePage: async (clientConn: ClientConnection, pageName: string) => { + this.openPages.delete(pageName); + clientConn.openPages.delete(pageName); // Cascading of this to all connected clients will be handled by file watcher - return pageStore.deletePage(pageName); - }); + return this.pageStore.deletePage(pageName); + }, - onCall("listPages", async (): Promise => { - return pageStore.listPages(); - }); + listPages: async (clientConn: ClientConnection): Promise => { + return this.pageStore.listPages(); + }, - onCall("getPageMeta", async (pageName: string): Promise => { - let page = openPages.get(pageName); + getPageMeta: async ( + clientConn: ClientConnection, + pageName: string + ): Promise => { + let page = this.openPages.get(pageName); if (page) { return page.meta; } - return pageStore.getPageMeta(pageName); - }); - }); + return this.pageStore.getPageMeta(pageName); + }, - function disconnectClient(client: ClientPageState, page: Page) { - page.clientStates.delete(client); - if (page.clientStates.size === 0) { - console.log("No more clients for", page.name, "flushing"); - flushPageToDisk(page.name, page); - openPages.delete(page.name); - } else { - page.cursors.delete(client.socket.id); - broadcastCursors(page); + "index:clearPageIndexForPage": async ( + clientConn: ClientConnection, + page: string + ) => { + await this.db("page_index").where({ page }).del(); + }, + "index:set": async ( + clientConn: ClientConnection, + page: string, + key: string, + value: any + ) => { + let changed = await this.db("page_index") + .where({ page, key }) + .update("value", JSON.stringify(value)); + if (changed === 0) { + await this.db("page_index").insert({ + page, + key, + value: JSON.stringify(value), + }); + } + }, + "index:get": async ( + clientConn: ClientConnection, + page: string, + key: string + ) => { + let result = await this.db("page_index") + .where({ page, key }) + .select("value"); + if (result.length) { + return JSON.parse(result[0].value); + } else { + return null; + } + }, + "index:delete": async ( + clientConn: ClientConnection, + page: string, + key: string + ) => { + await this.db("page_index").where({ page, key }).del(); + }, + "index:scanPrefixForPage": async ( + clientConn: ClientConnection, + page: string, + prefix: string + ) => { + return ( + await this.db("page_index") + .where({ page }) + .andWhereLike("key", `${prefix}%`) + .select("page", "key", "value") + ).map(({ page, key, value }) => ({ + page, + key, + value: JSON.parse(value), + })); + }, + "index:scanPrefixGlobal": async ( + clientConn: ClientConnection, + prefix: string + ) => { + return ( + await this.db("page_index") + .andWhereLike("key", `${prefix}%`) + .select("page", "key", "value") + ).map(({ page, key, value }) => ({ + page, + key, + value: JSON.parse(value), + })); + }, + "index:deletePrefixForPage": async ( + clientConn: ClientConnection, + page: string, + prefix: string + ) => { + return await this.db("page_index") + .where({ page }) + .andWhereLike("key", `${prefix}%`) + .del(); + }, + + "index:clearPageIndex": async (clientConn: ClientConnection) => { + return await this.db("page_index").del(); + }, + }; + + constructor(rootPath: string, serverSocket: Server) { + this.rootPath = path.resolve(rootPath); + this.serverSocket = serverSocket; + this.pageStore = new DiskStorage(this.rootPath); + + this.db = knex({ + client: "better-sqlite3", + connection: { + filename: path.join(rootPath, "data.db"), + }, + useNullAsDefault: true, + }); + this.initDb(); + + serverSocket.on("connection", (socket) => { + const clientConn = new ClientConnection(socket); + // const socketOpenPages = new Set(); + + console.log("Connected", socket.id); + this.connectedSockets.add(socket); + + socket.on("disconnect", () => { + console.log("Disconnected", socket.id); + clientConn.openPages.forEach(disconnectPageSocket); + this.connectedSockets.delete(socket); + }); + + socket.on("closePage", (pageName: string) => { + console.log("Closing page", pageName); + clientConn.openPages.delete(pageName); + disconnectPageSocket(pageName); + }); + + const onCall = ( + eventName: string, + cb: (...args: any[]) => Promise + ) => { + socket.on(eventName, (reqId: number, ...args) => { + cb(...args) + .then((result) => { + socket.emit(`${eventName}Resp${reqId}`, null, result); + }) + .catch((err) => { + socket.emit(`${eventName}Resp${reqId}`, err.message); + }); + }); + }; + + const disconnectPageSocket = (pageName: string) => { + let page = this.openPages.get(pageName); + if (page) { + for (let client of page.clientStates) { + if (client.socket === socket) { + this.disconnectClient(client, page); + } + } + } + }; + Object.entries(this.api).forEach(([eventName, cb]) => { + onCall(eventName, (...args: any[]): any => { + return cb.call(this, clientConn, ...args); + }); + }); + }); + } + + async initDb() { + if (!(await this.db.schema.hasTable("page_index"))) { + await this.db.schema.createTable("page_index", (table) => { + table.string("page"); + table.string("key"); + table.text("value"); + table.primary(["page", "key"]); + }); + console.log("Created table page_index"); } } - function broadcastCursors(page: Page) { + disconnectClient(client: ClientPageState, page: Page) { + page.clientStates.delete(client); + if (page.clientStates.size === 0) { + console.log("No more clients for", page.name, "flushing"); + this.flushPageToDisk(page.name, page); + this.openPages.delete(page.name); + } else { + page.cursors.delete(client.socket.id); + this.broadcastCursors(page); + } + } + + broadcastCursors(page: Page) { page.clientStates.forEach((client) => { client.socket.emit( "cursorSnapshot", @@ -233,27 +380,27 @@ export function exposeSocketAPI(rootPath: string, io: Server) { }); } - function flushPageToDisk(name: string, page: Page) { + flushPageToDisk(name: string, page: Page) { safeRun(async () => { - let meta = await pageStore.writePage(name, page.text.sliceString(0)); + let meta = await this.pageStore.writePage(name, page.text.sliceString(0)); console.log(`Wrote page ${name} to disk`); page.meta = meta; }); } - function fileWatcher(rootPath: string) { + fileWatcher() { fs.watch( - rootPath, + this.rootPath, { recursive: true, persistent: false, }, (eventType, filename) => { safeRun(async () => { - if (path.extname(filename) !== ".md") { + if (!filename.endsWith(".md")) { return; } - let localPath = path.join(rootPath, filename); + let localPath = path.join(this.rootPath, filename); let pageName = filename.substring(0, filename.length - 3); // console.log("Edit in", pageName, eventType); let modifiedTime = 0; @@ -263,16 +410,16 @@ export function exposeSocketAPI(rootPath: string, io: Server) { } catch (e) { // File was deleted console.log("Deleted", pageName); - for (let socket of connectedSockets) { + for (let socket of this.connectedSockets) { socket.emit("pageDeleted", pageName); } return; } - const openPage = openPages.get(pageName); + const openPage = this.openPages.get(pageName); if (openPage) { if (openPage.meta.lastModified < modifiedTime) { console.log("Page changed on disk outside of editor, reloading"); - openPages.delete(pageName); + this.openPages.delete(pageName); const meta = { name: pageName, lastModified: modifiedTime, @@ -285,9 +432,10 @@ export function exposeSocketAPI(rootPath: string, io: Server) { if (eventType === "rename") { // This most likely means a new file was created, let's push new file listings to all connected sockets console.log( - "New file created, broadcasting to all connected sockets" + "New file created, broadcasting to all connected sockets", + pageName ); - for (let socket of connectedSockets) { + for (let socket of this.connectedSockets) { socket.emit("pageCreated", { name: pageName, lastModified: modifiedTime, @@ -298,4 +446,8 @@ export function exposeSocketAPI(rootPath: string, io: Server) { } ); } + + close() { + this.db.destroy(); + } } diff --git a/server/src/disk_storage.ts b/server/src/disk_storage.ts index ba29a702..6014eccf 100644 --- a/server/src/disk_storage.ts +++ b/server/src/disk_storage.ts @@ -1,6 +1,6 @@ import { readdir, readFile, stat, unlink, writeFile } from "fs/promises"; -import path from "path"; -import { PageMeta, pagesPath } from "./server"; +import * as path from "path"; +import { PageMeta } from "./types"; export class DiskStorage { rootPath: string; @@ -37,41 +37,55 @@ export class DiskStorage { } async readPage(pageName: string): Promise<{ text: string; meta: PageMeta }> { - const localPath = path.join(pagesPath, pageName + ".md"); - const s = await stat(localPath); - return { - text: await readFile(localPath, "utf8"), - meta: { - name: pageName, - lastModified: s.mtime.getTime(), - }, - }; + const localPath = path.join(this.rootPath, pageName + ".md"); + try { + const s = await stat(localPath); + return { + text: await readFile(localPath, "utf8"), + meta: { + name: pageName, + lastModified: s.mtime.getTime(), + }, + }; + } catch (e) { + // console.error("Error while writing page", pageName, e); + throw Error(`Could not read page ${pageName}`); + } } async writePage(pageName: string, text: string): Promise { - let localPath = path.join(pagesPath, pageName + ".md"); - // await pipeline(body, fs.createWriteStream(localPath)); - await writeFile(localPath, text); + let localPath = path.join(this.rootPath, pageName + ".md"); + try { + await writeFile(localPath, text); - // console.log(`Wrote to ${localPath}`); - const s = await stat(localPath); - return { - name: pageName, - lastModified: s.mtime.getTime(), - }; + // console.log(`Wrote to ${localPath}`); + const s = await stat(localPath); + return { + name: pageName, + lastModified: s.mtime.getTime(), + }; + } catch (e) { + console.error("Error while writing page", pageName, e); + throw Error(`Could not write ${pageName}`); + } } async getPageMeta(pageName: string): Promise { - let localPath = path.join(pagesPath, pageName + ".md"); - const s = await stat(localPath); - return { - name: pageName, - lastModified: s.mtime.getTime(), - }; + let localPath = path.join(this.rootPath, pageName + ".md"); + try { + const s = await stat(localPath); + return { + name: pageName, + lastModified: s.mtime.getTime(), + }; + } catch (e) { + console.error("Error while getting page meta", pageName, e); + throw Error(`Could not get meta for ${pageName}`); + } } async deletePage(pageName: string) { - let localPath = path.join(pagesPath, pageName + ".md"); + let localPath = path.join(this.rootPath, pageName + ".md"); await unlink(localPath); } } diff --git a/server/src/server.ts b/server/src/server.ts index 6dd0b9f8..5dd11e43 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -2,7 +2,19 @@ import express from "express"; import { readFile } from "fs/promises"; import http from "http"; import { Server } from "socket.io"; -import { exposeSocketAPI } from "./api"; +import { SocketServer } from "./api"; +import yargs from "yargs"; +import { hideBin } from "yargs/helpers"; + +let args = yargs(hideBin(process.argv)) + .option("debug", { + type: "boolean", + }) + .option("port", { + type: "number", + default: 3000, + }) + .parse(); const app = express(); const server = http.createServer(app); @@ -13,18 +25,11 @@ const io = new Server(server, { }, }); -const port = 3000; -export const pagesPath = "../pages"; +const port = args.port; const distDir = `${__dirname}/../../webapp/dist`; -export type PageMeta = { - name: string; - lastModified: number; - version?: number; -}; - app.use("/", express.static(distDir)); -exposeSocketAPI(pagesPath, io); +let socketServer = new SocketServer(args._[0] as string, io); // Fallback, serve index.html let cachedIndex: string | undefined = undefined; @@ -36,5 +41,5 @@ app.get("/*", async (req, res) => { }); server.listen(port, () => { - console.log(`Server istening on port ${port}`); + console.log(`Server listening on port ${port}`); }); diff --git a/server/src/types.ts b/server/src/types.ts index a79ff160..d685ad71 100644 --- a/server/src/types.ts +++ b/server/src/types.ts @@ -2,12 +2,16 @@ import { Update } from "@codemirror/collab"; import { Text } from "@codemirror/state"; import { Socket } from "socket.io"; import { Cursor } from "../../webapp/src/cursorEffect"; -import { PageMeta } from "./server"; - export class ClientPageState { constructor(public socket: Socket, public version: number) {} } +export type PageMeta = { + name: string; + lastModified: number; + version?: number; +}; + export class Page { versionOffset = 0; updates: Update[] = []; diff --git a/server/yarn.lock b/server/yarn.lock index a454af4e..5bed0008 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -2,18 +2,154 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0": +"@ampproject/remapping@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" + integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== + dependencies: + "@jridgewell/trace-mapping" "^0.3.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== dependencies: "@babel/highlight" "^7.16.7" +"@babel/compat-data@^7.16.4": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.0.tgz#86850b8597ea6962089770952075dcaabb8dba34" + integrity sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng== + +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": + version "7.17.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.5.tgz#6cd2e836058c28f06a4ca8ee7ed955bbf37c8225" + integrity sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.3" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helpers" "^7.17.2" + "@babel/parser" "^7.17.3" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + +"@babel/generator@^7.17.3", "@babel/generator@^7.7.2": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.3.tgz#a2c30b0c4f89858cb87050c3ffdfd36bdf443200" + integrity sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg== + dependencies: + "@babel/types" "^7.17.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-compilation-targets@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" + integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== + dependencies: + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-transforms@^7.16.7": + version "7.17.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz#3c3b03cc6617e33d68ef5a27a67419ac5199ccd0" + integrity sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + +"@babel/helper-simple-access@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" + integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-validator-identifier@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helpers@^7.17.2": + version "7.17.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.2.tgz#23f0a0746c8e287773ccd27c14be428891f63417" + integrity sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.0" + "@babel/types" "^7.17.0" + "@babel/highlight@^7.16.7": version "7.16.10" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" @@ -23,6 +159,140 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.3.tgz#b07702b982990bf6fdc1da5049a23fece4c5c3d0" + integrity sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" + integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/template@^7.16.7", "@babel/template@^7.3.3": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.17.0", "@babel/traverse@^7.17.3", "@babel/traverse@^7.7.2": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57" + integrity sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.3" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.17.3" + "@babel/types" "^7.17.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" + integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + "@codemirror/collab@^0.19.0": version "0.19.0" resolved "https://registry.yarnpkg.com/@codemirror/collab/-/collab-0.19.0.tgz#43938671d58ef8f12e43406ddd315410d85ac1c4" @@ -42,6 +312,209 @@ resolved "https://registry.yarnpkg.com/@codemirror/text/-/text-0.19.6.tgz#9adcbd8137f69b75518eacd30ddb16fd67bbac45" integrity sha512-T9jnREMIygx+TPC1bOuepz18maGq/92q2a+n4qTqObKwvNMg+8cMTslb8yxeEDEq7S3kpgGWxgO1UWbQRij0dA== +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" + integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + +"@jest/core@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" + integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/reporters" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.8.1" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^27.5.1" + jest-config "^27.5.1" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-resolve-dependencies "^27.5.1" + jest-runner "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + jest-watcher "^27.5.1" + micromatch "^4.0.4" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" + integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== + dependencies: + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + +"@jest/fake-timers@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" + integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== + dependencies: + "@jest/types" "^27.5.1" + "@sinonjs/fake-timers" "^8.0.1" + "@types/node" "*" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +"@jest/globals@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" + integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/types" "^27.5.1" + expect "^27.5.1" + +"@jest/reporters@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" + integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-haste-map "^27.5.1" + jest-resolve "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^8.1.0" + +"@jest/source-map@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" + integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.9" + source-map "^0.6.0" + +"@jest/test-result@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" + integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== + dependencies: + "@jest/console" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" + integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== + dependencies: + "@jest/test-result" "^27.5.1" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-runtime "^27.5.1" + +"@jest/transform@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" + integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^27.5.1" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-regex-util "^27.5.1" + jest-util "^27.5.1" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" + integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.11" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" + integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== + +"@jridgewell/trace-mapping@^0.3.0": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" + integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@parcel/bundler-default@2.3.2": version "2.3.2" resolved "https://registry.yarnpkg.com/@parcel/bundler-default/-/bundler-default-2.3.2.tgz#329f171e210dfb22beaa52ae706ccde1dae384c1" @@ -599,11 +1072,30 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== +"@sinonjs/commons@^1.7.0": + version "1.8.3" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@socket.io/base64-arraybuffer@~1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#568d9beae00b0d835f4f8c53fd55714986492e61" integrity sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ== +"@socket.io/component-emitter@~3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz#8863915676f837d9dad7b76f50cb500c1e9422e9" + integrity sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q== + "@swc/helpers@^0.2.11": version "0.2.14" resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.2.14.tgz#20288c3627442339dd3d743c944f7043ee3590f0" @@ -616,11 +1108,49 @@ dependencies: defer-to-connect "^1.0.1" +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": + version "7.1.18" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8" + integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" + integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== + dependencies: + "@babel/types" "^7.3.0" + "@types/body-parser@*": version "1.19.2" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" @@ -670,6 +1200,32 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/graceful-fs@^4.1.2": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + "@types/mime@^1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" @@ -685,6 +1241,11 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/prettier@^2.1.5": + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.4.tgz#5d9b63132df54d8909fce1c3f8ca260fdd693e17" + integrity sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA== + "@types/qs@*": version "6.9.7" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" @@ -703,6 +1264,35 @@ "@types/mime" "^1" "@types/node" "*" +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^16.0.0": + version "16.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" + integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== + dependencies: + "@types/yargs-parser" "*" + +"@vscode/sqlite3@^5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@vscode/sqlite3/-/sqlite3-5.0.7.tgz#358df36bb0e9e735c54785e3e4b9b2dce1d32895" + integrity sha512-NlsOf+Hir2r4zopI1qMvzWXPwPJuFscirkmFTniTAT24Yz2FWcyZxzK7UT8iSNiTqOCPz48yF55ZVHaz7tTuVQ== + dependencies: + node-addon-api "^4.2.0" + +abab@^2.0.3, abab@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -721,11 +1311,36 @@ accepts@~1.3.4, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn@^8.5.0: +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.2.4, acorn@^8.5.0: version "8.7.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + ansi-align@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" @@ -733,6 +1348,18 @@ ansi-align@^3.0.0: dependencies: string-width "^4.1.0" +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -752,7 +1379,12 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -anymatch@~3.1.2: +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== @@ -760,11 +1392,102 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +babel-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" + integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== + dependencies: + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" + integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" + integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== + dependencies: + babel-plugin-jest-hoist "^27.5.1" + babel-preset-current-node-syntax "^1.0.0" + +backo2@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -777,16 +1500,45 @@ base-x@^3.0.8: dependencies: safe-buffer "^5.0.1" +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + base64id@2.0.0, base64id@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== +better-sqlite3@^7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-7.5.0.tgz#2a91cb616453f002096743b0e5b66a7021cd1c63" + integrity sha512-6FdG9DoytYGDhLW7VWW1vxjEz7xHkqK6LnaUQYA8d6GHNgZhu9PFX2xwKEEnSBRoT1J4PjTUPeg217ShxNmuPg== + dependencies: + bindings "^1.5.0" + prebuild-install "^7.0.0" + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + body-parser@1.19.2, body-parser@^1.19.2: version "1.19.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" @@ -830,13 +1582,18 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@~3.0.2: +braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + browserslist@^4.0.0, browserslist@^4.16.6, browserslist@^4.6.6: version "4.19.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.3.tgz#29b7caad327ecf2859485f696f9604214bedd383" @@ -848,11 +1605,44 @@ browserslist@^4.0.0, browserslist@^4.16.6, browserslist@^4.6.6: node-releases "^2.0.2" picocolors "^1.0.0" +browserslist@^4.17.5: + version "4.20.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.0.tgz#35951e3541078c125d36df76056e94738a52ebe9" + integrity sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ== + dependencies: + caniuse-lite "^1.0.30001313" + electron-to-chromium "^1.4.76" + escalade "^3.1.1" + node-releases "^2.0.2" + picocolors "^1.0.0" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -876,6 +1666,11 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" @@ -896,6 +1691,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001312: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001313.tgz#a380b079db91621e1b7120895874e2fd62ed2e2f" integrity sha512-rI1UN0koZUiKINjysQDuRi2VeSCce3bYJNmDcj3PIKREiAmjakugBul1QSkg/fPrlULYl6oWfGg3PbgOSY9X4Q== +caniuse-lite@^1.0.30001313: + version "1.0.30001316" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001316.tgz#b44a1f419f82d2e119aa0bbdab5ec15471796358" + integrity sha512-JgUdNoZKxPZFzbzJwy4hDSyGuH/gXz2rN51QmoR8cBQsVo58llD3A0vlRKKRt8FGf5u69P9eQyIH8/z9vN/S0Q== + chalk@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -905,7 +1705,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -913,6 +1713,11 @@ chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + chokidar@^3.5.2: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -928,6 +1733,11 @@ chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" @@ -938,11 +1748,30 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +ci-info@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" + integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + cli-boxes@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" @@ -955,6 +1784,21 @@ clone@^2.1.1: resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -984,6 +1828,18 @@ colord@^2.9.1: resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== +colorette@2.0.16: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -994,6 +1850,11 @@ commander@^7.0.0, commander@^7.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + component-emitter@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" @@ -1016,6 +1877,11 @@ configstore@^5.0.1: write-file-atomic "^3.0.0" xdg-basedir "^4.0.0" +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -1028,6 +1894,13 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -1038,6 +1911,11 @@ cookie@0.4.2, cookie@~0.4.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cors@^2.8.5, cors@~2.8.5: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" @@ -1057,6 +1935,15 @@ cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypto-random-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" @@ -1154,6 +2041,32 @@ csso@^4.2.0: dependencies: css-tree "^1.1.2" +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1161,6 +2074,13 @@ debug@2.6.9: dependencies: ms "2.0.0" +debug@4, debug@4.3.3, debug@^4.1.0, debug@^4.1.1, debug@~4.3.1, debug@~4.3.2: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -1168,12 +2088,10 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@~4.3.1, debug@~4.3.2: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" +decimal.js@^10.2.1: + version "10.3.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== decompress-response@^3.3.0: version "3.3.0" @@ -1182,16 +2100,48 @@ decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + defer-to-connect@^1.0.1: version "1.1.3" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -1207,6 +2157,21 @@ detect-libc@^1.0.3: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= +detect-libc@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" + integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== + dom-serializer@^1.0.1: version "1.3.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" @@ -1221,6 +2186,13 @@ domelementtype@^2.0.1, domelementtype@^2.2.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + domhandler@^4.2.0, domhandler@^4.2.2, domhandler@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" @@ -1269,6 +2241,16 @@ electron-to-chromium@^1.4.71: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.75.tgz#d1ad9bb46f2f1bf432118c2be21d27ffeae82fdd" integrity sha512-LxgUNeu3BVU7sXaKjUDD9xivocQLxFtq6wgERrutdY/yIOps3ODOZExK1jg8DTEg4U8TUCb5MLGeWFOYuxjF3Q== +electron-to-chromium@^1.4.76: + version "1.4.82" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.82.tgz#51e123ca434b1eba8c434ece2b54f095b304a651" + integrity sha512-Ks+ANzLoIrFDUOJdjxYMH6CMKB8UQo5modAwvSZTxgF+vEs/U7G5IbWFUp6dS4klPkTDVdxbORuk8xAXXhMsWw== + +emittery@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -1279,14 +2261,29 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -end-of-stream@^1.1.0: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -engine.io-parser@~5.0.3: +engine.io-client@~6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.1.1.tgz#800d4b9db5487d169686729e5bd887afa78d36b0" + integrity sha512-V05mmDo4gjimYW+FGujoGmmmxRaDsrVr7AXA3ZIfa04MWM1jOfZfUwou0oNqhNwy/votUDvGDt4JA4QF4e0b4g== + dependencies: + "@socket.io/component-emitter" "~3.0.0" + debug "~4.3.1" + engine.io-parser "~5.0.0" + has-cors "1.1.0" + parseqs "0.0.6" + parseuri "0.0.6" + ws "~8.2.3" + xmlhttprequest-ssl "~2.0.0" + yeast "0.1.2" + +engine.io-parser@~5.0.0, engine.io-parser@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.3.tgz#ca1f0d7b11e290b4bfda251803baea765ed89c09" integrity sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg== @@ -1346,11 +2343,83 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +esm@^3.2.25: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + +expect@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" + integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== + dependencies: + "@jest/types" "^27.5.1" + jest-get-type "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + express@^4.17.3: version "4.17.3" resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" @@ -1387,6 +2456,28 @@ express@^4.17.3: utils-merge "1.0.1" vary "~1.1.2" +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: + version "2.1.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@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -1407,6 +2498,23 @@ finalhandler@~1.1.2: statuses "~1.5.0" unpipe "~1.0.0" +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" @@ -1417,11 +2525,55 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -fsevents@~2.3.2: +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + get-port@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119" @@ -1441,6 +2593,21 @@ get-stream@^5.1.0: dependencies: pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +getopts@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4" + integrity sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA== + +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= + glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -1448,6 +2615,18 @@ glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-dirs@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" @@ -1455,6 +2634,11 @@ global-dirs@^3.0.0: dependencies: ini "2.0.0" +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + globals@^13.2.0: version "13.12.1" resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.1.tgz#ec206be932e6c77236677127577aa8e50bf1c5cb" @@ -1479,11 +2663,16 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.2: +graceful-fs@^4.1.2, graceful-fs@^4.2.9: version "4.2.9" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -1494,11 +2683,35 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + has-yarn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + htmlnano@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/htmlnano/-/htmlnano-2.0.0.tgz#07376faa064f7e1e832dfd91e1a9f606b0bc9b78" @@ -1534,6 +2747,28 @@ http-errors@1.8.1: statuses ">= 1.5.0 < 2" toidentifier "1.0.1" +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -1541,6 +2776,11 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore-by-default@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" @@ -1559,12 +2799,28 @@ import-lazy@^2.1.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -inherits@2.0.4: +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1579,6 +2835,11 @@ ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -1603,16 +2864,35 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -1653,6 +2933,16 @@ is-path-inside@^3.0.2: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -1663,11 +2953,514 @@ is-yarn-global@^0.3.0: resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" + integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.4" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" + integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" + integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== + dependencies: + "@jest/types" "^27.5.1" + execa "^5.0.0" + throat "^6.0.1" + +jest-circus@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" + integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-cli@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" + integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== + dependencies: + "@jest/core" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + prompts "^2.0.1" + yargs "^16.2.0" + +jest-config@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" + integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== + dependencies: + "@babel/core" "^7.8.0" + "@jest/test-sequencer" "^27.5.1" + "@jest/types" "^27.5.1" + babel-jest "^27.5.1" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.9" + jest-circus "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-get-type "^27.5.1" + jest-jasmine2 "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runner "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^27.5.1" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" + integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-docblock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" + integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== + dependencies: + detect-newline "^3.0.0" + +jest-each@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" + integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + jest-get-type "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + +jest-environment-jsdom@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" + integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + jsdom "^16.6.0" + +jest-environment-node@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" + integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +jest-get-type@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== + +jest-haste-map@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" + integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== + dependencies: + "@jest/types" "^27.5.1" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^27.5.1" + jest-serializer "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +jest-jasmine2@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" + integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + throat "^6.0.1" + +jest-leak-detector@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" + integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== + dependencies: + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-matcher-utils@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== + dependencies: + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-message-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" + integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.5.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" + integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== + +jest-resolve-dependencies@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" + integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== + dependencies: + "@jest/types" "^27.5.1" + jest-regex-util "^27.5.1" + jest-snapshot "^27.5.1" + +jest-resolve@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" + integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-pnp-resolver "^1.2.2" + jest-util "^27.5.1" + jest-validate "^27.5.1" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-runner@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" + integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.8.1" + graceful-fs "^4.2.9" + jest-docblock "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-haste-map "^27.5.1" + jest-leak-detector "^27.5.1" + jest-message-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runtime "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + source-map-support "^0.5.6" + throat "^6.0.1" + +jest-runtime@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" + integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/globals" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-serializer@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" + integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.9" + +jest-snapshot@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" + integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== + dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.0.0" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^27.5.1" + graceful-fs "^4.2.9" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + jest-haste-map "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + natural-compare "^1.4.0" + pretty-format "^27.5.1" + semver "^7.3.2" + +jest-util@^27.0.0, jest-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" + integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== + dependencies: + "@jest/types" "^27.5.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^27.5.1" + leven "^3.1.0" + pretty-format "^27.5.1" + +jest-watcher@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" + integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== + dependencies: + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^27.5.1" + string-length "^4.0.1" + +jest-worker@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" + integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== + dependencies: + "@jest/core" "^27.5.1" + import-local "^3.0.2" + jest-cli "^27.5.1" + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsdom@^16.6.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + json-buffer@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" @@ -1683,7 +3476,7 @@ json-source-map@^0.6.1: resolved "https://registry.yarnpkg.com/json-source-map/-/json-source-map-0.6.1.tgz#e0b1f6f4ce13a9ad57e2ae165a24d06e62c79a0f" integrity sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg== -json5@^2.2.0: +json5@2.x, json5@^2.1.2, json5@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== @@ -1697,6 +3490,30 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +knex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/knex/-/knex-1.0.4.tgz#b9db3c60d0e3a4af37239bb879244e50eb748124" + integrity sha512-cMQ81fpkVmr4ia20BtyrD3oPere/ir/Q6IGLAgcREKOzRVhMsasQ4nx1VQuDRJjqq6oK5kfcxmvWoYkHKrnuMA== + dependencies: + colorette "2.0.16" + commander "^8.3.0" + debug "4.3.3" + escalade "^3.1.1" + esm "^3.2.25" + getopts "2.3.0" + interpret "^2.2.0" + lodash "^4.17.21" + pg-connection-string "2.5.0" + rechoir "^0.8.0" + resolve-from "^5.0.0" + tarn "^3.0.2" + tildify "2.0.0" + latest-version@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" @@ -1704,6 +3521,19 @@ latest-version@^5.1.0: dependencies: package-json "^6.3.0" +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + lilconfig@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" @@ -1725,7 +3555,14 @@ lmdb@^2.0.2: ordered-binary "^1.2.4" weak-lru-cache "^1.2.2" -lodash.memoize@^4.1.2: +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.memoize@4.x, lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= @@ -1735,6 +3572,11 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= +lodash@^4.17.21, lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" @@ -1759,6 +3601,18 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" +make-error@1.x: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + mdn-data@2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" @@ -1774,16 +3628,41 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + mime-db@1.51.0: version "1.51.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.34" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" @@ -1796,11 +3675,21 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + minimatch@^3.0.4: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -1808,11 +3697,16 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -1853,21 +3747,48 @@ nanoid@^3.3.1: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +node-abi@^3.3.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.8.0.tgz#679957dc8e7aa47b0a02589dbfde4f77b29ccb32" + integrity sha512-tzua9qWWi7iW4I42vUPKM+SfaF0vQSLAm4yO5J83mSwB7GeoWrDKC/K+8YCnYNwqP5duwazbw2X9l4m8SC2cUw== + dependencies: + semver "^7.3.5" + node-addon-api@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== +node-addon-api@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" + integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== + node-gyp-build@^4.2.3, node-gyp-build@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + node-releases@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" @@ -1911,6 +3832,23 @@ normalize-url@^6.0.1: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npmlog@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + nth-check@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" @@ -1923,7 +3861,17 @@ nullthrows@^1.1.1: resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== -object-assign@^4: +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +object-assign@^4, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -1935,13 +3883,32 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" -once@^1.3.1, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + ordered-binary@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/ordered-binary/-/ordered-binary-1.2.4.tgz#51d3a03af078a0bdba6c7bc8f4fedd1f5d45d83e" @@ -1952,6 +3919,25 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + package-json@^6.3.0: version "6.5.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" @@ -1989,7 +3975,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -1999,11 +3985,46 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseqs@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" + integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== + +parseuri@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" + integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== + parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -2014,16 +4035,33 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pg-connection-string@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34" + integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + postcss-calc@^8.2.3: version "8.2.4" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" @@ -2271,11 +4309,57 @@ posthtml@^0.16.4, posthtml@^0.16.5: posthtml-parser "^0.11.0" posthtml-render "^3.0.0" +prebuild-install@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.0.1.tgz#c10075727c318efe72412f333e0ef625beaf3870" + integrity sha512-QBSab31WqkyxpnMWQxubYAHR5S9B2+r81ucocew34Fkl98FhvKIF50jIJnNOBmAZfyNV7vE5T6gd3hTVWgY6tg== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + npmlog "^4.0.1" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= +pretty-format@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -2284,6 +4368,11 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +psl@^1.1.33: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + pstree.remy@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" @@ -2297,6 +4386,11 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + pupa@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" @@ -2324,7 +4418,7 @@ raw-body@2.4.3: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.2.8: +rc@^1.2.7, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -2334,11 +4428,38 @@ rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + react-refresh@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.9.0.tgz#71863337adc3e5c2f8a6bfddd12ae3bfe32aafbf" integrity sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ== +readable-stream@^2.0.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.1.1, readable-stream@^3.4.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== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -2346,6 +4467,13 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + regenerator-runtime@^0.13.7: version "0.13.9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" @@ -2365,11 +4493,42 @@ registry-url@^5.0.0: dependencies: rc "^1.2.8" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + +resolve@^1.20.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -2377,16 +4536,35 @@ responselike@^1.0.2: dependencies: lowercase-keys "^1.0.0" -safe-buffer@5.2.1, safe-buffer@^5.0.1: +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + semver-diff@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" @@ -2394,6 +4572,13 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" +semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -2404,13 +4589,6 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.4: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - send@0.17.2: version "0.17.2" resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" @@ -2440,21 +4618,74 @@ serve-static@1.14.2: parseurl "~1.3.3" send "0.17.2" +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -signal-exit@^3.0.2: +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + socket.io-adapter@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz#4d6111e4d42e9f7646e365b4f578269821f13486" integrity sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ== +socket.io-client@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.4.1.tgz#b6aa9448149d09b8d0b2bbf3d2fac310631fdec9" + integrity sha512-N5C/L5fLNha5Ojd7Yeb/puKcPWWcoB/A09fEjjNsg91EDVr5twk/OEyO6VT9dlLSUNY85NpW6KBhVMvaLKQ3vQ== + dependencies: + "@socket.io/component-emitter" "~3.0.0" + backo2 "~1.0.2" + debug "~4.3.2" + engine.io-client "~6.1.1" + parseuri "0.0.6" + socket.io-parser "~4.1.1" + socket.io-parser@~4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" @@ -2464,6 +4695,14 @@ socket.io-parser@~4.0.4: component-emitter "~1.3.0" debug "~4.3.1" +socket.io-parser@~4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.1.2.tgz#0a97d4fb8e67022158a568450a6e41887e42035e" + integrity sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog== + dependencies: + "@socket.io/component-emitter" "~3.0.0" + debug "~4.3.1" + socket.io@^4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.4.1.tgz#cd6de29e277a161d176832bb24f64ee045c56ab8" @@ -2481,7 +4720,7 @@ source-map-js@^1.0.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-support@~0.5.20: +source-map-support@^0.5.6, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -2489,27 +4728,61 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1: +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@~0.7.2: +source-map@^0.7.3, source-map@~0.7.2: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== +stack-utils@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + dependencies: + escape-string-regexp "^2.0.0" + "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.2: +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -2518,6 +4791,27 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.2: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -2525,6 +4819,21 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -2545,13 +4854,33 @@ supports-color@^5.3.0, supports-color@^5.5.0: dependencies: has-flag "^3.0.0" -supports-color@^7.1.0: +supports-color@^7.0.0, supports-color@^7.1.0: 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" +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + svgo@^2.4.0, svgo@^2.7.0: version "2.8.0" resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" @@ -2565,6 +4894,45 @@ svgo@^2.4.0, svgo@^2.7.0: picocolors "^1.0.0" stable "^0.1.8" +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tarn@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.2.tgz#73b6140fbb881b71559c4f8bfde3d9a4b3d27693" + integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ== + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + terser@^5.2.0: version "5.12.0" resolved "https://registry.yarnpkg.com/terser/-/terser-5.12.0.tgz#728c6bff05f7d1dcb687d8eace0644802a9dae8a" @@ -2575,11 +4943,40 @@ terser@^5.2.0: source-map "~0.7.2" source-map-support "~0.5.20" +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +throat@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" + integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== + +tildify@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a" + integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw== + timsort@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + to-readable-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" @@ -2604,11 +5001,65 @@ touch@^3.1.0: dependencies: nopt "~1.0.10" +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.1.2" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +ts-jest@^27.1.3: + version "27.1.3" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.3.tgz#1f723e7e74027c4da92c0ffbd73287e8af2b2957" + integrity sha512-6Nlura7s6uM9BVUAoqLH7JHyMXjz8gluryjpPXxr3IxZdAXnU6FhjvVLHFtfd1vsE1p8zD1OJfskkc0jhTSnkA== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^27.0.0" + json5 "2.x" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "20.x" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -2641,6 +5092,11 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" +universalify@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -2673,7 +5129,7 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -util-deprecate@^1.0.2: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -2693,16 +5149,91 @@ v8-compile-cache@^2.0.0: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== +v8-to-istanbul@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" + integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + weak-lru-cache@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz#fdbb6741f36bae9540d12f480ce8254060dccd19" integrity sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw== +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + widest-line@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" @@ -2710,6 +5241,11 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -2734,6 +5270,11 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +ws@^7.4.6: + version "7.5.7" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" + integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== + ws@~8.2.3: version "8.2.3" resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" @@ -2744,11 +5285,31 @@ xdg-basedir@^4.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xmlhttprequest-ssl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" + integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== + xxhash-wasm@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz#752398c131a4dd407b5132ba62ad372029be6f79" integrity sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" @@ -2758,3 +5319,44 @@ yaml@^1.10.0, yaml@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@20.x, yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.0.0: + version "21.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" + integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.3.1: + version "17.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9" + integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= diff --git a/webapp/package.json b/webapp/package.json index dd8f5946..fa830477 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -1,5 +1,5 @@ { - "name": "noot", + "name": "silverbullet", "version": "1.0.0", "source": [ "src/index.html" @@ -7,10 +7,9 @@ "license": "MIT", "browserslist": "> 0.5%, last 2 versions, not dead", "scripts": { - "start": "parcel", + "start": "parcel serve --no-cache", "build": "parcel build", - "clean": "rm -rf dist", - "check-watch": "tsc --noEmit --watch" + "clean": "rm -rf dist" }, "devDependencies": { "@parcel/packager-raw-url": "2.3.2", diff --git a/webapp/src/boot.ts b/webapp/src/boot.ts index 653a66a3..02e02c93 100644 --- a/webapp/src/boot.ts +++ b/webapp/src/boot.ts @@ -1,14 +1,11 @@ import { Editor } from "./editor"; -import { RealtimeSpace } from "./space"; +import { Space } from "./space"; import { safeRun } from "./util"; import { io } from "socket.io-client"; let socket = io(`http://${location.hostname}:3000`); -let editor = new Editor( - new RealtimeSpace(socket), - document.getElementById("root")! -); +let editor = new Editor(new Space(socket), document.getElementById("root")!); safeRun(async () => { await editor.init(); @@ -16,3 +13,9 @@ safeRun(async () => { // @ts-ignore window.editor = editor; + +navigator.serviceWorker + .register(new URL("service_worker.ts", import.meta.url), { type: "module" }) + .then((r) => { + console.log("Service worker registered", r); + }); diff --git a/webapp/src/editor.tsx b/webapp/src/editor.tsx index 70f9b500..8810bd89 100644 --- a/webapp/src/editor.tsx +++ b/webapp/src/editor.tsx @@ -46,7 +46,7 @@ import { IPageNavigator, PathPageNavigator } from "./navigator"; import customMarkDown from "./parser"; import reducer from "./reducer"; import { smartQuoteKeymap } from "./smart_quotes"; -import { RealtimeSpace } from "./space"; +import { Space } from "./space"; import customMarkdownStyle from "./style"; import dbSyscalls from "./syscalls/db.localstorage"; import editorSyscalls from "./syscalls/editor.browser"; @@ -77,7 +77,7 @@ export class Editor implements AppEventDispatcher { viewState: AppViewState; viewDispatch: React.Dispatch; openPages: Map; - space: RealtimeSpace; + space: Space; editorCommands: Map; plugs: Plug[]; indexer: Indexer; @@ -85,7 +85,7 @@ export class Editor implements AppEventDispatcher { pageNavigator: IPageNavigator; indexCurrentPageDebounced: () => any; - constructor(space: RealtimeSpace, parent: Element) { + constructor(space: Space, parent: Element) { this.editorCommands = new Map(); this.openPages = new Map(); this.plugs = []; @@ -101,7 +101,7 @@ export class Editor implements AppEventDispatcher { parent: document.getElementById("editor")!, }); this.pageNavigator = new PathPageNavigator(); - this.indexer = new Indexer("page-index", space); + this.indexer = new Indexer(space); this.indexCurrentPageDebounced = throttle( this.indexCurrentPage.bind(this), @@ -175,7 +175,7 @@ export class Editor implements AppEventDispatcher { dbSyscalls, editorSyscalls(this), spaceSyscalls(this), - indexerSyscalls(this.indexer) + indexerSyscalls(this.space) ); console.log("Now loading core plug"); @@ -319,8 +319,6 @@ export class Editor implements AppEventDispatcher { key: "Ctrl-.", mac: "Cmd-.", run: (target): boolean => { - console.log("YO"); - this.viewDispatch({ type: "show-palette", }); diff --git a/webapp/src/images/logo.png b/webapp/src/images/logo.png index 58185d8d94aabbf3bbedf4715b9d738b0753b51c..49a5bce5beecbe5f379b12d21af73bfcca21f954 100644 GIT binary patch literal 67362 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 diff --git a/webapp/src/index.html b/webapp/src/index.html index bff3f302..33775638 100644 --- a/webapp/src/index.html +++ b/webapp/src/index.html @@ -2,7 +2,7 @@ - Page + Silver Bullet diff --git a/webapp/src/indexer.ts b/webapp/src/indexer.ts index ea06337a..e6936cff 100644 --- a/webapp/src/indexer.ts +++ b/webapp/src/indexer.ts @@ -1,61 +1,13 @@ -import { Dexie, Table } from "dexie"; import { AppEventDispatcher, IndexEvent } from "./app_event"; import { Space } from "./space"; -import { PageMeta } from "./types"; - -function constructKey(pageName: string, key: string): string { - return `${pageName}:${key}`; -} - -function cleanKey(pageName: string, fromKey: string): string { - return fromKey.substring(pageName.length + 1); -} - -export type KV = { - key: string; - value: any; -}; export class Indexer { - db: Dexie; - pageIndex: Table; space: Space; - constructor(name: string, space: Space) { - this.db = new Dexie(name); + constructor(space: Space) { this.space = space; - this.db.version(1).stores({ - pageIndex: "ck, page, key", - }); - this.pageIndex = this.db.table("pageIndex"); } - async clearPageIndexForPage(pageName: string) { - await this.pageIndex.where({ page: pageName }).delete(); - } - - async clearPageIndex() { - await this.pageIndex.clear(); - } - - // async setPageIndexPageMeta(pageName: string, meta: PageMeta) { - // await this.set(pageName, "$meta", { - // lastModified: meta.lastModified.getTime(), - // }); - // } - - // async getPageIndexPageMeta(pageName: string): Promise { - // let meta = await this.get(pageName, "$meta"); - // if (meta) { - // return { - // name: pageName, - // lastModified: new Date(meta.lastModified), - // }; - // } else { - // return null; - // } - // } - async indexPage( appEventDispatcher: AppEventDispatcher, pageName: string, @@ -63,7 +15,7 @@ export class Indexer { withFlush: boolean ) { if (withFlush) { - await this.clearPageIndexForPage(pageName); + await this.space.indexDeletePrefixForPage(pageName, ""); } let indexEvent: IndexEvent = { name: pageName, @@ -74,77 +26,12 @@ export class Indexer { } async reindexSpace(space: Space, appEventDispatcher: AppEventDispatcher) { - await this.clearPageIndex(); let allPages = await space.listPages(); // TODO: Parallelize? for (let page of allPages) { + await space.indexDeletePrefixForPage(page.name, ""); let pageData = await space.readPage(page.name); await this.indexPage(appEventDispatcher, page.name, pageData.text, false); } } - - async set(pageName: string, key: string, value: any) { - await this.pageIndex.put({ - ck: constructKey(pageName, key), - page: pageName, - key: key, - value: value, - }); - } - - async batchSet(pageName: string, kvs: KV[]) { - await this.pageIndex.bulkPut( - kvs.map(({ key, value }) => ({ - ck: constructKey(pageName, key), - key: key, - page: pageName, - value: value, - })) - ); - } - - async get(pageName: string, key: string): Promise { - let result = await this.pageIndex.get({ - ck: constructKey(pageName, key), - }); - return result ? result.value : null; - } - - async scanPrefixForPage( - pageName: string, - keyPrefix: string - ): Promise<{ key: string; value: any }[]> { - let results = await this.pageIndex - .where("ck") - .startsWith(constructKey(pageName, keyPrefix)) - .toArray(); - return results.map((result) => ({ - key: cleanKey(pageName, result.key), - value: result.value, - })); - } - - async scanPrefixGlobal( - keyPrefix: string - ): Promise<{ key: string; value: any }[]> { - let results = await this.pageIndex - .where("key") - .startsWith(keyPrefix) - .toArray(); - return results.map((result) => ({ - key: result.key, - value: result.value, - })); - } - - async deletePrefixForPage(pageName: string, keyPrefix: string) { - await this.pageIndex - .where("ck") - .startsWith(constructKey(pageName, keyPrefix)) - .delete(); - } - - async delete(pageName: string, key: string) { - await this.pageIndex.delete(constructKey(pageName, key)); - } } diff --git a/webapp/src/manifest.json b/webapp/src/manifest.json index e613bf34..4f2dd246 100644 --- a/webapp/src/manifest.json +++ b/webapp/src/manifest.json @@ -1,6 +1,6 @@ { - "short_name": "Nugget", - "name": "Nugget", + "short_name": "Silver Bullet", + "name": "Silver Bullet", "icons": [ { "src": "./images/logo.png", @@ -9,7 +9,7 @@ } ], "capture_links": "new-client", - "start_url": "/start", + "start_url": "/", "display": "standalone", "scope": "/", "theme_color": "#000", diff --git a/webapp/src/service_worker.ts b/webapp/src/service_worker.ts new file mode 100644 index 00000000..2c45a9d1 --- /dev/null +++ b/webapp/src/service_worker.ts @@ -0,0 +1,17 @@ +import { manifest, version } from "@parcel/service-worker"; + +async function install() { + const cache = await caches.open(version); + await cache.addAll(manifest); +} +//@ts-ignore +self.addEventListener("install", (e) => e.waitUntil(install())); + +async function activate() { + const keys = await caches.keys(); + await Promise.all(keys.map((key) => key !== version && caches.delete(key))); +} +//@ts-ignore +self.addEventListener("activate", (e) => e.waitUntil(activate())); + +self.addEventListener("fetch", function (event) {}); diff --git a/webapp/src/space.ts b/webapp/src/space.ts index 4d5c037b..f04ba967 100644 --- a/webapp/src/space.ts +++ b/webapp/src/space.ts @@ -7,14 +7,6 @@ import { CollabEvents, CollabDocument } from "./collab"; import { Cursor, cursorEffect } from "./cursorEffect"; import { EventEmitter } from "./event"; -export interface Space { - listPages(): Promise; - readPage(name: string): Promise<{ text: string; meta: PageMeta }>; - writePage(name: string, text: string): Promise; - deletePage(name: string): Promise; - getPageMeta(name: string): Promise; -} - export type SpaceEvents = { connect: () => void; pageCreated: (meta: PageMeta) => void; @@ -23,7 +15,12 @@ export type SpaceEvents = { pageListUpdated: (pages: Set) => void; } & CollabEvents; -export class RealtimeSpace extends EventEmitter implements Space { +export type KV = { + key: string; + value: any; +}; + +export class Space extends EventEmitter { socket: Socket; reqId = 0; allPages = new Set(); @@ -66,9 +63,15 @@ export class RealtimeSpace extends EventEmitter implements Space { } private wsCall(eventName: string, ...args: any[]): Promise { - return new Promise((resolve) => { + return new Promise((resolve, reject) => { this.reqId++; - this.socket!.once(`${eventName}Resp${this.reqId}`, resolve); + this.socket!.once(`${eventName}Resp${this.reqId}`, (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + }); this.socket!.emit(eventName, this.reqId, ...args); }); } @@ -136,4 +139,40 @@ export class RealtimeSpace extends EventEmitter implements Space { async getPageMeta(name: string): Promise { return this.wsCall("deletePage", name); } + + async indexSet(pageName: string, key: string, value: any) { + await this.wsCall("index:set", pageName, key, value); + } + + async indexBatchSet(pageName: string, kvs: KV[]) { + // TODO: Optimize with batch call + for (let { key, value } of kvs) { + await this.indexSet(pageName, key, value); + } + } + + async indexGet(pageName: string, key: string): Promise { + return await this.wsCall("index:get", pageName, key); + } + + async indexScanPrefixForPage( + pageName: string, + keyPrefix: string + ): Promise<{ key: string; value: any }[]> { + return await this.wsCall("index:scanPrefixForPage", pageName, keyPrefix); + } + + async indexScanPrefixGlobal( + keyPrefix: string + ): Promise<{ key: string; value: any }[]> { + return await this.wsCall("index:scanPrefixGlobal", keyPrefix); + } + + async indexDeletePrefixForPage(pageName: string, keyPrefix: string) { + await this.wsCall("index:deletePrefixForPage", keyPrefix); + } + + async indexDelete(pageName: string, key: string) { + await this.wsCall("index:delete", pageName, key); + } } diff --git a/webapp/src/styles/editor.scss b/webapp/src/styles/editor.scss index 53de173d..e45cd1d5 100644 --- a/webapp/src/styles/editor.scss +++ b/webapp/src/styles/editor.scss @@ -128,7 +128,8 @@ } .mention { - color: gray; + color: #0330cb; + text-decoration: underline; } .tag { diff --git a/webapp/src/syscalls/indexer.native.ts b/webapp/src/syscalls/indexer.native.ts index 742c11e7..fbb97ba4 100644 --- a/webapp/src/syscalls/indexer.native.ts +++ b/webapp/src/syscalls/indexer.native.ts @@ -1,22 +1,22 @@ -import { Indexer, KV } from "../indexer"; +import { Space, KV } from "../space"; -export default (indexer: Indexer) => ({ +export default (space: Space) => ({ "indexer.scanPrefixForPage": async (pageName: string, keyPrefix: string) => { - return await indexer.scanPrefixForPage(pageName, keyPrefix); + return await space.indexScanPrefixForPage(pageName, keyPrefix); }, "indexer.scanPrefixGlobal": async (keyPrefix: string) => { - return await indexer.scanPrefixGlobal(keyPrefix); + return await space.indexScanPrefixGlobal(keyPrefix); }, "indexer.get": async (pageName: string, key: string): Promise => { - return await indexer.get(pageName, key); + return await space.indexGet(pageName, key); }, "indexer.set": async (pageName: string, key: string, value: any) => { - await indexer.set(pageName, key, value); + await space.indexSet(pageName, key, value); }, "indexer.batchSet": async (pageName: string, kvs: KV[]) => { - await indexer.batchSet(pageName, kvs); + await space.indexBatchSet(pageName, kvs); }, "indexer.delete": async (pageName: string, key: string) => { - await indexer.delete(pageName, key); + await space.indexDelete(pageName, key); }, }); diff --git a/webapp/src/syscalls/space.native.ts b/webapp/src/syscalls/space.native.ts index 96a1fbf6..a2f05dd4 100644 --- a/webapp/src/syscalls/space.native.ts +++ b/webapp/src/syscalls/space.native.ts @@ -18,7 +18,7 @@ export default (editor: Editor) => ({ }, "space.deletePage": async (name: string) => { console.log("Clearing page index", name); - await editor.indexer.clearPageIndexForPage(name); + await editor.space.indexDeletePrefixForPage(name, ""); // If we're deleting the current page, navigate to the start page if (editor.currentPage === name) { await editor.navigate("start");