From 4e2f08a2c4fe251e7aa9d5ea3b4a4bc8aab554d2 Mon Sep 17 00:00:00 2001 From: Fredrik Lindberg Date: Tue, 29 Aug 2023 17:55:39 +0200 Subject: [PATCH] feat: migrate to ws-multiplex Switches to the ws-multiplex package for websocket multiplexing. BREAKING CHANGE: This brings in a protocol version bump and is not compatible with older clients. --- .github/workflows/branch.yml | 1 + .gitignore | 2 +- .mocharc.json | 8 + package.json | 11 +- src/ingress/http-ingress.js | 1 + src/package.cjs | 1 - src/transport/ws/ws-endpoint.js | 15 +- src/transport/ws/ws-transport.js | 575 ----------------------- src/transport/ws/ws-transport.ts | 46 ++ src/version.js | 2 +- test/e2e/e2e-utils.js | 7 +- test/e2e/test_cluster.js | 16 +- test/system/ingress/test_http_ingress.js | 24 +- test/unit/endpoint/test_ssh-endpoint.js | 2 +- test/unit/ingress/test_sni-ingress.js | 2 +- test/unit/test-utils.js | 47 -- test/unit/test-utils.ts | 92 ++++ test/unit/tunnel/test_tunnel-service.js | 16 +- tsconfig.json | 23 + yarn.lock | 502 +++++++------------- 20 files changed, 385 insertions(+), 1008 deletions(-) create mode 100644 .mocharc.json delete mode 100644 src/package.cjs delete mode 100644 src/transport/ws/ws-transport.js create mode 100644 src/transport/ws/ws-transport.ts delete mode 100644 test/unit/test-utils.js create mode 100644 test/unit/test-utils.ts create mode 100644 tsconfig.json diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 10b424a..05ef128 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -22,6 +22,7 @@ jobs: - name: Run tests run: | yarn install --frozen-lockfile + yarn bundle yarn run test test - name: Prepare builder diff --git a/.gitignore b/.gitignore index a8851ad..889fc3d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,4 @@ build.env build.js exposrd.mjs dist -.pkg-cache +out \ No newline at end of file diff --git a/.mocharc.json b/.mocharc.json new file mode 100644 index 0000000..9123659 --- /dev/null +++ b/.mocharc.json @@ -0,0 +1,8 @@ +{ + "extension": ["js", "ts"], + "require": "ts-node/register", + "node-option": [ + "experimental-specifier-resolution=node", + "loader=ts-node/esm" + ] +} \ No newline at end of file diff --git a/package.json b/package.json index d53b0f4..ae27cad 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "Makefile" ], "dependencies": { + "@exposr/ws-multiplex": "^1.2.0", "better-sqlite3": "^8.3.0", "content-type": "^1.0.5", "koa": "^2.14.1", @@ -40,10 +41,14 @@ "devDependencies": { "@rollup/plugin-commonjs": "^24.0.1", "@rollup/plugin-json": "^6.0.0", + "@types/node": "^20.5.0", + "@types/ws": "^8.5.5", "commit-and-tag-version": "^11.2.1", "mocha": "^10.2.0", "rollup": "^3.18.0", "sinon": "^15.0.3", + "ts-node": "^10.9.1", + "typescript": "^5.1.6", "yaml": "^2.2.2" }, "scripts": { @@ -51,7 +56,11 @@ "postpack": "rm build.env exposrd.mjs", "release": "standard-version", "version": "scripts/build-version.sh", - "bundle": "rollup exposrd.js --file exposrd.mjs --format es -p @rollup/plugin-commonjs -p @rollup/plugin-json", + "prebuild": "rm -fr out && mkdir out && cp package.json out", + "build": "tsc", + "dev": "ts-node-esm exposrd.js", + "prebundle": "yarn run build", + "bundle": "rollup out/exposrd.js --file exposrd.mjs --format es -p @rollup/plugin-commonjs -p @rollup/plugin-json", "dist": "scripts/build-dist.sh", "test": "scripts/run-test.sh" } diff --git a/src/ingress/http-ingress.js b/src/ingress/http-ingress.js index b9cd713..8d129f6 100644 --- a/src/ingress/http-ingress.js +++ b/src/ingress/http-ingress.js @@ -152,6 +152,7 @@ class HttpIngress { _createAgent(tunnelId) { const agent = new Agent({ keepAlive: true, + timeout: this._agent_ttl * 1000, }); agent.createConnection = (opts, callback) => { diff --git a/src/package.cjs b/src/package.cjs deleted file mode 100644 index 4f6c5dd..0000000 --- a/src/package.cjs +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('../package.json'); \ No newline at end of file diff --git a/src/transport/ws/ws-endpoint.js b/src/transport/ws/ws-endpoint.js index 65eca4a..f7ad6e9 100644 --- a/src/transport/ws/ws-endpoint.js +++ b/src/transport/ws/ws-endpoint.js @@ -24,6 +24,7 @@ class WebSocketEndpoint { this.tunnelService = new TunnelService(); this.wss = new WebSocketServer({ noServer: true }); this.destroyed = false; + this.connections = []; this._upgradeHandler = this.httpListener.use('upgrade', { logger: this.logger }, async (ctx, next) => { if (!await this.handleUpgrade(ctx.req, ctx.sock, ctx.head)) { @@ -56,9 +57,13 @@ class WebSocketEndpoint { async destroy() { this.destroyed = true; this.httpListener.removeHandler('upgrade', this._upgradeHandler); - this.wss.clients.forEach((client) => { - client.close(1001, "Server shutting down"); - }); + for (const connection of this.connections) { + const {wst, ws} = connection; + await wst.destroy(); + ws.close(1001, "Server shutting down"); + } + this.connections = []; + this.wss.close(); return Promise.allSettled([ this.tunnelService.destroy(), Listener.release('http', this.opts.port), @@ -167,8 +172,10 @@ class WebSocketEndpoint { operation: 'upgrade', msg: 'failed to connect transport' }); - ws.close(1008, "unable to establish tunnel"); transport.destroy(); + ws.close(1008, "unable to establish tunnel"); + } else { + this.connections.push({wst: transport, ws}); } }); return true; diff --git a/src/transport/ws/ws-transport.js b/src/transport/ws/ws-transport.js deleted file mode 100644 index 063451d..0000000 --- a/src/transport/ws/ws-transport.js +++ /dev/null @@ -1,575 +0,0 @@ -import assert from 'assert/strict'; -import { ECONNREFUSED, EINPROGRESS, EMFILE, EPIPE, ETIMEDOUT } from 'constants'; -import { EventEmitter } from 'events'; -import { Duplex } from 'stream'; -import WebSocket, { createWebSocketStream } from 'ws'; -import { Logger } from '../../logger.js'; -import CustomError from '../../utils/errors.js'; -import Transport from '../transport.js'; - -// Multiplexes multiple streams over one websocket connection -// Bi-directional channel creation. -// -// Frame format -// 0 2 4 8 12 -// [VERSION][TYPE][CHANNEL][LENGTH][DATA...] -// -class WebSocketTransport extends Transport { - static MAX_CHANNELS = 65536; - - static MESSAGE_DATA = 1; - static MESSAGE_CON = 2; - static MESSAGE_CONACK = 3; - static MESSAGE_FIN = 4; - static MESSAGE_PAUSE = 5; - static MESSAGE_RESUME = 6; - - static packetTraceEnabled = false; - _packetTrace(dir, channel, type, length) { - WebSocketTransport.packetTraceEnabled && - this.logger.trace(`PKT ${dir} : ch=${channel} type=${type} length=${length}`); - } - - constructor(opts) { - super(opts); - this._socket = opts.socket; - assert(this._socket !== undefined); - this._tunnelId = opts.tunnelId; - this._socketStream = createWebSocketStream(this._socket, { - objectMode: false, - readableObjectMode: false, - writableObjectMode: false, - setDefaultEncoding: 'binary' - }); - - this.openSockets = {}; - this._eventBus = new EventEmitter(); - this.logger = Logger("ws-transport"); - this.logger.addContext("tunnel", this._tunnelId); - - this._socketStream.on('data', (chunk) => { - const {header, data} = this._decodeMessage(chunk); - this._packetTrace('<', header.channel, header.type, header.length); - this._parseMessage(header, data); - }); - - this._socket.once('close', () => { - this.destroy(); - }); - - this._socket.on('pong', () => { - this._alive = true; - }); - this._alive = true; - this._keepAlive = setInterval(() => { - if (this._alive === false) { - this.logger.info("No heartbeat for 30000ms"); - return this.destroy(); - } - this._alive = false; - this._socket.ping(); - }, 30000); - - this.maxChannels = opts.maxChannels || WebSocketTransport.MAX_CHANNELS; - this.channelId = 0; - } - - _decodeMessage(chunk) { - const headerBuffer = chunk.slice(0, 12); - const data = chunk.slice(12); - const header = { - version: headerBuffer.readUInt16BE(0), - type: headerBuffer.readUInt16BE(2), - channel: headerBuffer.readUInt32BE(4), - length: headerBuffer.readUInt32BE(8), - }; - return {header, data}; - } - - _parseMessage(header, data) { - if (header.type === WebSocketTransport.MESSAGE_DATA) { - this._channelData(header.channel, data, header.length); - } else if (header.type === WebSocketTransport.MESSAGE_CON) { - this._eventBus.emit('connect', header.channel); - } else if (header.type === WebSocketTransport.MESSAGE_CONACK) { - this._eventBus.emit(`ack-${header.channel}`, header.channel); - } else if (header.type === WebSocketTransport.MESSAGE_FIN) { - this._eventBus.emit(`fin-${header.channel}`, header.channel); - } else if (header.type === WebSocketTransport.MESSAGE_PAUSE) { - this._pauseChannel(header.channel); - } else if (header.type === WebSocketTransport.MESSAGE_RESUME) { - this._resumeChannel(header.channel); - } else { - this.logger.debug(`Unknown type ${header.type} header=${JSON.stringify(header)}`) - } - } - - _sendMessage(type, channel, data = undefined, callback) { - assert(channel !== undefined); - if (this._socket.readyState !== WebSocket.OPEN) { - return callback(new CustomError(EPIPE, `websocket transport closed fd=${channel}`)); - } - const header = Buffer.allocUnsafe(12); - header.writeUInt16BE(1, 0) - header.writeUInt16BE(type, 2); - header.writeUInt32BE(channel, 4); - header.writeUInt32BE(data !== undefined ? data.length : 0, 8); - - try { - this._packetTrace('>', channel, type, data != undefined ? data.length : 0); - this._socket.send(header, { - binary: true, - compress: false, - fin: data == undefined, - }); - if (data != undefined) { - this._socket.send(data, { - binary: true, - compress: false, - fin: true, - }, callback) - } else { - callback(); - } - return true; - } catch (err) { - callback(err); - return false; - } - } - - _channelData(fd, data, length) { - const socket = this.openSockets[fd]; - if (socket === undefined) { - this.logger.debug(`data on non-connected channel fd=${fd}`) - this.logger.isTraceEnabled() && - this.logger.trace({ - msg: 'data on non-connected channel', - fd, - length, - data - }); - this._sendMessage(WebSocketTransport.MESSAGE_FIN, fd, undefined, () => {}) - return; - } - const result = socket.push(data); - if (!result) { - socket.pause(); - } - } - - _pauseChannel(fd) { - const socket = this.openSockets[fd]; - if (!socket) { - return; - } - socket.cork(); - } - - _resumeChannel(fd) { - const socket = this.openSockets[fd]; - if (!socket) { - return; - } - socket.uncork(); - } - - _pauseRemoteChannel(sock, callback) { - assert(sock !== undefined); - const fd = sock.fd; - assert(fd !== undefined); - this._sendMessage(WebSocketTransport.MESSAGE_PAUSE, fd, undefined, callback); - } - - _resumeRemoteChannel(sock, callback) { - assert(sock !== undefined); - const fd = sock.fd; - assert(fd !== undefined); - this._sendMessage(WebSocketTransport.MESSAGE_RESUME, fd, undefined, callback); - } - - _send(sock, data, callback) { - assert(sock !== undefined); - const fd = sock.fd; - assert(fd !== undefined); - return this._sendMessage(WebSocketTransport.MESSAGE_DATA, fd, data, callback); - } - - async _openChannel(sock, timeout, callback) { - assert(sock !== undefined); - if (sock.fd === undefined) { - sock.fd = await this._getChannelId(1000); - if (sock.fd == undefined) { - return callback(new CustomError(EMFILE, `No channels free ${sock?.toString()}`)); - } - } - - const fd = sock.fd; - this.openSockets[fd] = sock; - - let connectTimeout; - - const handle = (err) => { - this._eventBus.removeAllListeners(`ack-${fd}`); - this._eventBus.removeAllListeners(`fin-${fd}`); - connectTimeout && clearTimeout(connectTimeout); - if (!err) { - this._eventBus.once(`fin-${fd}`, (fd) => { - sock.destroy(); - }); - } else { - this._destroy(fd); - } - callback(err); - }; - - this._sendMessage(WebSocketTransport.MESSAGE_CON, fd, undefined, (err) => { - if (err) { - return callback(err); - } - this._eventBus.once(`ack-${fd}`, (fd) => { - handle(); - }); - this._eventBus.once(`fin-${fd}`, (fd) => { - handle(new CustomError(ECONNREFUSED, `connection refused ${sock?.toString()}`)); - }); - connectTimeout = setTimeout(() => { - handle(new CustomError(ETIMEDOUT, `connection timeout ${sock?.toString()}`)); - }, timeout); - }); - } - - _closeChannel(sock, callback) { - assert(sock !== undefined); - const fd = sock.fd; - assert(sock !== undefined); - this._sendMessage(WebSocketTransport.MESSAGE_FIN, fd, undefined, () => { - this._destroy(fd); - callback(); - }); - } - - _destroy(fd) { - this._eventBus.removeAllListeners(`ack-${fd}`); - this._eventBus.removeAllListeners(`fin-${fd}`); - delete this.openSockets[fd]; - this._eventBus.emit('close', fd); - } - - async _getChannelId(timeout) { - - if (Object.keys(this.openSockets).length >= this.maxChannels) { - const startWait = process.hrtime.bigint(); - await new Promise((resolve) => { - const onEvent = () => { - clearTimeout(onTimer); - this._eventBus.removeListener('close', onEvent) - resolve(); - } - const onTimer = setTimeout(onEvent, timeout); - this._eventBus.once('close', onEvent); - }); - const elapsedMs = Number((process.hrtime.bigint() - BigInt(startWait))) / 1e6; - - if (Object.keys(this.openSockets).length >= this.maxChannels) { - timeout -= elapsedMs; - return timeout > 0 ? this._getChannelId(timeout) : undefined; - } else { - return undefined; - } - } - - let nextChannel = this.channelId; - for (let i = 0; i < this.maxChannels; i++) { - if (this.openSockets[nextChannel] === undefined) { - this.channelId = (nextChannel + 1) % this.maxChannels; - return nextChannel; - } - nextChannel = (nextChannel + 1) % this.maxChannels; - } - - return undefined; - } - - _createSock(opts = {}) { - const self = this; - const sock = new WebSocketTransportSocket({ - ...opts, - open: async (sock, timeout, cb) => { return this._openChannel(sock, timeout, cb); }, - close: (sock, cb) => { return this._closeChannel(sock, cb); }, - send: (sock, chunk, cb) => { return this._send(sock, chunk, cb); }, - pause: (sock, cb) => { return this._pauseRemoteChannel(sock, cb); }, - resume: (sock, cb) => { return this._resumeRemoteChannel(sock, cb); }, - logger: self.logger, - }); - return sock; - } - - createConnection(opts = {}, callback) { - const sock = this._createSock(); - sock.connect(opts, callback); - return sock; - } - - listen(callback) { - this._eventBus.on('connect', (fd) => { - if (this.openSockets[fd] !== undefined) { - if (this.openSockets[fd].state == WebSocketTransportSocket.OPEN) { - return; - } else { - this.openSockets[fd].fd = undefined; - this.openSockets[fd].destroy(); - this._destroy(fd); - } - } - - if (Object.keys(this.openSockets).length < this.maxChannels) { - this._sendMessage(WebSocketTransport.MESSAGE_CONACK, fd, undefined, () => { - const sock = this._createSock({fd: fd}); - this.openSockets[fd] = sock; - callback(sock); - }); - } else { - this.logger.debug(`connection attempt on fd=${fd} rejected, at limit (${this.maxChannels})`); - this._sendMessage(WebSocketTransport.MESSAGE_FIN, fd, undefined, () => {}); - } - }); - } - - close() { - this._eventBus.removeAllListeners('connect'); - } - - async destroy() { - if (this.destroyed) { - return; - } - this.logger.debug(`transport destroy, open_sockets=${Object.keys(this.openSockets).length}`); - Object.keys(this.openSockets).forEach((fd) => { - const sock = this.openSockets[fd]; - sock.destroy(); - }); - this._keepAlive && clearInterval(this._keepAlive); - this._keepAlive = false; - this._socket.close(1000, "Connection closed"); - this._socket.removeAllListeners(); - this._eventBus.removeAllListeners('connect'); - this._socketStream.removeAllListeners('data'); - this._socketStream.destroy(); - this.destroyed = true; - this.emit('close'); - } -} - -export default WebSocketTransport; - -// Exposes one multiplexed channel as a socket interface -class WebSocketTransportSocket extends Duplex { - - static CONNECTING = 'connecting'; - static PENDING = 'pending'; - static PAUSED = 'paused'; - static OPEN = 'open'; - static HALFOPEN = 'halfopen'; - static ENDED = 'ended'; - - constructor(opts) { - super({ - setDefaultEncoding: 'binary' - }); - this.remote = { - open: opts.open, - close: opts.close, - send: opts.send, - pause: opts.pause, - resume: opts.resume - }; - this.logger = opts.logger; - this.fd = opts.fd; - this.state = undefined; - this.connecting = false; - this.destroyed = false; - this.pending = true; - this.readyState = undefined; - this.bytesRead = 0; - this.bytesWritten = 0; - - if (this.fd !== undefined) { - this.state = WebSocketTransportSocket.PENDING; - } - - this.cork(); - - this.logger.isTraceEnabled() && this.logger.trace(`new socket fd=${this.fd} state=${this.state}`); - } - - toString() { - return `<${WebSocketTransportSocket.name} fd=${this.fd} state=${this.state}>`; - } - - connect(opts = {}, callback = undefined) { - if (this.state === WebSocketTransportSocket.CONNECTING) { - callback(new CustomError(EINPROGRESS, `connection already in progress ${this.toString}`)); - return; - } - this.connecting = true; - this.readyState = "opening"; - this.state = WebSocketTransportSocket.CONNECTING; - if (typeof callback === 'function') { - this.once('connect', () => { - callback(); - }); - } - this.remote.open(this, 1000, (err) => { - if (this.state !== WebSocketTransportSocket.CONNECTING) { - return; - } - this.logger.isTraceEnabled() && this.logger.trace(`connect fd=${this.fd} err=${err}`); - this.connecting = false; - this.pending = false; - if (!err) { - this.emit('connect'); - this._ready(); - } else { - typeof callback === 'function' && this.removeListener('connect', callback); - this.readyState = undefined; - this._close(err); - } - }); - } - - accept() { - this._ready(); - } - - _ready() { - this.readyState = "open"; - this.state = WebSocketTransportSocket.OPEN; - this.emit('ready'); - this.uncork(); - this.resume(); - this.logger.isTraceEnabled() && this.logger.trace(`_ready fd=${this.fd} paused=${this.isPaused()}`); - } - - _close(err) { - this.logger.isTraceEnabled() && this.logger.trace(`_close fd=${this.fd} state=${this.state} err=${err}`); - if (err) { - this.emit('error', err); - } - this.emit('close', err != undefined); - this.readyState = undefined; - this.state = WebSocketTransportSocket.ENDED; - this.wasFd = this.fd; - this.fd = undefined; - } - - _destroy(error, callback) { - this.logger.isTraceEnabled() && this.logger.trace(`destroy fd=${this.fd} state=${this.state} err=${error}`); - - if (this.fd !== undefined) { - this.remote.close(this, () => { - this._close(error); - this.destroyed = true; - typeof callback === 'function' && callback(); - }); - } else { - this.destroyed = true; - this._close(error); - typeof callback === 'function' && callback(); - } - } - - end(data, encoding, callback) { - super.end(data, encoding, () => { - if (this.destroyed) { - typeof callback === 'function' && callback(); - return; - } - this.readyState = "readOnly"; - this.state = WebSocketTransportSocket.HALFOPEN; - this.remote.close(this, () => { - typeof callback === 'function' && callback(); - }); - }); - - return this; - } - - push(chunk, encoding) { - this.bytesRead += chunk.length; - return super.push(chunk, encoding); - } - - pause() { - if (this.state === WebSocketTransportSocket.OPEN) { - this.state = WebSocketTransportSocket.PAUSED; - super.pause(); - this.remote.pause(this, () => { - }); - } else { - super.pause(); - } - } - - resume() { - if (this.state === WebSocketTransportSocket.PAUSED) { - this.state = WebSocketTransportSocket.OPEN; - this.remote.resume(this, () => { - super.resume(); - }); - } else if (this.state === WebSocketTransportSocket.OPEN) { - super.resume(); - } - } - - cork() { - super.cork(); - } - - uncork() { - if (this.state === WebSocketTransportSocket.OPEN) { - super.uncork(); - } - } - - _write(data, encoding, callback) { - this.bytesWritten += data.length; - return this.remote.send(this, data, callback); - } - - _writev(chunks, callback) { - chunks.map(({chunk, encoding}) => { - return this._write(chunk, encoding, () => {}); - }) - callback(); - } - - _read(size) { - this.resume(); - } - - setEncoding(encoding) { - super.setEncoding(encoding); - } - - setKeepAlive(enable, initialDelay) { - return this; - } - - setNoDelay(noDelay) { - return this; - } - - setTimeout(timeout, callback) { - return this; - } - - ref() { - return this; - } - - unref() { - return this; - } - -} \ No newline at end of file diff --git a/src/transport/ws/ws-transport.ts b/src/transport/ws/ws-transport.ts new file mode 100644 index 0000000..af27fab --- /dev/null +++ b/src/transport/ws/ws-transport.ts @@ -0,0 +1,46 @@ +import WebSocket from 'ws'; +import Transport from '../transport.js'; +import { WebSocketMultiplex } from '@exposr/ws-multiplex'; +import { Duplex } from 'stream'; + +export type WebSocketTransportOptions = { + tunnelId: string, + max_connections: number, + socket: WebSocket, +}; + +export default class WebSocketTransport extends Transport { + private wsm: WebSocketMultiplex; + private destroyed: boolean = false; + + constructor(options: WebSocketTransportOptions) { + super({ + max_connections: options.max_connections + }); + + this.wsm = new WebSocketMultiplex(options.socket, { + reference: options.tunnelId + }); + + this.wsm.on('error', (err: Error) => { + this._destroy(err); + }); + } + + public createConnection(opts: object = {}, callback: (err: Error | undefined, sock: Duplex) => void): any { + return this.wsm.createConnection({}, callback); + } + + public async destroy(): Promise { + return this._destroy(); + } + + private async _destroy(err?: Error): Promise { + if (this.destroyed) { + return; + } + this.destroyed = true; + await this.wsm.destroy(); + this.emit('close', err); + } +} \ No newline at end of file diff --git a/src/version.js b/src/version.js index ce63e4b..7171c96 100644 --- a/src/version.js +++ b/src/version.js @@ -8,7 +8,7 @@ import { BUILD_VERSION, } from '../build.js'; -import package_json from './package.cjs'; +import package_json from '../package.json' assert { type: "json" }; class Version { diff --git a/test/e2e/e2e-utils.js b/test/e2e/e2e-utils.js index 7a534b5..64077dd 100644 --- a/test/e2e/e2e-utils.js +++ b/test/e2e/e2e-utils.js @@ -4,6 +4,7 @@ import ssh from 'ssh2'; import net from 'net'; import crypto from 'crypto'; +export const exposrCliImageTag = "unstable"; const defaultBaseApi = "http://localhost:8080"; export const sshClient = (host, port, username, password, target) => { @@ -55,7 +56,9 @@ export const createEchoServer = async (port = 10000) => { return async () => { server.removeAllListeners('request'); - server.close(); + await new Promise((resolve) => { + server.close(resolve); + }); }; }; @@ -104,7 +107,7 @@ export const startExposr = (args, port) => { const obj = child_process.spawn("docker", [ "run", "--rm", "-t", "--add-host", "host.docker.internal:host-gateway", "--name", name, - "exposr/exposr:latest", + `ghcr.io/exposr/exposr:${exposrCliImageTag}`, "--non-interactive", "-s", `http://host.docker.internal:${port}`, ].concat(args), {detached: true}); diff --git a/test/e2e/test_cluster.js b/test/e2e/test_cluster.js index 68bd397..eacef51 100644 --- a/test/e2e/test_cluster.js +++ b/test/e2e/test_cluster.js @@ -2,15 +2,16 @@ import child_process from 'child_process'; import crypto from 'crypto'; import assert from 'assert/strict'; import { setTimeout } from 'timers/promises'; -import { createAccount, createEchoServer, getAuthToken, getTunnel, putTunnel } from './e2e-utils.js'; +import { createAccount, createEchoServer, exposrCliImageTag, getAuthToken, getTunnel, putTunnel } from './e2e-utils.js'; const startExposrd = (name = "", network, args = [], dockerargs = []) => { const obj = child_process.spawn("docker", [ "run", "--rm", "-t", "-v", `${process.cwd()}:/app`, "--name", name, "--network", network, + "--workdir", "/app", "--add-host", "host.docker.internal:host-gateway", ].concat(dockerargs).concat([ - "node:18-alpine3.17", - "/app/exposrd.js" + "node:18-alpine3.18", + "exposrd.mjs" ]).concat(args), {detached: true}); let buf = ''; @@ -39,7 +40,7 @@ export const startExposr = (server, network, args) => { "run", "--rm", "-t", "--add-host", "host.docker.internal:host-gateway", "--name", name, "--net", network, - "exposr/exposr:latest", + `ghcr.io/exposr/exposr:${exposrCliImageTag}`, "--non-interactive", "-s", server, ].concat(args), {detached: true}); @@ -152,16 +153,15 @@ describe('Cluster E2E', () => { body: "echo" }) - assert(res.status == 200, `expected status code 200, got ${res.status}`); data = await res.text() - assert(data == "echo", `did not get response from echo server through WS tunnel, got ${data}`) exposrCliTerminator(); await echoServerTerminate(); node1.terminate(); node2.terminate(); - }).timeout(120000); + assert(res.status == 200, `expected status code 200, got ${res.status}`); + assert(data == "echo", `did not get response from echo server through WS tunnel, got ${data}`); + }).timeout(120000); }); - }); \ No newline at end of file diff --git a/test/system/ingress/test_http_ingress.js b/test/system/ingress/test_http_ingress.js index f10a9ed..93efa0f 100644 --- a/test/system/ingress/test_http_ingress.js +++ b/test/system/ingress/test_http_ingress.js @@ -5,7 +5,7 @@ import EventBus from "../../../src/cluster/eventbus.js"; import Config from "../../../src/config.js"; import Ingress from "../../../src/ingress/index.js"; import TunnelService from "../../../src/tunnel/tunnel-service.js"; -import { initClusterService, initStorageService, socketPair, wsSocketPair } from "../../unit/test-utils.js"; +import { initClusterService, initStorageService, wsSocketPair, wsmPair } from "../../unit/test-utils.ts"; import WebSocketTransport from '../../../src/transport/ws/ws-transport.js'; import { setTimeout } from 'timers/promises'; import sinon from 'sinon'; @@ -76,17 +76,9 @@ describe('http ingress', () => { }); it('agent does not timeout during transfer', async () => { - const [sock1, sock2, wss] = await wsSocketPair(9000) + const sockPair = await wsSocketPair.create(9000) - const client = new WebSocketTransport({ - tunnelId: tunnel.id, - socket: sock1, - }); - - const transport = new WebSocketTransport({ - tunnelId: tunnel.id, - socket: sock2, - }); + const [client, transport] = wsmPair(sockPair) let res = await tunnelService.connect(tunnel.id, account.id, transport, {peer: "127.0.0.1"}); assert(res == true, "failed to connect tunnel"); @@ -99,7 +91,7 @@ describe('http ingress', () => { } while (tun.state().connected == false && i++ < 10); assert(tun.state().connected == true, "tunnel not connected") - client.listen((sock) => { + client.on('connection', (sock) => { sock.on('data', async (chunk) => { //console.log(chunk.toString()); sock.write("HTTP/1.1 200\r\nContent-Length: 2\r\n\r\n"); @@ -108,8 +100,6 @@ describe('http ingress', () => { sock.write("A"); sock.end(); }); - - sock.accept(); }); res = await fetch("http://127.0.0.1:10000", { @@ -122,9 +112,9 @@ describe('http ingress', () => { const data = await res.text(); assert(data == "AA", `did not get expected reply, got ${data}`); - sock1.close(); - sock2.close(); - wss.close(); + await client.destroy(); + await transport.destroy(); + await sockPair.terminate(); }).timeout(2000); }); \ No newline at end of file diff --git a/test/unit/endpoint/test_ssh-endpoint.js b/test/unit/endpoint/test_ssh-endpoint.js index 281d57a..af864f4 100644 --- a/test/unit/endpoint/test_ssh-endpoint.js +++ b/test/unit/endpoint/test_ssh-endpoint.js @@ -1,7 +1,7 @@ import assert from 'assert/strict'; import Tunnel from '../../../src/tunnel/tunnel.js'; import SSHEndpoint from '../../../src/transport/ssh/ssh-endpoint.js'; -import { initClusterService, initStorageService } from '../test-utils.js' +import { initClusterService, initStorageService } from '../test-utils.ts' import Config from '../../../src/config.js'; import Ingress from '../../../src/ingress/index.js'; diff --git a/test/unit/ingress/test_sni-ingress.js b/test/unit/ingress/test_sni-ingress.js index 17a0790..ed7d87b 100644 --- a/test/unit/ingress/test_sni-ingress.js +++ b/test/unit/ingress/test_sni-ingress.js @@ -3,7 +3,7 @@ import Tunnel from '../../../src/tunnel/tunnel.js'; import assert from 'assert/strict'; import { X509Certificate } from 'crypto'; import fs from 'fs'; -import { initClusterService, initStorageService } from '../test-utils.js' +import { initClusterService, initStorageService } from '../test-utils.ts' import Config from '../../../src/config.js'; import Ingress from '../../../src/ingress/index.js'; import TunnelService from '../../../src/tunnel/tunnel-service.js'; diff --git a/test/unit/test-utils.js b/test/unit/test-utils.js deleted file mode 100644 index 284b5a2..0000000 --- a/test/unit/test-utils.js +++ /dev/null @@ -1,47 +0,0 @@ -import { WebSocket, WebSocketServer } from "ws"; -import ClusterService from "../../src/cluster/index.js"; -import { StorageService } from "../../src/storage/index.js"; -import { Duplex } from 'stream'; - -export const initStorageService = async () => { - return new Promise((resolve) => { - const storage = new StorageService({ - url: new URL('memory://'), - callback: () => { resolve(storage) } - }); - }); -}; - -export const initClusterService = () => { - return new ClusterService('mem', {}); -} - -export const socketPair = () => { - const sock1 = new Duplex({read(size) {}}); - const sock2 = new Duplex({read(size) {}}); - - sock1._write = (chunk, encoding, callback) => { - sock2.push(chunk); - callback(); - }; - - sock2._write = (chunk, encoding, callback) => { - sock1.push(chunk); - callback(); - }; - - return [sock1, sock2]; -}; - -export const wsSocketPair = async (port = 10000) => { - const wss = new WebSocketServer({ port }); - - return new Promise((resolve, reject) => { - let sock1; - wss.on('connection', function connection(sock2) { - resolve([sock1, sock2, wss]); - }); - sock1 = new WebSocket(`ws://127.0.0.1:${port}`); - sock1.on('error', reject); - }); -}; \ No newline at end of file diff --git a/test/unit/test-utils.ts b/test/unit/test-utils.ts new file mode 100644 index 0000000..26612fa --- /dev/null +++ b/test/unit/test-utils.ts @@ -0,0 +1,92 @@ +import { WebSocket, WebSocketServer } from "ws"; +import ClusterService from "../../src/cluster/index.js"; +import { StorageService } from "../../src/storage/index.js"; +import { Duplex } from 'stream'; +import { WebSocketMultiplex } from "@exposr/ws-multiplex"; + +export const initStorageService = async () => { + return new Promise((resolve) => { + const storage = new StorageService({ + url: new URL('memory://'), + callback: () => { resolve(storage) } + }); + }); +}; + +export const initClusterService = () => { + return new ClusterService('mem', {}); +} + +export const socketPair = () => { + const sock1 = new Duplex({read(size) {}}); + const sock2 = new Duplex({read(size) {}}); + + sock1._write = (chunk, encoding, callback) => { + sock2.push(chunk); + callback(); + }; + + sock2._write = (chunk, encoding, callback) => { + sock1.push(chunk); + callback(); + }; + + return [sock1, sock2]; +}; + +export class wsSocketPair { + public sock1: WebSocket; + public sock2: WebSocket; + public wss: WebSocketServer; + + static async create(port: number = 10000): Promise { + + const [server, sock] = await Promise.all([ + new Promise((resolve, reject) => { + const wss = new WebSocketServer({ port }); + wss.on('error', () => { }); + wss.on('connection', function connection(client) { + resolve([client, wss]); + }); + + }), + new Promise((resolve, reject) => { + let sock: WebSocket; + sock = new WebSocket(`ws://127.0.0.1:${port}`); + sock.once('error', reject); + sock.once('open', () => { + sock.off('error', reject); + resolve(sock); + }); + }) + ]); + const [client, wss] = (server as Array); + + const socketPair = new wsSocketPair(sock as WebSocket, client as WebSocket, wss as WebSocketServer); + return socketPair; + } + + private constructor(sock1: WebSocket, sock2: WebSocket, wss: WebSocketServer) { + this.sock1 = sock1; + this.sock2 = sock2; + this.wss = wss; + } + + async terminate(): Promise { + this.sock1?.terminate(); + this.sock2?.terminate(); + await new Promise((resolve) => { this.wss.close(resolve); }); + } +} + +export const wsmPair = (socketPair: wsSocketPair, options?: Object): Array => { + const wsm1 = new WebSocketMultiplex(socketPair.sock1, { + ...options, + reference: "wsm1" + }); + const wsm2 = new WebSocketMultiplex(socketPair.sock2, { + ...options, + reference: "wsm2" + }); + return [wsm1, wsm2]; +}; \ No newline at end of file diff --git a/test/unit/tunnel/test_tunnel-service.js b/test/unit/tunnel/test_tunnel-service.js index 4313576..0c33e17 100644 --- a/test/unit/tunnel/test_tunnel-service.js +++ b/test/unit/tunnel/test_tunnel-service.js @@ -7,8 +7,8 @@ import ClusterService from '../../../src/cluster/index.js'; import Ingress from '../../../src/ingress/index.js'; import AccountService from '../../../src/account/account-service.js'; import Tunnel from '../../../src/tunnel/tunnel.js'; -import WebSocketTransport from '../../../src/transport/ws/ws-transport.js'; -import { initStorageService, socketPair } from '../test-utils.js'; +import WebSocketTransport from '../../../src/transport/ws/ws-transport.ts'; +import { initStorageService, wsSocketPair } from '../test-utils.ts'; import EventBus from '../../../src/cluster/eventbus.js'; describe('tunnel service', () => { @@ -446,11 +446,10 @@ describe('tunnel service', () => { assert(tunnel instanceof Tunnel, `tunnel not created, got ${tunnel}`); assert(tunnel?.id == tunnelId, `expected id ${tunnelId}, got ${tunnel?.id}`); - const [sock1, sock2] = socketPair(); - sock1.close = (code, reason) => { sock1.destroy() }; + const sockPair = await wsSocketPair.create(); const transport = new WebSocketTransport({ tunnelId: tunnelId, - socket: sock1, + socket: sockPair.sock1, }) const msg = new Promise((resolve) => { @@ -477,6 +476,7 @@ describe('tunnel service', () => { await tunnelService.destroy(); await bus.destroy(); await transport.destroy(); + await sockPair.terminate(); }); it(`can authorize a tunnel`, async () => { @@ -509,11 +509,10 @@ describe('tunnel service', () => { assert(tunnel instanceof Tunnel, `tunnel not created, got ${tunnel}`); assert(tunnel?.id == tunnelId, `expected id ${tunnelId}, got ${tunnel?.id}`); - const [sock1, sock2] = socketPair(); - sock1.close = (code, reason) => { sock1.destroy() }; + const sockPair = await wsSocketPair.create(); const transport = new WebSocketTransport({ tunnelId: tunnelId, - socket: sock1, + socket: sockPair.sock1, }) const msg = new Promise((resolve) => { @@ -542,6 +541,7 @@ describe('tunnel service', () => { await tunnelService.destroy(); await bus.destroy(); await transport.destroy(); + await sockPair.terminate(); }); }); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..408e563 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "lib": ["es2021", "dom"], + "module": "NodeNext", + "target": "es2021", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "NodeNext", + "declaration": true, + "allowJs": true, + "outDir": "./out", + "rootDir": "./" + }, + "include": [ + "exposrd.js", + "build.js", + "package.cjs", + "src/**/*" + ], + "exclude": ["node_modules"] +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 57a1d34..505b91d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,30 +9,11 @@ dependencies: "@babel/highlight" "^7.16.7" -"@babel/generator@7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d" - integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== - dependencies: - "@babel/types" "^7.18.2" - "@jridgewell/gen-mapping" "^0.3.0" - jsesc "^2.5.1" - -"@babel/helper-string-parser@^7.18.10", "@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - "@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-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - "@babel/highlight@^7.16.7": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" @@ -42,28 +23,20 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@7.18.4": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.4.tgz#6774231779dd700e0af29f6ad8d479582d7ce5ef" - integrity sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow== - -"@babel/types@7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.0.tgz#75f21d73d73dc0351f3368d28db73465f4814600" - integrity sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: - "@babel/helper-string-parser" "^7.18.10" - "@babel/helper-validator-identifier" "^7.18.6" - to-fast-properties "^2.0.0" + "@jridgewell/trace-mapping" "0.3.9" -"@babel/types@^7.18.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" - integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== +"@exposr/ws-multiplex@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@exposr/ws-multiplex/-/ws-multiplex-1.2.0.tgz#2f105e25923f5dc5c3f496d2b2b4cc118db50a8f" + integrity sha512-Eb0LKX50NeQ9xzEthHbJNUhlbHilcg1Ppo6CzzENrEnq8mKccDfoVPQH2lS5K5q75SqXVHRZQiZFAzCsZneMLA== dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" + bufferutil "^4.0.7" + ws "^8.13.0" "@hapi/hoek@^9.0.0": version "9.3.0" @@ -82,37 +55,28 @@ resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13": +"@jridgewell/sourcemap-codec@^1.4.13": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" "@koa/router@^10.0.0": version "10.1.1" @@ -125,27 +89,6 @@ methods "^1.1.2" path-to-regexp "^6.1.0" -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - "@redis/bloom@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@redis/bloom/-/bloom-1.2.0.tgz#d3fd6d3c0af3ef92f26767b56414a370c7b63b71" @@ -260,6 +203,26 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + "@types/estree@*": version "0.0.51" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" @@ -275,11 +238,28 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== +"@types/node@*": + version "20.4.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.9.tgz#c7164e0f8d3f12dfae336af0b1f7fdec8c6b204f" + integrity sha512-8e2HYcg7ohnTUbHk8focoklEQYvemQmu9M/f43DZVx43kHn0tE3BY/6gSDxS7k0SprtS0NHvj+L80cGLnoOUcQ== + +"@types/node@^20.5.0": + version "20.5.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.0.tgz#7fc8636d5f1aaa3b21e6245e97d56b7f56702313" + integrity sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q== + "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== +"@types/ws@^8.5.5": + version "8.5.5" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" + integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== + dependencies: + "@types/node" "*" + JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -296,18 +276,21 @@ accepts@^1.3.5: mime-types "~2.1.34" negotiator "0.6.3" +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== -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-colors@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" @@ -340,6 +323,11 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -350,11 +338,6 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -372,11 +355,6 @@ assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - await-busboy@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/await-busboy/-/await-busboy-1.0.3.tgz#11b8941191c4b0fe5123988dab626ea88220119b" @@ -456,7 +434,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: +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== @@ -486,6 +464,13 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" +bufferutil@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" + integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== + dependencies: + node-gyp-build "^4.3.0" + buildcheck@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/buildcheck/-/buildcheck-0.0.3.tgz#70451897a95d80f7807e68fc412eb2e7e35ff4d5" @@ -547,7 +532,7 @@ chalk@^2.0.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.1.0, chalk@^4.1.2: +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== @@ -899,6 +884,11 @@ cpu-features@~0.0.4: buildcheck "0.0.3" nan "^2.15.0" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + dargs@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" @@ -921,13 +911,6 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - debug@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" @@ -935,6 +918,13 @@ debug@4.1.1: dependencies: ms "^2.1.1" +debug@4.3.4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" @@ -1017,18 +1007,16 @@ diff@5.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + diff@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - dot-prop@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -1111,24 +1099,6 @@ expand-template@^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== -fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - figures@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -1198,14 +1168,6 @@ fresh@~0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -from2@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" @@ -1220,16 +1182,6 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1320,7 +1272,7 @@ github-from-package@0.0.0: resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -1350,18 +1302,6 @@ glob@^8.0.3: minimatch "^5.0.1" once "^1.3.0" -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -1460,14 +1400,6 @@ http-errors@^1.6.3, http-errors@^1.7.3, http-errors@~1.8.0: statuses ">= 1.5.0 < 2" toidentifier "1.0.1" -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -1480,11 +1412,6 @@ ieee754@^1.1.13: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -1503,7 +1430,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +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== @@ -1513,14 +1440,6 @@ ini@^1.3.2, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -into-stream@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-6.0.0.tgz#4bfc1244c0128224e18b8870e85b2de8e66c6702" - integrity sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA== - dependencies: - from2 "^2.3.0" - p-is-promise "^3.0.0" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -1533,7 +1452,7 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-core-module@2.9.0, is-core-module@^2.5.0, is-core-module@^2.8.1: +is-core-module@^2.5.0, is-core-module@^2.8.1: version "2.9.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== @@ -1646,11 +1565,6 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -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-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -1673,15 +1587,6 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" @@ -1866,6 +1771,11 @@ magic-string@^0.27.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -1898,24 +1808,11 @@ meow@^8.0.0: type-fest "^0.18.0" yargs-parser "^20.2.3" -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - methods@1.1.2, methods@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" @@ -1968,7 +1865,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== @@ -2020,14 +1917,6 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multistream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/multistream/-/multistream-4.1.0.tgz#7bf00dfd119556fbc153cff3de4c6d477909f5a8" - integrity sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw== - dependencies: - once "^1.4.0" - readable-stream "^3.6.0" - nan@^2.15.0: version "2.16.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916" @@ -2083,12 +1972,10 @@ node-cache@^5.1.2: dependencies: clone "2.x" -node-fetch@^2.6.6: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" +node-gyp-build@^4.3.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" + integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" @@ -2139,11 +2026,6 @@ only@~0.0.2: resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= -p-is-promise@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-3.0.0.tgz#58e78c7dfe2e163cf2a04ff869e7c1dba64a5971" - integrity sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ== - p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -2270,11 +2152,6 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" -path-type@^4.0.0: - version "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" @@ -2341,40 +2218,6 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= -pkg-fetch@3.4.2, pkg-fetch@3.5.2, pkg-fetch@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/pkg-fetch/-/pkg-fetch-3.5.2.tgz#33e0d4f3b0c371fa9c133a10a081d5955d104376" - integrity sha512-KlRF3cDS4J5PRTKh5dkF5s+CYKa+4eUXzymWqTKPU/p3WmYlWZu7AS0dH8moPxg+QcJNB4/wu1wVO2a0Asv2Dw== - dependencies: - chalk "^4.1.2" - fs-extra "^9.1.0" - https-proxy-agent "^5.0.0" - node-fetch "^2.6.6" - progress "^2.0.3" - semver "^7.3.5" - tar-fs "^2.1.1" - yargs "^16.2.0" - -pkg@^5.8.1: - version "5.8.1" - resolved "https://registry.yarnpkg.com/pkg/-/pkg-5.8.1.tgz#862020f3c0575638ef7d1146f951a54d65ddc984" - integrity sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA== - dependencies: - "@babel/generator" "7.18.2" - "@babel/parser" "7.18.4" - "@babel/types" "7.19.0" - chalk "^4.1.2" - fs-extra "^9.1.0" - globby "^11.1.0" - into-stream "^6.0.0" - is-core-module "2.9.0" - minimist "^1.2.6" - multistream "^4.1.0" - pkg-fetch "3.4.2" - prebuild-install "7.1.1" - resolve "^1.22.0" - stream-meter "^1.0.4" - port-numbers@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/port-numbers/-/port-numbers-6.0.1.tgz#2712cc159b42e637ae3b7d33c5012f7043815f1a" @@ -2402,7 +2245,7 @@ postgres-interval@^1.1.0: dependencies: xtend "^4.0.0" -prebuild-install@7.1.1, prebuild-install@^7.1.0: +prebuild-install@^7.1.0: version "7.1.1" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== @@ -2425,11 +2268,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -progress@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -2450,11 +2288,6 @@ qs@^6.5.2: dependencies: side-channel "^1.0.4" -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - quick-lru@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" @@ -2523,7 +2356,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, 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== @@ -2532,7 +2365,7 @@ readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stre string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^2.0.0, readable-stream@^2.1.4, readable-stream@~2.3.6: +readable-stream@~2.3.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== @@ -2584,7 +2417,7 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -resolve@^1.10.0, resolve@^1.22.0: +resolve@^1.10.0: version "1.22.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== @@ -2593,11 +2426,6 @@ resolve@^1.10.0, resolve@^1.22.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - rfdc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" @@ -2610,13 +2438,6 @@ rollup@^3.18.0: optionalDependencies: fsevents "~2.3.2" -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -2696,11 +2517,6 @@ sinon@^15.0.3: nise "^5.1.4" supports-color "^7.2.0" -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - sliced@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" @@ -2792,13 +2608,6 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -stream-meter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/stream-meter/-/stream-meter-1.0.4.tgz#52af95aa5ea760a2491716704dbff90f73afdd1d" - integrity sha1-Uq+Vql6nYKJJFxZwTb/5D3Ov3R0= - dependencies: - readable-stream "^2.1.4" - streamroller@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.5.tgz#1263182329a45def1ffaef58d31b15d13d2ee7ff" @@ -2891,7 +2700,7 @@ supports-preserve-symlinks-flag@^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== -tar-fs@^2.0.0, tar-fs@^2.1.1: +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== @@ -2937,11 +2746,6 @@ through@2, "through@>=2.2.7 <3": resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -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-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -2954,16 +2758,30 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tsscmp@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" @@ -3014,6 +2832,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== + uglify-js@^3.1.4: version "3.15.5" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.15.5.tgz#2b10f9e0bfb3f5c15a8e8404393b6361eaeb33b3" @@ -3024,11 +2847,6 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - unpipe@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -3039,6 +2857,11 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -3052,19 +2875,6 @@ vary@^1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -3094,6 +2904,11 @@ ws@^8.12.1: resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.1.tgz#c51e583d79140b5e42e39be48c934131942d4a8f" integrity sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew== +ws@^8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -3183,6 +2998,11 @@ ylru@^1.2.0: resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.3.2.tgz#0de48017473275a4cbdfc83a1eaf67c01af8a785" integrity sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA== +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"