From 126ed3016dea9a394c1778b31fd49939d874bd54 Mon Sep 17 00:00:00 2001 From: teidesu Date: Sat, 22 May 2021 18:20:07 +0300 Subject: [PATCH] feat: sqlite backed session for node js --- packages/sqlite/index.ts | 523 ++++++++++++++++++++++++++++++++++ packages/sqlite/package.json | 23 ++ packages/sqlite/tsconfig.json | 19 ++ yarn.lock | 285 +++++++++--------- 4 files changed, 714 insertions(+), 136 deletions(-) create mode 100644 packages/sqlite/index.ts create mode 100644 packages/sqlite/package.json create mode 100644 packages/sqlite/tsconfig.json diff --git a/packages/sqlite/index.ts b/packages/sqlite/index.ts new file mode 100644 index 00000000..9423dc5e --- /dev/null +++ b/packages/sqlite/index.ts @@ -0,0 +1,523 @@ +// noinspection SqlResolve + +import { + BinaryReader, + BinaryWriter, + ITelegramStorage, + LruMap, + MAX_CHANNEL_ID, +} from '@mtcute/core' +import { tl } from '@mtcute/tl' +import sqlite3 from 'better-sqlite3' +import bigInt from 'big-integer' +import { throttle } from '@mtcute/core' + +const debug = require('debug')('mtcute:sqlite') + +function serializeAccessHash(hash: tl.Long): Buffer { + const arr = hash.toArray(256) + arr.value.push(arr.isNegative ? 1 : 0) + return Buffer.from(arr.value) +} + +function parseAccessHash(hash: Buffer): tl.Long { + const arr = hash.toJSON().data + return bigInt.fromArray(arr.slice(0, -1), 256, arr[arr.length - 1] as any) +} + +function getInputPeer( + row: SqliteEntity | ITelegramStorage.PeerInfo +): tl.TypeInputPeer { + switch (row.type) { + case 'user': + return { + _: 'inputPeerUser', + userId: row.id, + accessHash: + 'accessHash' in row + ? row.accessHash + : parseAccessHash(row.hash), + } + case 'chat': + return { + _: 'inputPeerChat', + chatId: -row.id, + } + case 'channel': + return { + _: 'inputPeerChannel', + channelId: MAX_CHANNEL_ID - row.id, + accessHash: + 'accessHash' in row + ? row.accessHash + : parseAccessHash(row.hash), + } + } + + throw new Error(`Invalid peer type: ${row.type}`) +} + +const CURRENT_VERSION = 1 +// language=SQLite +const SCHEMA = ` + create table kv ( + key text primary key, + value text not null + ); + + create table auth_keys ( + dc integer primary key, + key blob not null + ); + + create table pts ( + channel_id integer primary key, + pts integer not null + ); + + create table entities ( + id integer primary key, + hash blob not null, + type text not null, + username text, + phone text, + updated integer not null, + "full" blob + ); + create index idx_entities_username on entities (username); + create unique index idx_entities_phone on entities (phone); +` + +const RESET = ` + delete from kv; + delete from auth_keys where key <> 'ver'; + delete from pts; + delete from entities +` + +const USERNAME_TTL = 86400000 // 24 hours + +interface SqliteEntity { + id: number + hash: Buffer + type: string + username?: string + phone?: string + updated: number + full: Buffer +} + +interface CacheItem { + peer: tl.TypeInputPeer + full: tl.TypeUser | tl.TypeChat +} + +const STATEMENTS = { + getKv: 'select value from kv where key = ?', + setKv: 'insert or replace into kv (key, value) values (?, ?)', + delKv: 'delete from kv where key = ?', + + getAuth: 'select key from auth_keys where dc = ?', + setAuth: 'insert or replace into auth_keys (dc, key) values (?, ?)', + delAuth: 'delete from auth_keys where dc = ?', + + getPts: 'select pts from pts where channel_id = ?', + setPts: 'insert or replace into pts (channel_id, pts) values (?, ?)', + + updateUpdated: 'update entities set updated = ? where id = ?', + updateCachedEnt: + 'update entities set username = ?, phone = ?, updated = ?, "full" = ? where id = ?', + upsertEnt: + 'insert or replace into entities (id, hash, type, username, phone, updated, "full") values (?, ?, ?, ?, ?, ?, ?)', + getEntById: 'select * from entities where id = ?', + getEntByPhone: 'select * from entities where phone = ?', + getEntByUser: 'select * from entities where username = ?', +} as const + +const EMPTY_BUFFER = Buffer.alloc(0) + +/** + * SQLite backed storage for MTCute. + * + * Uses `better-sqlite3` library + */ +export class SqliteStorage implements ITelegramStorage { + private _db: sqlite3.Database + private _statements: Record + private readonly _filename: string + + private _pending: [sqlite3.Statement, any[]][] = [] + private _pendingUnimportant: Record = {} + private _cache?: LruMap + + private _wal?: boolean + + private _reader = new BinaryReader(EMPTY_BUFFER) + + private _saveUnimportantLater: () => void + + /** + * @param filename Database file name, or `:memory:` for in-memory DB + * @param params + */ + constructor( + filename = ':memory:', + params?: { + /** + * Entities cache size, in number of entities. + * + * Recently encountered entities are cached in memory, + * to avoid redundant database calls. Set to 0 to + * disable caching (not recommended) + * + * Note that by design in-memory cached is only + * used when finding peer by ID, since other + * kinds of lookups (phone, username) may get stale quickly + * + * Defaults to `100` + */ + cacheSize?: number + + /** + * By default, WAL mode is enabled, which + * significantly improves performance. + * [Learn more](https://github.com/JoshuaWise/better-sqlite3/blob/master/docs/performance.md) + * + * However, you might encounter some issues, + * and if you do, you can disable WAL by passing `true` + * + * Defaults to false + */ + disableWal?: boolean + + /** + * Updates to already cached in-memory entities are only + * applied in DB once in a while, to avoid redundant + * DB calls. + * + * If you are having issues with this, you can set this to `0` + * + * Defaults to `30000` (30 sec) + */ + unimportantSavesDelay?: number + } + ) { + this._filename = filename + if (params?.cacheSize !== 0) { + this._cache = new LruMap(params?.cacheSize ?? 100) + } + this._wal = !params?.disableWal + + this._saveUnimportantLater = throttle(() => { + // unimportant changes are changes about cached in memory entities, + // that don't really need to be cached right away. + // to avoid redundant DB calls, these changes are persisted + // no more than once every 30 seconds. + // + // additionally, to avoid redundant changes that + // are immediately overwritten, we use object instead + // of an array, where the key is marked peer id, + // and value is the arguments array, since + // the query is always `updateCachedEnt` + const items = Object.values(this._pendingUnimportant) + if (!items.length) return + + this._updateManyPeers(items) + this._pendingUnimportant = {} + }, params?.unimportantSavesDelay ?? 30000) + + // todo: add support for workers (idk if really needed, but still) + } + + private _readFullPeer(data: Buffer): tl.TypeUser | tl.TypeChat { + // reuse reader because why not + this._reader.pos = 0 + this._reader.data = data + const obj = this._reader.object() + // remove reference to allow GC-ing + this._reader.data = EMPTY_BUFFER + return obj + } + + private _addToCache(id: number, item: CacheItem): void { + if (this._cache) { + this._cache.set(id, item) + } + } + + private _getFromKv(key: string): any { + const row = this._statements.getKv.get(key) + return row ? JSON.parse(row.value) : null + } + + private _setToKv(key: string, value: any, now = false): void { + const query = + value === null ? this._statements.delKv : this._statements.setKv + const params = value === null ? [key] : [key, JSON.stringify(value)] + + if (now) { + query.run(params) + } else { + this._pending.push([query, params]) + } + } + + private _runMany: (stmts: [sqlite3.Statement, any[]][]) => void + private _updateManyPeers: (updates: any[]) => void + + private _upgradeDatabase(from: number): void { + // not needed (yet) since no versions except 1 // + } + + private _initializeStatements(): void { + this._statements = {} as any + Object.entries(STATEMENTS).forEach(([name, sql]) => { + ;(this._statements as any)[name] = this._db.prepare(sql) + }) + } + + private _initialize(): void { + const hasTables = this._db + .prepare( + "select name from sqlite_master where type = 'table' and name = 'kv'" + ) + .get() + + if (hasTables) { + // tables already exist, check version + this._initializeStatements() + const version = this._getFromKv('ver') + debug('current db version = %d', version) + if (version < CURRENT_VERSION) { + this._upgradeDatabase(version) + this._setToKv('ver', CURRENT_VERSION, true) + } + } else { + // create tables + debug('creating tables') + this._db.exec(SCHEMA) + this._initializeStatements() + this._setToKv('ver', CURRENT_VERSION, true) + } + } + + load(): void { + this._db = sqlite3(this._filename, { + verbose: debug.enabled ? debug : null, + }) + + this._initialize() + + // init wal if needed + if (this._wal) { + this._db.pragma('journal_mode = WAL') + } + + // helper methods + this._runMany = this._db.transaction((stmts) => { + stmts.forEach((stmt: [sqlite3.Statement, any[]]) => { + stmt[0].run(stmt[1]) + }) + }) + + this._updateManyPeers = this._db.transaction((data) => { + data.forEach((it: any[]) => { + this._statements.updateCachedEnt.run(it) + }) + }) + } + + save(): void { + if (!this._pending.length) return + + this._runMany(this._pending) + this._pending = [] + + this._saveUnimportantLater() + } + + destroy(): void { + this._db.close() + } + + reset(): void { + this._db.exec(RESET) + } + + setDefaultDc(dc: tl.RawDcOption | null): void { + return this._setToKv('def_dc', dc) + } + + getDefaultDc(): tl.RawDcOption | null { + return this._getFromKv('def_dc') + } + + getAuthKeyFor(dcId: number): Promise { + const row = this._statements.getAuth.get(dcId) + return row ? row.key : null + } + + setAuthKeyFor(dcId: number, key: Buffer | null): void { + this._pending.push([ + key === null ? this._statements.delAuth : this._statements.setAuth, + key === null ? [dcId] : [dcId, key], + ]) + } + + getSelf(): ITelegramStorage.SelfInfo | null { + return this._getFromKv('self') + } + + setSelf(self: ITelegramStorage.SelfInfo | null): void { + return this._setToKv('self', self) + } + + getUpdatesState(): [number, number, number] | null { + const pts = this._getFromKv('pts') + if (pts == null) return null + + return [pts, this._getFromKv('date')!, this._getFromKv('seq')!] + } + + setCommonPts(val: [number, number] | null): void { + return this._setToKv('cpts', val) + } + + setUpdatesPts(val: number): void { + return this._setToKv('pts', val) + } + + setUpdatesDate(val: number): void { + return this._setToKv('date', val) + } + + setUpdatesSeq(val: number): void { + return this._setToKv('seq', val) + } + + getChannelPts(entityId: number): number | null { + const row = this._statements.getPts.get(entityId) + return row ? row.pts : null + } + + setManyChannelPts(values: Record): void { + Object.entries(values).forEach(([cid, pts]) => { + this._pending.push([this._statements.setPts, [cid, pts]]) + }) + } + + updatePeers(peers: ITelegramStorage.PeerInfo[]): void { + peers.forEach((peer) => { + const cached = this._cache?.get(peer.id) + + if ( + cached && + 'accessHash' in cached.peer && + cached.peer.accessHash.eq(peer.accessHash) + ) { + // when entity is cached and hash is the same, an update query is needed, + // since some field in the full entity might have changed, or the username/phone + // + // since it is cached, we know for sure that it already exists in db, + // so we can safely use `update` instead of `insert or replace` + // + // to avoid too many DB calls, and since these updates are pretty common, + // they are grouped and applied in batches no more than once every 30sec (or user-defined). + // + // until then, they are either served from in-memory cache, + // or an older version is fetched from DB + + this._pendingUnimportant[peer.id] = [ + peer.username, + peer.phone, + Date.now(), + BinaryWriter.serializeObject(peer.full), + peer.id, + ] + cached.full = peer.full + } else { + // entity is not cached in memory, or the access hash has changed + // we need to update it in the DB asap, and also update the in-memory cache + this._pending.push([ + this._statements.upsertEnt, + [ + peer.id, + serializeAccessHash(peer.accessHash), + peer.type, + peer.username, + peer.phone, + Date.now(), + BinaryWriter.serializeObject(peer.full), + ], + ]) + this._addToCache(peer.id, { + peer: getInputPeer(peer)!, + full: peer.full, + }) + } + }) + } + + getPeerById(peerId: number): tl.TypeInputPeer | null { + const cached = this._cache?.get(peerId) + if (cached) return cached.peer + + const row = this._statements.getEntById.get(peerId) + if (row) { + const peer = getInputPeer(row) + this._addToCache(peerId, { + peer, + full: this._readFullPeer(row.full), + }) + return peer + } + + return null + } + + getPeerByPhone(phone: string): tl.TypeInputPeer | null { + const row = this._statements.getEntByPhone.get(phone) + if (row) { + const peer = getInputPeer(row) + this._addToCache(row.id, { + peer, + full: this._readFullPeer(row.full), + }) + return peer + } + + return null + } + + getPeerByUsername(username: string): tl.TypeInputPeer | null { + const row = this._statements.getEntByUser.get(username.toLowerCase()) + if (!row || Date.now() - row.updated > USERNAME_TTL) return null + + if (row) { + const peer = getInputPeer(row) + this._addToCache(row.id, { + peer, + full: this._readFullPeer(row.full), + }) + return peer + } + + return null + } + + getFullPeerById(id: number): tl.TypeUser | tl.TypeChat | null { + const cached = this._cache?.get(id) + if (cached) return cached.full + + const row = this._statements.getEntById.get(id) + if (row) { + this._addToCache(id, { + peer: getInputPeer(row), + full: this._readFullPeer(row.full), + }) + return row.full + } + + return null + } +} diff --git a/packages/sqlite/package.json b/packages/sqlite/package.json new file mode 100644 index 00000000..34bfa226 --- /dev/null +++ b/packages/sqlite/package.json @@ -0,0 +1,23 @@ +{ + "name": "@mtcute/sqlite", + "private": true, + "version": "0.0.0", + "description": "SQLite-based storage for MTCute", + "author": "Alisa Sireneva ", + "license": "MIT", + "main": "index.ts", + "scripts": { + "test": "mocha -r ts-node/register tests/**/*.spec.ts", + "docs": "npx typedoc", + "build": "tsc" + }, + "dependencies": { + "@mtcute/core": "^0.0.0", + "@mtcute/tl": "^0.0.0", + "better-sqlite3": "^7.4.0" + }, + "devDependencies": { + "@types/sqlite3": "^3.1.7", + "@types/better-sqlite3": "^5.4.1" + } +} diff --git a/packages/sqlite/tsconfig.json b/packages/sqlite/tsconfig.json new file mode 100644 index 00000000..948bccf8 --- /dev/null +++ b/packages/sqlite/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist" + }, + "include": [ + "./src" + ], + "typedocOptions": { + "name": "@mtcute/client", + "includeVersion": true, + "out": "../../docs/packages/client", + "listInvalidSymbolLinks": true, + "excludePrivate": true, + "entryPoints": [ + "./src/index.ts" + ] + } +} diff --git a/yarn.lock b/yarn.lock index 8a7aa3a0..7b158204 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2423,6 +2423,13 @@ resolved "https://registry.yarnpkg.com/@turist/time/-/time-0.0.1.tgz#57637d2a7d1860adb9f9cecbdcc966ce4f551d63" integrity sha512-M2BiThcbxMxSKX8W4z5u9jKZn6datnM3+FpEU+eYw0//l31E2xhqi7vTAuJ/Sf0P3yhp66SDJgPu3bRRpvrdQQ== +"@types/better-sqlite3@^5.4.1": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-5.4.1.tgz#d45600bc19f8f41397263d037ca9b0d05df85e58" + integrity sha512-8hje3Rhsg/9veTkALfCwiWn7VMrP1QDwHhBSgerttYPABEvrHsMQnU9dlqoM6QX3x4uw3Y06dDVz8uDQo1J4Ng== + dependencies: + "@types/integer" "*" + "@types/chai@^4.2.14": version "4.2.14" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.14.tgz#44d2dd0b5de6185089375d976b4ec5caf6861193" @@ -2523,6 +2530,11 @@ dependencies: "@types/node" "*" +"@types/integer@*": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/integer/-/integer-4.0.0.tgz#3b778715df72d2cf8ba73bad27bd9d830907f944" + integrity sha512-2U1i6bIRiqizl6O+ETkp2HhUZIxg7g+burUabh9tzGd0qcszfNaFRaY9bGNlQKgEU7DCsH5qMajRDW5QamWQbw== + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" @@ -2698,6 +2710,13 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275" integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA== +"@types/sqlite3@^3.1.7": + version "3.1.7" + resolved "https://registry.yarnpkg.com/@types/sqlite3/-/sqlite3-3.1.7.tgz#84fbc65946603d15cff4968d0cb283d1879dd156" + integrity sha512-8FHV/8Uzd7IwdHm5mvmF2Aif4aC/gjrt4axWD9SmfaxITnOjtOhCbOSTuqv/VbH1uq0QrwlaTj9aTz3gmR6u4w== + dependencies: + "@types/node" "*" + "@types/tmp@^0.0.33": version "0.0.33" resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d" @@ -3707,6 +3726,15 @@ better-queue@^3.8.10: node-eta "^0.9.0" uuid "^3.0.0" +better-sqlite3@^7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-7.4.0.tgz#178cec863aa3090cbb0c5392f920925811d6ac87" + integrity sha512-hXwwaFvtYwRfjBSGP6+woB95qbwSnfpXyy/kDFzgOMoDttzyaWsBGcU3FGuRbzhbRv0qpKRCJQ6Hru2pQ8adxg== + dependencies: + bindings "^1.5.0" + prebuild-install "^6.0.1" + tar "^6.1.0" + big-integer@1.6.48, big-integer@^1.6.48: version "1.6.48" resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" @@ -3734,7 +3762,7 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" -bl@^4.0.0: +bl@^4.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== @@ -3743,13 +3771,6 @@ bl@^4.0.0: inherits "^2.0.4" readable-stream "^3.4.0" -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= - dependencies: - inherits "~2.0.0" - bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -5223,6 +5244,13 @@ decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" +decompress-response@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" + integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== + dependencies: + mimic-response "^2.0.0" + dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -5375,7 +5403,7 @@ detect-indent@^6.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== -detect-libc@^1.0.2: +detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= @@ -5678,7 +5706,7 @@ encoding@^0.1.12: dependencies: iconv-lite "^0.6.2" -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== @@ -6291,6 +6319,11 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +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== + express-graphql@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/express-graphql/-/express-graphql-0.9.0.tgz#00fd8552f866bac5c9a4612b2c4c82076107b3c2" @@ -6734,6 +6767,11 @@ fs-capacitor@^6.1.0: resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-6.2.0.tgz#fa79ac6576629163cb84561995602d8999afb7f5" integrity sha512-nKcE1UduoSKX27NSZlg879LdQc94OtbOsEmKMN2MBNudXREvijRKx2GEBsTMTfws+BrbkJoEuynbGSVRSpauvw== +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-exists-cached@1.0.0, fs-exists-cached@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz#cf25554ca050dc49ae6656b41de42258989dcbce" @@ -6800,16 +6838,6 @@ fsevents@~2.3.1: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -fstream@^1.0.0, fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -7475,6 +7503,11 @@ gitconfiglocal@^1.0.0: dependencies: ini "^1.3.2" +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@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -8110,7 +8143,7 @@ hyphenate-style-name@^1.0.3: resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -8134,13 +8167,6 @@ ieee754@^1.1.13, ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore-walk@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" - integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== - dependencies: - minimatch "^3.0.4" - ignore-walk@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" @@ -8249,7 +8275,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, 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== @@ -10103,6 +10129,11 @@ mimic-response@^1.0.0, mimic-response@^1.0.1: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== +mimic-response@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" + integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -10138,7 +10169,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.1.0, minimist@^1.1.3, 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== @@ -10233,6 +10264,11 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" +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== + mkdirp-infer-owner@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316" @@ -10242,7 +10278,7 @@ mkdirp-infer-owner@^2.0.0: infer-owner "^1.0.4" mkdirp "^1.0.3" -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.1: +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -10381,6 +10417,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +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== + native-url@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.2.6.tgz#ca1258f5ace169c716ff44eccbddb674e10399ae" @@ -10393,15 +10434,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -needle@^2.2.1: - version "2.6.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.6.0.tgz#24dbb55f2509e2324b4a99d61f413982013ccdbe" - integrity sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - negotiator@0.6.2, negotiator@~0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -10435,10 +10467,12 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-addon-api@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.1.0.tgz#98b21931557466c6729e51cb77cd39c965f42239" - integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw== +node-abi@^2.21.0: + version "2.26.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.26.0.tgz#355d5d4bc603e856f74197adbf3f5117a396ba40" + integrity sha512-ag/Vos/mXXpWLLAYWsAoQdgS+gW7IwvgMLOgqopm/DbzAjazLltzgzpVMsFlgmo9TzG5hGXeaBZx2AI731RIsQ== + dependencies: + semver "^5.4.1" node-eta@^0.9.0: version "0.9.0" @@ -10455,24 +10489,6 @@ node-forge@^0.10.0: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== -node-gyp@3.x: - version "3.8.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" - integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== - dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - osenv "0" - request "^2.87.0" - rimraf "2" - semver "~5.3.0" - tar "^2.0.0" - which "1" - node-gyp@^5.0.2: version "5.1.1" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e" @@ -10535,22 +10551,6 @@ node-object-hash@^2.0.0: resolved "https://registry.yarnpkg.com/node-object-hash/-/node-object-hash-2.3.1.tgz#5e4a6ac7f932cec4f90aff2fbdb953cb83344416" integrity sha512-ab7pm34jqISawXpJ+fHjj2E9CmzDtm2fTTdurgzbWXIrdTEk2q2cSZRzoeGrwa0cvq6Sqezq6S9bhOBYPHRzuQ== -node-pre-gyp@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054" - integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - node-preload@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" @@ -10571,12 +10571,10 @@ noms@0.0.0: inherits "^2.0.1" readable-stream "~1.0.31" -"nopt@2 || 3": - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" +noop-logger@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" + integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= nopt@^4.0.1: version "4.0.3" @@ -10649,13 +10647,6 @@ normalize-url@^4.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== -npm-bundled@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" - integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== - dependencies: - npm-normalize-package-bin "^1.0.1" - npm-bundled@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" @@ -10698,15 +10689,6 @@ npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.0: semver "^7.0.0" validate-npm-package-name "^3.0.0" -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - npm-packlist@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.1.4.tgz#40e96b2b43787d0546a574542d01e066640d09da" @@ -10754,7 +10736,7 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.2, npmlog@^4.1.2: +npmlog@^4.0.1, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -11021,7 +11003,7 @@ os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@0, osenv@^0.1.4: +osenv@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== @@ -11938,6 +11920,26 @@ postcss@^8.2.8: nanoid "^3.1.22" source-map "^0.6.1" +prebuild-install@^6.0.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.2.tgz#6ce5fc5978feba5d3cbffedca0682b136a0b5bff" + integrity sha512-PzYWIKZeP+967WuKYXlTOhYBgGOvTRSfaKI89XnfJ0ansRAH7hDU45X+K+FZeI1Wb/7p/NnuctPH3g0IqKUuSQ== + dependencies: + detect-libc "^1.0.3" + 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 "^2.21.0" + noop-logger "^0.1.1" + npmlog "^4.0.1" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^3.0.3" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -12743,7 +12745,7 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@^2.87.0, request@^2.88.0, request@^2.88.2: +request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -12913,7 +12915,7 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= -rimraf@2, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -12986,7 +12988,7 @@ sass@^1.32.8: dependencies: chokidar ">=2.0.0 <4.0.0" -sax@^1.2.4, sax@~1.2.4: +sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -13045,7 +13047,7 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -13074,11 +13076,6 @@ semver@^7.3.5: dependencies: lru-cache "^6.0.0" -semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= - send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -13230,6 +13227,20 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +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@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" + integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== + dependencies: + decompress-response "^4.2.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -13538,16 +13549,6 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -sqlite3@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.0.2.tgz#00924adcc001c17686e0a6643b6cbbc2d3965083" - integrity sha512-1SdTNo+BVU211Xj1csWa8lV6KM0CtucDwRyA0VHl91wEH1Mgh7RxUpI4rVvG7OhHrzCSGaVyW5g8vKvlrk9DJA== - dependencies: - node-addon-api "^3.0.0" - node-pre-gyp "^0.11.0" - optionalDependencies: - node-gyp "3.x" - sse-z@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/sse-z/-/sse-z-0.3.0.tgz#e215db7c303d6c4a4199d80cb63811cc28fa55b9" @@ -13957,16 +13958,28 @@ tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== -tar@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" - integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== +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: - block-stream "*" - fstream "^1.0.12" - inherits "2" + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" -tar@^4, tar@^4.4.12: +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" + +tar@^4.4.12: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== @@ -15026,13 +15039,6 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@1, which@^1.2.9, which@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - which@2.0.2, which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -15040,6 +15046,13 @@ which@2.0.2, which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" +which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + wide-align@1.1.3, wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"