From 4be269c3328e4af0600a214635eac10525de7bfb Mon Sep 17 00:00:00 2001 From: chaoszhu Date: Sun, 3 Aug 2025 12:52:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E4=BB=A3=E7=90=86?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/app/config/index.js | 1 + server/app/controller/host.js | 3 +- server/app/controller/plus.js | 2 +- server/app/controller/proxy.js | 117 ++++ server/app/router/routes.js | 39 +- server/app/server.js | 2 - server/app/socket/onekey.js | 34 +- server/app/socket/plus.js | 2 +- server/app/socket/sftp-v2.js | 47 +- server/app/socket/terminal-single-window.js | 22 - server/app/socket/terminal.js | 580 ++++++++++------- server/app/utils/db-class.js | 14 +- server/app/utils/plus.js | 2 +- server/package.json | 3 +- web/package.json | 2 +- web/src/api/index.js | 12 + web/src/components/plus-table.vue | 5 +- web/src/store/index.js | 6 + web/src/views/onekey/index.vue | 19 - web/src/views/server/components/host-form.vue | 112 +++- web/src/views/server/index.vue | 8 - web/src/views/setting/components/proxy.vue | 343 ++++++++++ web/src/views/setting/index.vue | 4 + .../views/terminal/components/terminal.vue | 3 +- yarn.lock | 597 ++---------------- 25 files changed, 1097 insertions(+), 882 deletions(-) create mode 100644 server/app/controller/proxy.js delete mode 100644 server/app/socket/terminal-single-window.js create mode 100644 web/src/views/setting/components/proxy.vue diff --git a/server/app/config/index.js b/server/app/config/index.js index 7fc6b26..62e97de 100644 --- a/server/app/config/index.js +++ b/server/app/config/index.js @@ -21,6 +21,7 @@ module.exports = { aiConfigDBPath: path.join(process.cwd(),'app/db/ai-config.db'), chatHistoryDBPath: path.join(process.cwd(),'app/db/chat-history.db'), favoriteSftpDBPath: path.join(process.cwd(),'app/db/favorite-sftp.db'), + proxyDBPath: path.join(process.cwd(),'app/db/proxy.db'), apiPrefix: '/api/v1', logConfig: { outDir: path.join(process.cwd(),'./app/db/logs'), diff --git a/server/app/controller/host.js b/server/app/controller/host.js index 4bfa179..c59892f 100644 --- a/server/app/controller/host.js +++ b/server/app/controller/host.js @@ -94,7 +94,8 @@ async function importHost({ res, request }) { } else { let extraFiels = { expired: null, expiredNotify: false, group: 'default', consoleUrl: '', remark: '', - authType: 'privateKey', password: '', privateKey: '', credential: '', command: '' + authType: 'privateKey', password: '', privateKey: '', credential: '', command: '', + proxyType: '', jumpHosts: [], proxyServer: '' } newHostList = newHostList.map((item, index) => { item.port = Number(item.port) || 0 diff --git a/server/app/controller/plus.js b/server/app/controller/plus.js index 068d440..253fdf2 100644 --- a/server/app/controller/plus.js +++ b/server/app/controller/plus.js @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/server/app/controller/proxy.js b/server/app/controller/proxy.js new file mode 100644 index 0000000..ce8afc3 --- /dev/null +++ b/server/app/controller/proxy.js @@ -0,0 +1,117 @@ +const { ProxyDB, HostListDB } = require('../utils/db-class') + +const proxyDB = new ProxyDB().getInstance() +const hostListDB = new HostListDB().getInstance() + +const getProxyList = async ({ res }) => { + try { + let data = await proxyDB.findAsync({}) + + data = data.map(item => ({ ...item, id: item._id })) + data?.sort((a, b) => new Date(b.createTime || 0) - new Date(a.createTime || 0)) + + res.success({ data }) + } catch (error) { + res.fail({ data: false, msg: '获取代理列表失败' }) + } +} + +const addProxy = async ({ res, request }) => { + try { + let { body: { type, name, host, port, username, password } } = request + + if (!type || !name || !host || !port) { + return res.fail({ data: false, msg: '参数错误:类型、名称、主机、端口为必填项' }) + } + + // 验证端口号 + const portNum = Number(port) + if (!Number.isInteger(portNum) || portNum < 1 || portNum > 65535) { + return res.fail({ data: false, msg: '端口号必须是1-65535之间的整数' }) + } + + let record = { + type, + name, + host, + port: portNum, + username: username || '', + password: password || '', + createTime: new Date().toISOString() + } + + await proxyDB.insertAsync(record) + res.success({ data: '添加成功' }) + } catch (error) { + res.fail({ data: false, msg: '添加代理失败' }) + } +} + +const updateProxy = async ({ res, request }) => { + try { + let { params: { id } } = request + let { body: { type, name, host, port, username, password } } = request + + if (!id || !type || !name || !host || !port) { + return res.fail({ data: false, msg: '参数错误:ID、类型、名称、主机、端口为必填项' }) + } + + // 验证端口号 + const portNum = Number(port) + if (!Number.isInteger(portNum) || portNum < 1 || portNum > 65535) { + return res.fail({ data: false, msg: '端口号必须是1-65535之间的整数' }) + } + + let target = await proxyDB.findOneAsync({ _id: id }) + if (!target) { + return res.fail({ data: false, msg: `代理ID ${ id } 不存在` }) + } + + await proxyDB.updateAsync( + { _id: id }, + { + $set: { + type, + name, + host, + port: portNum, + username: username || '', + password: password || '', + updateTime: new Date().toISOString() + } + } + ) + + res.success({ data: '修改成功' }) + } catch (error) { + res.fail({ data: false, msg: '修改代理失败' }) + } +} + +const removeProxy = async ({ res, request }) => { + try { + let { params: { id } } = request + + if (!id) { + return res.fail({ data: false, msg: '参数错误:缺少代理ID' }) + } + + let target = await proxyDB.findOneAsync({ _id: id }) + if (!target) { + return res.fail({ data: false, msg: `代理ID ${ id } 不存在` }) + } + await proxyDB.removeAsync({ _id: id }) + // 删除代理后,将所有使用该代理的实例的proxyServer设置为空 + await hostListDB.updateAsync({ proxyServer: id }, { $set: { proxyServer: '' } }) + res.success({ data: '删除成功' }) + } catch (error) { + res.fail({ data: false, msg: '删除代理失败' }) + } +} + +module.exports = { + getProxyList, + addProxy, + updateProxy, + removeProxy +} diff --git a/server/app/router/routes.js b/server/app/router/routes.js index d808cd5..99137c4 100644 --- a/server/app/router/routes.js +++ b/server/app/router/routes.js @@ -8,6 +8,7 @@ const { getScriptGroupList, addScriptGroup, removeScriptGroup, updateScriptGroup const { getOnekeyRecord, removeOnekeyRecord } = require('../controller/onekey') const { getLog, saveIpWhiteList, removeSomeLoginRecords } = require('../controller/log') const { getAIConfig, saveAIConfig, getAIModels, getChatHistory, saveChatHistory, removeChatHistory } = require('../controller/chat') +const { getProxyList, addProxy, updateProxy, removeProxy } = require('../controller/proxy') const ssh = [ { @@ -305,4 +306,40 @@ const aiConfig = [ controller: removeChatHistory } ] -module.exports = [].concat(ssh, host, user, notify, group, scripts, scriptGroup, onekey, log, aiConfig) + +const proxy = [ + { + method: 'get', + path: '/proxy', + controller: getProxyList + }, + { + method: 'post', + path: '/proxy', + controller: addProxy + }, + { + method: 'put', + path: '/proxy/:id', + controller: updateProxy + }, + { + method: 'delete', + path: '/proxy/:id', + controller: removeProxy + } +] + +module.exports = [].concat( + ssh, + host, + user, + notify, + group, + scripts, + scriptGroup, + onekey, + log, + aiConfig, + proxy +) diff --git a/server/app/server.js b/server/app/server.js index ce511c8..6942e1e 100644 --- a/server/app/server.js +++ b/server/app/server.js @@ -4,7 +4,6 @@ const http = require('http') const { httpPort } = require('./config') const middlewares = require('./middlewares') const wsTerminal = require('./socket/terminal') -const wsTerminalSingleWindow = require('./socket/terminal-single-window') const wsSftpV2 = require('./socket/sftp-v2') const wsDocker = require('./socket/docker') const wsOnekey = require('./socket/onekey') @@ -25,7 +24,6 @@ const httpServer = () => { function serverHandler(app, server) { app.proxy = true // 用于nginx反代时获取真实客户端ip wsTerminal(server) // 终端 - wsTerminalSingleWindow(server) // 终端-单窗口 wsSftpV2(server) // sftp-v2 wsDocker(server) // docker wsOnekey(server) // 一键指令 diff --git a/server/app/socket/onekey.js b/server/app/socket/onekey.js index 2c90e52..1823b1b 100644 --- a/server/app/socket/onekey.js +++ b/server/app/socket/onekey.js @@ -1,4 +1,3 @@ -const rawPath = require('path') const { Server } = require('socket.io') const { Client: SSHClient } = require('ssh2') const { sendNoticeAsync } = require('../utils/notify') @@ -6,8 +5,7 @@ const { verifyAuthSync } = require('../utils/verify-auth') const { shellThrottle } = require('../utils/tools') const { isAllowedIp } = require('../utils/tools') const { HostListDB, OnekeyDB } = require('../utils/db-class') -const { getConnectionOptions } = require('./terminal') -const decryptAndExecuteAsync = require('../utils/decrypt-file') +const { getConnectionOptions, handleProxyAndJumpHostConnection } = require('./terminal') const hostListDB = new HostListDB().getInstance() const onekeyDB = new OnekeyDB().getInstance() @@ -126,27 +124,35 @@ module.exports = (httpServer) => { if (!targetHostsInfo.length) return socket.emit('create_fail', `未找到【${ hostIds }】服务器信息`) // 查找 hostInfo -> 并发执行 socket.emit('ready') - // 获取跳板机连接函数 - let { connectByJumpHosts = null } = (await decryptAndExecuteAsync(rawPath.join(__dirname, 'plus.js'))) || {} - let execPromise = targetHostsInfo.map((hostInfo, index) => { // eslint-disable-next-line no-async-promise-executor return new Promise(async (resolve, reject) => { setTimeout(() => reject('执行超时'), timeout * 1000) - let { host, port, jumpHosts } = hostInfo + let { host, port } = hostInfo let curRes = { command, host, port, name: hostInfo.name, result: '', status: execStatusEnum.connecting, startDate: Date.now() + index } execResult.push(curRes) let jumpSshClients = [] try { let { authInfo: targetConnectionOptions } = await getConnectionOptions(hostInfo._id) - // 处理跳板机连接 - let jumpHostResult = connectByJumpHosts && (await connectByJumpHosts(jumpHosts, targetConnectionOptions.host, targetConnectionOptions.port, socket)) - if (jumpHostResult) { - targetConnectionOptions.sock = jumpHostResult.sock - jumpSshClients = jumpHostResult.sshClients - jumpSshClientsPool.push(jumpSshClients) - consola.success('Onekey跳板机连接成功') + // 使用通用的代理和跳板机连接处理函数 + try { + const result = await handleProxyAndJumpHostConnection({ + hostInfo, + targetConnectionOptions, + socket: null, // Onekey不需要发送terminal_print_info事件 + logPrefix: 'Onekey ' + }) + jumpSshClients = result.jumpSshClients + if (jumpSshClients.length > 0) { + jumpSshClientsPool.push(jumpSshClients) + } + } catch (proxyError) { + curRes.status = execStatusEnum.connectFail + curRes.result += `代理连接失败: ${ proxyError.message }` + socket.emit('output', execResult) + resolve(curRes) + return } consola.info('准备连接终端执行一次性指令:', host) diff --git a/server/app/socket/plus.js b/server/app/socket/plus.js index 3d2c9c0..88ee78d 100644 --- a/server/app/socket/plus.js +++ b/server/app/socket/plus.js @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/server/app/socket/sftp-v2.js b/server/app/socket/sftp-v2.js index b6cd0a7..2c94778 100644 --- a/server/app/socket/sftp-v2.js +++ b/server/app/socket/sftp-v2.js @@ -6,8 +6,7 @@ const { sftpCacheDir } = require('../config') const { verifyAuthSync } = require('../utils/verify-auth') const { isAllowedIp } = require('../utils/tools') const { HostListDB, FavoriteSftpDB } = require('../utils/db-class') -const { getConnectionOptions } = require('./terminal') -const decryptAndExecuteAsync = require('../utils/decrypt-file') +const { getConnectionOptions, handleProxyAndJumpHostConnection } = require('./terminal') const hostListDB = new HostListDB().getInstance() const favoriteSftpDB = new FavoriteSftpDB().getInstance() const { Client: SSHClient } = require('ssh2') @@ -1355,15 +1354,21 @@ module.exports = (httpServer) => { const targetHostInfo = await hostListDB.findOneAsync({ _id: hostId }) if (!targetHostInfo) throw new Error(`Host with ID ${ hostId } not found`) - let { connectByJumpHosts = null } = (await decryptAndExecuteAsync(rawPath.join(__dirname, 'plus.js'))) || {} - let { authType, host, port, username, jumpHosts } = targetHostInfo - + let { authType, host, port, username } = targetHostInfo let { authInfo: targetConnectionOptions } = await getConnectionOptions(hostId) - let jumpHostResult = connectByJumpHosts && (await connectByJumpHosts(jumpHosts, targetConnectionOptions.host, targetConnectionOptions.port, socket)) - if (jumpHostResult) { - targetConnectionOptions.sock = jumpHostResult.sock - jumpSshClients = jumpHostResult.sshClients - consola.success('sftp-v2 跳板机连接成功') + + // 使用通用的代理和跳板机连接处理函数 + try { + const result = await handleProxyAndJumpHostConnection({ + hostInfo: targetHostInfo, + targetConnectionOptions, + socket: null, // SFTP不需要发送terminal_print_info事件 + logPrefix: 'SFTP ' + }) + jumpSshClients = result.jumpSshClients + } catch (proxyError) { + socket.emit('connect_fail', `代理连接失败: ${ proxyError.message }`) + return } consola.info('准备连接sftp-v2 面板:', host) @@ -1406,17 +1411,17 @@ module.exports = (httpServer) => { }) // 添加未处理异常捕获 - sftpClient.client.on('timeout', () => { - consola.warn('SSH连接超时') - try { - socket.emit('shell_connection_error', { - message: 'SSH连接超时', - code: 'CONNECTION_TIMEOUT' - }) - } catch (emitError) { - consola.error('发送超时事件失败:', emitError.message) - } - }) + // sftpClient.client.on('timeout', () => { + // consola.warn('SSH连接超时') + // try { + // socket.emit('shell_connection_error', { + // message: 'SSH连接超时', + // code: 'CONNECTION_TIMEOUT' + // }) + // } catch (emitError) { + // consola.error('发送超时事件失败:', emitError.message) + // } + // }) sftpClient.client.on('keyboard-interactive', function (name, instructions, instructionsLang, prompts, finish) { finish([targetConnectionOptions[authType]]) diff --git a/server/app/socket/terminal-single-window.js b/server/app/socket/terminal-single-window.js deleted file mode 100644 index 36a4550..0000000 --- a/server/app/socket/terminal-single-window.js +++ /dev/null @@ -1,22 +0,0 @@ -const path = require('path') -const { Server } = require('socket.io') -const decryptAndExecuteAsync = require('../utils/decrypt-file') - -async function createServerIo(serverIo) { - let { createSingleWindowServerIo = null } = (await decryptAndExecuteAsync(path.join(__dirname, 'plus.js'))) || {} - if (!createSingleWindowServerIo) { - consola.info('单窗口模式功能未解锁') - return - } - createSingleWindowServerIo(serverIo) -} - -module.exports = (httpServer) => { - const serverIo = new Server(httpServer, { - path: '/terminal-single-window', - cors: { - origin: '*' - } - }) - createServerIo(serverIo) -} diff --git a/server/app/socket/terminal.js b/server/app/socket/terminal.js index bf264dd..32c90fd 100644 --- a/server/app/socket/terminal.js +++ b/server/app/socket/terminal.js @@ -1,233 +1,347 @@ -const path = require('path') -const { Server } = require('socket.io') -const { Client: SSHClient } = require('ssh2') -const { verifyAuthSync } = require('../utils/verify-auth') -const { sendNoticeAsync } = require('../utils/notify') -const { isAllowedIp, ping } = require('../utils/tools') -const { AESDecryptAsync } = require('../utils/encrypt') -const { HostListDB, CredentialsDB } = require('../utils/db-class') -const decryptAndExecuteAsync = require('../utils/decrypt-file') -const hostListDB = new HostListDB().getInstance() -const credentialsDB = new CredentialsDB().getInstance() - -async function getConnectionOptions(hostId) { - const hostInfo = await hostListDB.findOneAsync({ _id: hostId }) - if (!hostInfo) throw new Error(`Host with ID ${ hostId } not found`) - let { authType, host, port, username, name } = hostInfo - let authInfo = { host, port, username } - try { - if (authType === 'credential') { - let credentialId = await AESDecryptAsync(hostInfo[authType]) - const sshRecord = await credentialsDB.findOneAsync({ _id: credentialId }) - authInfo.authType = sshRecord.authType - authInfo[authInfo.authType] = await AESDecryptAsync(sshRecord[authInfo.authType]) - } else { - authInfo[authType] = await AESDecryptAsync(hostInfo[authType]) - } - return { authInfo, name } - } catch (err) { - throw new Error(`解密认证信息失败: ${ err.message }`) - } -} - -function createInteractiveShell(socket, targetSSHClient) { - return new Promise((resolve, reject) => { - // 检查SSH客户端连接状态 - if (!targetSSHClient || !targetSSHClient._sock || !targetSSHClient._sock.writable) { - const errorMsg = 'SSH客户端连接已断开,无法创建交互式终端' - consola.error(errorMsg) - socket.emit('terminal_connect_fail', errorMsg) - return reject(new Error(errorMsg)) - } - - try { - targetSSHClient.shell({ term: 'xterm-color' }, (err, stream) => { - if (err) { - consola.error('创建交互式终端失败:', err.message) - socket.emit('terminal_connect_fail', err.message) - return reject(err) - } - - resolve(stream) - - stream - .on('data', (data) => { - socket.emit('output', data.toString()) - }) - .on('close', () => { - consola.info('交互终端已关闭') - targetSSHClient.end() - }) - .on('error', (streamErr) => { - consola.error('终端流错误:', streamErr.message) - socket.emit('terminal_connect_fail', streamErr.message) - }) - - socket.emit('terminal_connect_shell_success') // 已连接终端,web端可以执行指令了 - }) - } catch (shellError) { - consola.error('调用shell方法失败:', shellError.message) - socket.emit('terminal_connect_fail', shellError.message) - reject(shellError) - } - }) -} - -async function createTerminal(hostId, socket, targetSSHClient, isInteractiveShell = true) { - consola.info(`准备创建${ isInteractiveShell ? '交互式' : '非交互式' }终端:${ hostId }`) - return new Promise(async (resolve) => { - const targetHostInfo = await hostListDB.findOneAsync({ _id: hostId }) - if (!targetHostInfo) return socket.emit('create_fail', `查找hostId【${ hostId }】凭证信息失败`) - let { connectByJumpHosts = null } = (await decryptAndExecuteAsync(path.join(__dirname, 'plus.js'))) || {} - let { authType, host, port, username, name, jumpHosts } = targetHostInfo - try { - let { authInfo: targetConnectionOptions } = await getConnectionOptions(hostId) - let jumpHostResult = connectByJumpHosts && (await connectByJumpHosts(jumpHosts, targetConnectionOptions.host, targetConnectionOptions.port, socket)) - let jumpSshClients = [] - if (jumpHostResult) { - targetConnectionOptions.sock = jumpHostResult.sock - jumpSshClients = jumpHostResult.sshClients - } - - socket.emit('terminal_print_info', `准备连接目标终端: ${ name } - ${ host }`) - socket.emit('terminal_print_info', `连接信息: ssh ${ username }@${ host } -p ${ port } -> ${ authType }`) - consola.info('准备连接目标终端:', host) - consola.log('连接信息', { username, port, authType }) - - let closeNoticeFlag = false // 避免重复发送通知 - targetSSHClient - .on('ready', async () => { - consola.success('终端连接成功:', host) - if (isInteractiveShell) { - sendNoticeAsync('host_login', '终端登录', `别名: ${ name } \n IP:${ host } \n 端口:${ port } \n 状态: 登录成功`) - socket.emit('terminal_print_info', `终端连接成功: ${ name } - ${ host }`) - socket.emit('terminal_connect_success', `终端连接成功:${ host }`) - - try { - let stream = await createInteractiveShell(socket, targetSSHClient) - resolve({ stream, jumpSshClients }) - } catch (shellError) { - consola.error('创建交互式终端失败:', host, shellError.message) - // 连接已经成功但创建shell失败,需要清理连接 - targetSSHClient.end() - jumpSshClients?.forEach(sshClient => sshClient && sshClient.end()) - } - } else { - resolve({ jumpSshClients }) - } - }) - .on('close', (err) => { - if (closeNoticeFlag) return closeNoticeFlag = false - const closeReason = err ? '发生错误导致连接断开' : '正常断开连接' - consola.info(`终端连接断开(${ closeReason }): ${ host }`) - socket.emit('terminal_connect_close', { reason: closeReason }) - }) - .on('error', (err) => { - closeNoticeFlag = true - sendNoticeAsync('host_login', '终端登录', `别名: ${ name } \n IP:${ host } \n 端口:${ port } \n 状态: 登录失败`) - consola.error('连接终端失败:', host, err.message) - socket.emit('terminal_connect_fail', err.message) - }) - .on('keyboard-interactive', function (name, instructions, instructionsLang, prompts, finish) { - finish([targetConnectionOptions[authType]]) - }) - .connect({ - tryKeyboard: true, - ...targetConnectionOptions - // debug: (info) => console.log(info) - }) - } catch (err) { - consola.error('创建终端失败: ', host, err.message) - socket.emit('terminal_create_fail', err.message) - } - }) -} - -function createServerIo(serverIo) { - let connectionCount = 0 - - serverIo.on('connection', (socket) => { - connectionCount++ - consola.success(`terminal websocket 已连接 - 当前连接数: ${ connectionCount }`) - let requestIP = socket.handshake.headers['x-forwarded-for'] || socket.handshake.address - if (!isAllowedIp(requestIP)) { - socket.emit('ip_forbidden', 'IP地址不在白名单中') - socket.disconnect() - return - } - consola.success('terminal websocket 已连接') - let targetSSHClient = null - let jumpSshClients = [] - socket.on('ws_terminal', async ({ hostId, token }) => { - try { - const { code } = await verifyAuthSync(token, requestIP) - if (code !== 1) { - socket.emit('token_verify_fail') - socket.disconnect() - return - } - - targetSSHClient = new SSHClient() - let result = await createTerminal(hostId, socket, targetSSHClient, true) - - // 如果创建终端失败,result可能为undefined - if (!result) { - consola.error('创建终端失败,未返回结果') - return - } - - let { stream = null, jumpSshClients: jumpSshClientsFromCreate } = result - jumpSshClients = jumpSshClientsFromCreate || [] - - const listenerInput = (key) => { - if (!targetSSHClient || !targetSSHClient._sock || !targetSSHClient._sock.writable) { - consola.info('终端连接已关闭,禁止输入') - return - } - stream && stream.write(key) - } - - const resizeShell = ({ rows, cols }) => { - stream && stream.setWindow(rows, cols) - } - - socket.on('input', listenerInput) - socket.on('resize', resizeShell) - } catch (error) { - consola.error('ws_terminal事件处理失败:', error.message) - socket.emit('terminal_connect_fail', `连接失败: ${ error.message }`) - } - }) - - socket.on('get_ping', async (ip) => { - try { - socket.emit('ping_data', await ping(ip, 2500)) - } catch (error) { - socket.emit('ping_data', { success: false, msg: error.message }) - } - }) - - socket.on('disconnect', (reason) => { - connectionCount-- - targetSSHClient && targetSSHClient.end() - jumpSshClients?.forEach(sshClient => sshClient && sshClient.end()) - targetSSHClient = null - jumpSshClients = null - consola.info(`终端socket连接断开: ${ reason } - 当前连接数: ${ connectionCount }`) - }) - }) -} - -module.exports = (httpServer) => { - const serverIo = new Server(httpServer, { - path: '/terminal', - cors: { - origin: '*' - } - }) - createServerIo(serverIo) -} - -module.exports.getConnectionOptions = getConnectionOptions -module.exports.createTerminal = createTerminal -module.exports.createServerIo = createServerIo +const path = require('path') +const { Server } = require('socket.io') +const { Client: SSHClient } = require('ssh2') +const { verifyAuthSync } = require('../utils/verify-auth') +const { sendNoticeAsync } = require('../utils/notify') +const { isAllowedIp, ping } = require('../utils/tools') +const { AESDecryptAsync } = require('../utils/encrypt') +const { HostListDB, CredentialsDB, ProxyDB } = require('../utils/db-class') +const decryptAndExecuteAsync = require('../utils/decrypt-file') +const hostListDB = new HostListDB().getInstance() +const credentialsDB = new CredentialsDB().getInstance() +const proxyDB = new ProxyDB().getInstance() + +async function getConnectionOptions(hostId) { + const hostInfo = await hostListDB.findOneAsync({ _id: hostId }) + if (!hostInfo) throw new Error(`Host with ID ${ hostId } not found`) + let { authType, host, port, username, name } = hostInfo + let authInfo = { host, port, username } + try { + if (authType === 'credential') { + let credentialId = await AESDecryptAsync(hostInfo[authType]) + const sshRecord = await credentialsDB.findOneAsync({ _id: credentialId }) + authInfo.authType = sshRecord.authType + authInfo[authInfo.authType] = await AESDecryptAsync(sshRecord[authInfo.authType]) + } else { + authInfo[authType] = await AESDecryptAsync(hostInfo[authType]) + } + return { authInfo, name } + } catch (err) { + throw new Error(`解密认证信息失败: ${ err.message }`) + } +} + +function createInteractiveShell(socket, targetSSHClient) { + return new Promise((resolve, reject) => { + // 检查SSH客户端连接状态 + if (!targetSSHClient || !targetSSHClient._sock || !targetSSHClient._sock.writable) { + const errorMsg = 'SSH客户端连接已断开,无法创建交互式终端' + consola.error(errorMsg) + socket.emit('terminal_connect_fail', errorMsg) + return reject(new Error(errorMsg)) + } + + try { + targetSSHClient.shell({ term: 'xterm-color' }, (err, stream) => { + if (err) { + consola.error('创建交互式终端失败:', err.message) + socket.emit('terminal_connect_fail', err.message) + return reject(err) + } + + resolve(stream) + + stream + .on('data', (data) => { + socket.emit('output', data.toString()) + }) + .on('close', () => { + consola.info('交互终端已关闭') + targetSSHClient.end() + }) + .on('error', (streamErr) => { + consola.error('终端流错误:', streamErr.message) + socket.emit('terminal_connect_fail', streamErr.message) + }) + + socket.emit('terminal_connect_shell_success') // 已连接终端,web端可以执行指令了 + }) + } catch (shellError) { + consola.error('调用shell方法失败:', shellError.message) + socket.emit('terminal_connect_fail', shellError.message) + reject(shellError) + } + }) +} + +// 获取代理配置信息 +async function getProxyConfig(proxyId) { + if (!proxyId) return null + try { + const proxyInfo = await proxyDB.findOneAsync({ _id: proxyId }) + if (!proxyInfo) { + throw new Error(`代理配置 ID ${ proxyId } 未找到`) + } + + return { + id: proxyInfo._id, + name: proxyInfo.name, + type: proxyInfo.type, // 'socks5' 或 'http' + host: proxyInfo.host, + port: proxyInfo.port, + username: proxyInfo.username || '', + password: proxyInfo.password || '' + } + } catch (error) { + consola.error('获取代理配置失败:', error.message) + throw error + } +} + +// 通用的代理和跳板机连接处理函数 +async function handleProxyAndJumpHostConnection(options) { + const { + hostInfo, + targetConnectionOptions, + socket, + logPrefix = '' + } = options + + const { proxyType, proxyServer, jumpHosts, host } = hostInfo + let jumpSshClients = [] + + try { + // 代理连接 + if (proxyType === 'proxyServer' && proxyServer) { + const proxyConfig = await getProxyConfig(proxyServer) + if (proxyConfig) { + const logMsg = `${ logPrefix }使用代理服务器: ${ proxyConfig.name } (${ proxyConfig.type.toUpperCase() }) - ${ proxyConfig.host }:${ proxyConfig.port }` + consola.info(logMsg) + + // 向前端发送代理信息(如果socket存在且有对应方法) + if (socket && socket.emit) { + if (typeof socket.emit === 'function') { + try { + socket.emit('terminal_print_info', `使用代理服务器: ${ proxyConfig.name } (${ proxyConfig.type.toUpperCase() }) - ${ proxyConfig.host }:${ proxyConfig.port }`) + } catch (emitError) { + // 忽略emit错误,因为不同socket可能有不同的事件 + } + } + } + + let proxySocket + if (proxyConfig.type === 'socks5') { + const { createSocks5Connection = null } = (await decryptAndExecuteAsync(path.join(__dirname, 'plus.js'))) || {} + if (!createSocks5Connection) throw new Error('Plus功能解锁失败: createSocks5Connection') + proxySocket = await createSocks5Connection(proxyConfig, targetConnectionOptions.host, targetConnectionOptions.port) + } else if (proxyConfig.type === 'http') { + const { createHttpConnection = null } = (await decryptAndExecuteAsync(path.join(__dirname, 'plus.js'))) || {} + if (!createHttpConnection) throw new Error('Plus功能解锁失败: createHttpConnection') + proxySocket = await createHttpConnection(proxyConfig, targetConnectionOptions.host, targetConnectionOptions.port) + } else { + throw new Error(`不支持的代理类型: ${ proxyConfig.type }`) + } + + targetConnectionOptions.sock = proxySocket + consola.success(`${ logPrefix }代理连接建立成功: ${ host }`) + + // 向前端发送成功信息 + if (socket && socket.emit && typeof socket.emit === 'function') { + try { + socket.emit('terminal_print_info', '代理连接建立成功,准备通过代理连接目标服务器') + } catch (emitError) { + // 忽略emit错误 + } + } + } + } + // 跳板机连接 + else if (proxyType === 'jumpHosts' && Array.isArray(jumpHosts) && jumpHosts.length > 0) { + const { connectByJumpHosts = null } = (await decryptAndExecuteAsync(path.join(__dirname, 'plus.js'))) || {} + if (!connectByJumpHosts) throw new Error('Plus功能解锁失败: connectByJumpHosts') + const jumpHostResult = await connectByJumpHosts(jumpHosts, targetConnectionOptions.host, targetConnectionOptions.port, socket) + if (jumpHostResult) { + targetConnectionOptions.sock = jumpHostResult.sock + jumpSshClients = jumpHostResult.sshClients + consola.success(`${ logPrefix }跳板机连接成功`) + } + } + + return { + targetConnectionOptions, + jumpSshClients + } + } catch (error) { + consola.error(`${ logPrefix }连接失败:`, error.message) + throw error + } +} + +async function createTerminal(hostId, socket, targetSSHClient, isInteractiveShell = true) { + consola.info(`准备创建${ isInteractiveShell ? '交互式' : '非交互式' }终端:${ hostId }`) + return new Promise(async (resolve) => { + const targetHostInfo = await hostListDB.findOneAsync({ _id: hostId }) + if (!targetHostInfo) return socket.emit('create_fail', `查找hostId【${ hostId }】凭证信息失败`) + let { authType, host, port, username, name } = targetHostInfo + try { + let { authInfo: targetConnectionOptions } = await getConnectionOptions(hostId) + + // 使用通用的代理和跳板机连接处理函数 + let jumpSshClients = [] + try { + const result = await handleProxyAndJumpHostConnection({ + hostInfo: targetHostInfo, + targetConnectionOptions, + socket, + logPrefix: 'Terminal ' + }) + jumpSshClients = result.jumpSshClients + } catch (proxyError) { + socket.emit('terminal_connect_fail', `代理连接失败: ${ proxyError.message }`) + return + } + + socket.emit('terminal_print_info', `准备连接目标终端: ${ name } - ${ host }`) + socket.emit('terminal_print_info', `连接信息: ssh ${ username }@${ host } -p ${ port } -> ${ authType }`) + consola.info('准备连接目标终端:', host) + consola.log('连接信息', { username, port, authType }) + + let closeNoticeFlag = false // 避免重复发送通知 + targetSSHClient + .on('ready', async () => { + consola.success('终端连接成功:', host) + if (isInteractiveShell) { + sendNoticeAsync('host_login', '终端登录', `别名: ${ name } \n IP:${ host } \n 端口:${ port } \n 状态: 登录成功`) + socket.emit('terminal_print_info', `终端连接成功: ${ name } - ${ host }`) + socket.emit('terminal_connect_success', `终端连接成功:${ host }`) + + try { + let stream = await createInteractiveShell(socket, targetSSHClient) + resolve({ stream, jumpSshClients }) + } catch (shellError) { + consola.error('创建交互式终端失败:', host, shellError.message) + // 连接已经成功但创建shell失败,需要清理连接 + targetSSHClient.end() + jumpSshClients?.forEach(sshClient => sshClient && sshClient.end()) + } + } else { + resolve({ jumpSshClients }) + } + }) + .on('close', (err) => { + if (closeNoticeFlag) return closeNoticeFlag = false + const closeReason = err ? '发生错误导致连接断开' : '正常断开连接' + consola.info(`终端连接断开(${ closeReason }): ${ host }`) + socket.emit('terminal_connect_close', { reason: closeReason }) + }) + .on('error', (err) => { + closeNoticeFlag = true + sendNoticeAsync('host_login', '终端登录', `别名: ${ name } \n IP:${ host } \n 端口:${ port } \n 状态: 登录失败`) + consola.error('连接终端失败:', host, err.message) + socket.emit('terminal_connect_fail', err.message) + }) + .on('keyboard-interactive', function (name, instructions, instructionsLang, prompts, finish) { + finish([targetConnectionOptions[authType]]) + }) + .connect({ + tryKeyboard: true, + ...targetConnectionOptions + // debug: (info) => console.log(info) + }) + } catch (err) { + consola.error('创建终端失败: ', host, err.message) + socket.emit('terminal_create_fail', err.message) + } + }) +} + +function createServerIo(serverIo) { + let connectionCount = 0 + + serverIo.on('connection', (socket) => { + connectionCount++ + consola.success(`terminal websocket 已连接 - 当前连接数: ${ connectionCount }`) + let requestIP = socket.handshake.headers['x-forwarded-for'] || socket.handshake.address + if (!isAllowedIp(requestIP)) { + socket.emit('ip_forbidden', 'IP地址不在白名单中') + socket.disconnect() + return + } + consola.success('terminal websocket 已连接') + let targetSSHClient = null + let jumpSshClients = [] + socket.on('ws_terminal', async ({ hostId, token }) => { + try { + const { code } = await verifyAuthSync(token, requestIP) + if (code !== 1) { + socket.emit('token_verify_fail') + socket.disconnect() + return + } + + targetSSHClient = new SSHClient() + let result = await createTerminal(hostId, socket, targetSSHClient, true) + + // 如果创建终端失败,result可能为undefined + if (!result) { + consola.error('创建终端失败,未返回结果') + return + } + + let { stream = null, jumpSshClients: jumpSshClientsFromCreate } = result + jumpSshClients = jumpSshClientsFromCreate || [] + + const listenerInput = (key) => { + if (!targetSSHClient || !targetSSHClient._sock || !targetSSHClient._sock.writable) { + consola.info('终端连接已关闭,禁止输入') + return + } + stream && stream.write(key) + } + + const resizeShell = ({ rows, cols }) => { + stream && stream.setWindow(rows, cols) + } + + socket.on('input', listenerInput) + socket.on('resize', resizeShell) + } catch (error) { + consola.error('ws_terminal事件处理失败:', error.message) + socket.emit('terminal_connect_fail', `连接失败: ${ error.message }`) + } + }) + + socket.on('get_ping', async (ip) => { + try { + socket.emit('ping_data', await ping(ip, 2500)) + } catch (error) { + socket.emit('ping_data', { success: false, msg: error.message }) + } + }) + + socket.on('disconnect', (reason) => { + connectionCount-- + targetSSHClient && targetSSHClient.end() + jumpSshClients?.forEach(sshClient => sshClient && sshClient.end()) + targetSSHClient = null + jumpSshClients = null + consola.info(`终端socket连接断开: ${ reason } - 当前连接数: ${ connectionCount }`) + }) + }) +} + +module.exports = (httpServer) => { + const serverIo = new Server(httpServer, { + path: '/terminal', + cors: { + origin: '*' + } + }) + createServerIo(serverIo) +} + +module.exports.getConnectionOptions = getConnectionOptions +module.exports.createTerminal = createTerminal +module.exports.createServerIo = createServerIo +module.exports.getProxyConfig = getProxyConfig +module.exports.handleProxyAndJumpHostConnection = handleProxyAndJumpHostConnection diff --git a/server/app/utils/db-class.js b/server/app/utils/db-class.js index 63d8b03..064509e 100644 --- a/server/app/utils/db-class.js +++ b/server/app/utils/db-class.js @@ -13,7 +13,8 @@ const { plusDBPath, aiConfigDBPath, chatHistoryDBPath, - favoriteSftpDBPath + favoriteSftpDBPath, + proxyDBPath } = require('../config') module.exports.KeyDB = class KeyDB { @@ -178,3 +179,14 @@ module.exports.FavoriteSftpDB = class FavoriteSftpDB { return FavoriteSftpDB.instance } } + +module.exports.ProxyDB = class ProxyDB { + constructor() { + if (!ProxyDB.instance) { + ProxyDB.instance = new Datastore({ filename: proxyDBPath, autoload: true }) + } + } + getInstance() { + return ProxyDB.instance + } +} \ No newline at end of file diff --git a/server/app/utils/plus.js b/server/app/utils/plus.js index d29efba..4341cc8 100644 --- a/server/app/utils/plus.js +++ b/server/app/utils/plus.js @@ -1 +1 @@ -U2FsdGVkX188iPUyO1f2xahkUzOdBH0ifn8ZV/KNKGkTSDSDEhT8qEioUui8+nM/p4NQJ2LAbVqK4fmyuG1rUy8VHbFBJGxEWCa5cgFemgxRWpZE2K9lWr1sopjfzsyN1hGfdi2oWZE8/x1MMw6Rc1K6guFYBuj4LGuGS/yp8wUpGe4Ifb5d/W81Y/YHqoH/WRUJc8V3EbnlHgweY7Yx6NcuRMHaqMVdL7P/1do4Xig4N5zqHdPmZE6gp2tAKh8WwpzpLgTqlXEEUFQk0KL07lYf7PNVKudsD2G5s1VYrhVhvR+1jeSh7AwLa4pABXg8bUo53SC4CCgSC57GLqldmnqJP8Kqr8ULSEdFVL0uLS4ogTALgXrrTvzr3hXAccIQSRLihD2BDK0MuDNcLpOXbYI6KQ6L4Z1/cT8VOteV7OMtJMC3EZDUroOwYS1oeToIQoZFHYKIyqlyThLEkb9zZBRDBvLisirGGvTh52bzw1BKE5IZznAe1A5N0n9U2eawqIUDJMlIRE4LEPuSzkNPDV6v3IiNsb3c7JO7t06WQMIs4Nene2v0SDwYbbZgBhfgEu+GkKwXh16w1txX/juJ09gfTj6vZiJNRk4bOGZJsPWujQhOjncjbYRq7dhZA1/0gjOQppX312g/yIznIYFKkl5LF868hptbFu6WgTbclqwLiUKX0D+Oe25mcMIDXdhjWeZZoEIXg5FFv1PaE5Qrj35Uowo4MzP6aVYw2zn9WlxGzbHPtAFCTKChcOuSV7RYuRETR8OIHyNcOlNBSbJ5KlALb2XS5XEtluhEF/G2iljXSvlACNHLz9EZ3E4Q9XubvMW5YBecdcW3XHipbusKZCA542BKxadQYQGGWryZ/wQ= \ No newline at end of file +U2FsdGVkX19ypJFyeFxNF22xekv1FOR0XT1ofsw1MQ8fs/xIpP4rByqxDo2e7/E4w3sSaVpT3IUt5jH0alt4GeryiM3wfedmo+4eBiw2qTTBW0tQHCbh2tIIxJWPv3NdaMCv0fEzJNJf2CrhgrRSv9RpUpDYYojpg50wnKjL2Fiw37mGw9uqHowmgqoyxO14Otjbh9Sf2Y9DqoYr4SF/uvxPGeFpBO3op/+8gnqgN3r0mmF8DLn73m5a7NANNe6IuHXCwfu3DY9q9xgI6OEp2ecW/rxXijGRllMmVkdSKeG0xzSeV7q1PF+qpvEo9xz8FdVBOW4Te6G/hDpwA3WI0cwKY5nOs+aY4J8KNmtpsQnUMbjm9w5OjCrKOBzyQ6JIYbT6b7vP4jyF6FLOR0DJJ3JRP1OGbDLZhoWkXtNB7Mwa85KegKVx3Hg2eEsEug93jQrymm++YtFvoEbdAD5AeA8NX/qJRVqloOikv4d/mCy1BJaAQE4tAHNIldwMCvTarUKrYSxjdzO0sZmRuE4PhwjIGIN5dK8/GYR9vFfnGuNhM+w0gRJr1VDK+/6XnMp0PmQMx7MYO4UE2A4zulIsxhWxYRhzvmePPWf5rOIPnSl8dYx/otqgs6LY+FDkMWa99itdFFhCZxjapUJ2917ofYuAH8Y76QliRVgZ9HOPgpJOr/A02dt3c+Kp/p9cu6vAuGJ29l9JDEr1d35+/hRvvR6SEWYoalFEjkyEl4Y1cuxyNasAxkpxFlN9/ROl1D3qDk1L/lci4YC1aXlyW8jLyNthIXFMHWTiawA7xEV0iFiSMjDkpIpv+1/V8T+b7djl13/ALfgw/Zw7rNDKNqj8vaYLNO2T7epyFeESWE8EY9Q= \ No newline at end of file diff --git a/server/package.json b/server/package.json index f731574..831fd8c 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "3.2.0", + "version": "3.3.0", "description": "easynode-server", "bin": "./bin/www", "scripts": { @@ -48,6 +48,7 @@ "qrcode": "^1.5.4", "socket.io": "^4.7.5", "socket.io-client": "^4.7.5", + "socks": "^2.8.6", "speakeasy": "^2.0.0", "ssh2": "^1.15.0", "ssh2-sftp-client": "^10.0.3" diff --git a/web/package.json b/web/package.json index e964f98..96dbaa1 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "web", - "version": "3.2.0", + "version": "3.3.0", "description": "easynode-web", "private": true, "scripts": { diff --git a/web/src/api/index.js b/web/src/api/index.js index 92f0d46..8c8966c 100644 --- a/web/src/api/index.js +++ b/web/src/api/index.js @@ -168,5 +168,17 @@ export default { }, removeSomeLoginRecords() { return axios({ url: '/remove-some-login-records', method: 'delete' }) + }, + getProxyList() { + return axios({ url: '/proxy', method: 'get' }) + }, + addProxy(data) { + return axios({ url: '/proxy', method: 'post', data }) + }, + updateProxy(id, data) { + return axios({ url: `/proxy/${ id }`, method: 'put', data }) + }, + removeProxy(id) { + return axios({ url: `/proxy/${ id }`, method: 'delete' }) } } diff --git a/web/src/components/plus-table.vue b/web/src/components/plus-table.vue index 4ef956b..eb86d7a 100644 --- a/web/src/components/plus-table.vue +++ b/web/src/components/plus-table.vue @@ -94,8 +94,9 @@ const basicFeatures = [ // Plus版专属功能列表 const plusFeatures = [ 'AI Chat对话组件', - '服务器跳板机功能,支持任意数量服务器的连续跳板', - '批量修改实例配置(优化版)', + '服务器代理&跳板机功能', + '终端单窗口模式', + '批量修改实例配置', '脚本库批量导出导入', '脚本库分组与终端功能栏支持', '终端功能栏docker容器管理', diff --git a/web/src/store/index.js b/web/src/store/index.js index 68db090..65948b5 100644 --- a/web/src/store/index.js +++ b/web/src/store/index.js @@ -11,6 +11,7 @@ const useStore = defineStore('global', { sshList: [], scriptList: [], scriptGroupList: [], + proxyList: [], localScriptList: [], user: localStorage.getItem('user') || null, token: localStorage.getItem('token') || sessionStorage.getItem('token') || null, @@ -76,6 +77,7 @@ const useStore = defineStore('global', { await this.getScriptList() await this.getScriptGroupList() await this.getPlusInfo() + await this.getProxyList() this.getAIConfig() this.getChatHistory() }, @@ -117,6 +119,10 @@ const useStore = defineStore('global', { const { data: localScriptList } = await $api.getLocalScriptList() this.$patch({ localScriptList }) }, + async getProxyList() { + const { data: proxyList } = await $api.getProxyList() + this.$patch({ proxyList }) + }, async getPlusInfo() { const { data: plusInfo = {} } = await $api.getPlusInfo() if (plusInfo?.expiryDate) { diff --git a/web/src/views/onekey/index.vue b/web/src/views/onekey/index.vue index bec58a0..d5ed8a5 100644 --- a/web/src/views/onekey/index.vue +++ b/web/src/views/onekey/index.vue @@ -440,25 +440,6 @@ const handleRemoveAll = async () => { }) } -onActivated(async () => { - await nextTick() - const { hostIds, execClientInstallScript } = route.query - if (!hostIds) return - if (execClientInstallScript === 'true') { - let clientInstallScript = 'curl -o- https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash\n' - console.log(hostIds.split(',')) - createExecShell(hostIds.split(','), clientInstallScript, 300) - // $messageBox.confirm(`准备安装客户端服务监控应用:${ host }`, 'Warning', { - // confirmButtonText: '确定', - // cancelButtonText: '取消', - // type: 'warning' - // }) - // .then(async () => { - // let clientInstallScript = 'curl -o- https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash\n' - // createExecShell([host,], clientInstallScript, 300) - // }) - } -}) diff --git a/web/src/views/setting/index.vue b/web/src/views/setting/index.vue index 420832f..4a85fde 100644 --- a/web/src/views/setting/index.vue +++ b/web/src/views/setting/index.vue @@ -13,6 +13,9 @@ + + + @@ -28,6 +31,7 @@ import Record from './components/record.vue' import User from './components/user.vue' import NotifyConfig from './components/notify-config.vue' import UserPlus from './components/user-plus.vue' +import Proxy from './components/proxy.vue' const route = useRoute() const router = useRouter() diff --git a/web/src/views/terminal/components/terminal.vue b/web/src/views/terminal/components/terminal.vue index 39bb644..5026280 100644 --- a/web/src/views/terminal/components/terminal.vue +++ b/web/src/views/terminal/components/terminal.vue @@ -153,7 +153,7 @@ const getCommand = async () => { const connectIO = () => { curStatus.value = CONNECTING socket.value = io($serviceURI, { - path: props.isSingleWindow ? '/terminal-single-window' : '/terminal', + path: '/terminal', forceNew: false, reconnection: false, reconnectionAttempts: 0 @@ -165,6 +165,7 @@ const connectIO = () => { socket.value.emit('ws_terminal', { hostId: hostId.value, token: token.value }) socket.value.on('terminal_connect_success', () => { socket.value.on('output', (str) => { + if (props.isSingleWindow && !isPlusActive.value) return term.value.write(str) terminalText.value += str }) diff --git a/yarn.lock b/yarn.lock index 35dcf18..65832eb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -52,15 +52,6 @@ json5 "^2.2.3" semver "^6.3.1" -"@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/generator@^7.26.10", "@babel/generator@^7.27.0": version "7.27.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.0.tgz#764382b5392e5b9aff93cadb190d0745866cbc2c" @@ -157,11 +148,6 @@ "@babel/traverse" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/helper-string-parser@^7.18.10", "@babel/helper-string-parser@^7.24.8": - version "7.24.8" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" - integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== - "@babel/helper-string-parser@^7.25.7": version "7.25.7" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz#d50e8d37b1176207b4fe9acedec386c565a44a54" @@ -172,11 +158,6 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" - integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== - "@babel/helper-validator-identifier@^7.25.7": version "7.25.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5" @@ -200,11 +181,6 @@ "@babel/template" "^7.27.0" "@babel/types" "^7.27.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/parser@^7.25.3": version "7.25.8" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.8.tgz#f6aaf38e80c36129460c1657c0762db584c9d5e2" @@ -280,24 +256,6 @@ debug "^4.3.1" globals "^11.1.0" -"@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== - dependencies: - "@babel/helper-string-parser" "^7.18.10" - "@babel/helper-validator-identifier" "^7.18.6" - to-fast-properties "^2.0.0" - -"@babel/types@^7.18.2": - version "7.24.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.9.tgz#228ce953d7b0d16646e755acf204f4cf3d08cc73" - integrity sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ== - dependencies: - "@babel/helper-string-parser" "^7.24.8" - "@babel/helper-validator-identifier" "^7.24.7" - to-fast-properties "^2.0.0" - "@babel/types@^7.25.8": version "7.25.8" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.8.tgz#5cf6037258e8a9bcad533f4979025140cb9993e1" @@ -760,11 +718,6 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.56.0": - version "8.56.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" - integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== - "@eslint/js@8.57.0": version "8.57.0" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" @@ -795,7 +748,7 @@ resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-3.0.0.tgz#f11fdf7dda62fe8e336fa7c6642d9041f30356d7" integrity sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w== -"@humanwhocodes/config-array@^0.11.13", "@humanwhocodes/config-array@^0.11.14": +"@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== @@ -826,7 +779,7 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.5": +"@jridgewell/gen-mapping@^0.3.5": version "0.3.5" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== @@ -995,12 +948,12 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@2.0.5": 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", "@nodelib/fs.walk@^1.2.8": +"@nodelib/fs.walk@^1.2.8": 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== @@ -1644,13 +1597,6 @@ acorn@^8.9.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== -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" - aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -1724,11 +1670,6 @@ array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: call-bound "^1.0.3" is-array-buffer "^3.0.5" -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== - array.prototype.findindex@^2.0.2: version "2.2.4" resolved "https://registry.yarnpkg.com/array.prototype.findindex/-/array.prototype.findindex-2.2.4.tgz#63aff05df18effa990c367bfad06b71f7bd113f9" @@ -1788,11 +1729,6 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -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== - available-typed-arrays@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" @@ -1838,11 +1774,6 @@ base32.js@0.0.1: resolved "https://registry.yarnpkg.com/base32.js/-/base32.js-0.0.1.tgz#d045736a57b1f6c139f0c7df42518a84e91bb2ba" integrity sha512-EGHIRiegFa62/SsA1J+Xs2tIzludPdzM064N9wjbiEgHnGnJ1V0WEpA4pEwCYT5nDvZk3ubf0shqaCS7k6xeUQ== -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - base64id@2.0.0, base64id@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" @@ -1873,15 +1804,6 @@ bl@^1.2.3: readable-stream "^2.3.5" safe-buffer "^5.1.1" -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - bluebird@^3.5.0: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -1934,14 +1856,6 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - buildcheck@~0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/buildcheck/-/buildcheck-0.0.6.tgz#89aa6e417cfd1e2196e3f8fe915eb709d2fe4238" @@ -2062,11 +1976,6 @@ chokidar@^4.0.0: dependencies: readdirp "^4.0.1" -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - classnames@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" @@ -2086,15 +1995,6 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -2389,13 +2289,6 @@ dayjs@^1.11.13: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== -debug@4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== - dependencies: - ms "^2.1.3" - debug@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -2403,6 +2296,13 @@ debug@^3.1.0, debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: version "4.3.5" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" @@ -2415,23 +2315,11 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - deep-equal@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" integrity sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw== -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -2485,11 +2373,6 @@ detect-libc@^1.0.3: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== -detect-libc@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" - integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== - dezalgo@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" @@ -2503,13 +2386,6 @@ dijkstrajs@^1.0.1: resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz#4c8dbdea1f0f6478bff94d9c49c784d623e4fc23" integrity sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA== -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" - doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -2607,7 +2483,7 @@ encodeurl@^1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -end-of-stream@^1.1.0, end-of-stream@^1.4.1: +end-of-stream@^1.1.0: 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== @@ -2869,50 +2745,6 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@8.56.0: - version "8.56.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" - integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.56.0" - "@humanwhocodes/config-array" "^0.11.13" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - eslint@^8.56.0: version "8.57.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" @@ -3007,11 +2839,6 @@ eventemitter3@^3.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== -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== - exsolve@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/exsolve/-/exsolve-1.0.4.tgz#7de5c75af82ecd15998328fbf5f2295883be3a39" @@ -3037,17 +2864,6 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.9: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - 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" - fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -3170,19 +2986,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" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - fs-extra@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -3210,16 +3013,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" @@ -3305,18 +3098,6 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -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 sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== - -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== - dependencies: - is-glob "^4.0.1" - glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" @@ -3324,6 +3105,13 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +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== + dependencies: + is-glob "^4.0.1" + glob@^11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.0.tgz#6031df0d7b65eaa1ccb9b29b5ced16cea658e77e" @@ -3376,18 +3164,6 @@ globalthis@^1.0.4: define-properties "^1.2.1" gopd "^1.0.1" -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" - gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -3461,11 +3237,6 @@ has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: dependencies: has-symbols "^1.0.3" -has@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" - integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== - hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" @@ -3537,14 +3308,6 @@ http-signature@~1.4.0: jsprim "^2.0.2" sshpk "^1.18.0" -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" @@ -3559,11 +3322,6 @@ iconv-lite@^0.6.3: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - ignore-by-default@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" @@ -3615,7 +3373,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.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3625,11 +3383,6 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - internal-slot@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" @@ -3639,13 +3392,13 @@ internal-slot@^1.1.0: hasown "^2.0.2" side-channel "^1.1.0" -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== +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== dependencies: - from2 "^2.3.0" - p-is-promise "^3.0.0" + jsbn "1.1.0" + sprintf-js "^1.1.3" is-arguments@^1.0.4: version "1.1.1" @@ -3698,20 +3451,6 @@ is-callable@^1.1.3, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@2.9.0: - 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== - dependencies: - has "^1.0.3" - -is-core-module@^2.13.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" - integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== - dependencies: - hasown "^2.0.2" - is-data-view@^1.0.1, is-data-view@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" @@ -3912,6 +3651,11 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -3922,11 +3666,6 @@ jsencrypt@^3.3.2: resolved "https://registry.yarnpkg.com/jsencrypt/-/jsencrypt-3.3.2.tgz#b0f1a2278810c7ba1cb8957af11195354622df7c" integrity sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A== -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - jsesc@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" @@ -4343,17 +4082,12 @@ memoize-one@^6.0.0: resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== -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: 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, micromatch@^4.0.5: +micromatch@^4.0.5: version "4.0.8" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -4383,11 +4117,6 @@ mime@^1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" @@ -4409,7 +4138,7 @@ minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: +minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -4424,11 +4153,6 @@ mitt@^3.0.1: resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== -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@^0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -4461,14 +4185,6 @@ ms@^2.1.1, ms@^2.1.3: 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.18.0, nan@^2.19.0: version "2.20.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3" @@ -4479,11 +4195,6 @@ nanoid@^3.3.8: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== -napi-build-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" - integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -4494,26 +4205,12 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -node-abi@^3.3.0: - version "3.65.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.65.0.tgz#ca92d559388e1e9cab1680a18c1a18757cdac9d3" - integrity sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA== - dependencies: - semver "^7.3.5" - node-addon-api@^7.0.0: version "7.1.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== -node-fetch@^2.6.6: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-os-utils@1.3.7, node-os-utils@^1.3.7: +node-os-utils@^1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/node-os-utils/-/node-os-utils-1.3.7.tgz#77cc341ae39584e12d3aadf6046fe420ff4c9340" integrity sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q== @@ -4530,7 +4227,7 @@ node-rsa@^1.1.1: dependencies: asn1 "^0.2.4" -node-schedule@2.1.1, node-schedule@^2.1.1: +node-schedule@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/node-schedule/-/node-schedule-2.1.1.tgz#6958b2c5af8834954f69bb0a7a97c62b97185de3" integrity sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ== @@ -4669,11 +4366,6 @@ p-cancelable@^2.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== -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@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -4747,11 +4439,6 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - path-scurry@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580" @@ -4765,11 +4452,6 @@ path-to-regexp@^6.2.1: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4" integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== -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== - pathe@^2.0.1, pathe@^2.0.2, pathe@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" @@ -4812,20 +4494,6 @@ pinia@^3.0.1: dependencies: "@vue/devtools-api" "^7.7.2" -pkg-fetch@3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/pkg-fetch/-/pkg-fetch-3.4.2.tgz#6f68ebc54842b73f8c0808959a9df3739dcb28b7" - integrity sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA== - 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-types@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" @@ -4844,26 +4512,6 @@ pkg-types@^2.0.1, pkg-types@^2.1.0: exsolve "^1.0.1" pathe "^2.0.3" -pkg@5.8: - 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" - pngjs@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" @@ -4900,24 +4548,6 @@ postcss@^8.4.48, postcss@^8.5.3: picocolors "^1.1.1" source-map-js "^1.2.1" -prebuild-install@7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" - integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== - dependencies: - detect-libc "^2.0.0" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^1.0.1" - node-abi "^3.3.0" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^4.0.0" - tar-fs "^2.0.0" - tunnel-agent "^0.6.0" - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -4933,11 +4563,6 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -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== - promise-retry@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" @@ -4971,14 +4596,6 @@ pump@^2.0.0: end-of-stream "^1.1.0" once "^1.3.1" -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - punycode.js@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" @@ -5037,17 +4654,7 @@ raw-body@^2.3.3: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -readable-stream@^2.0.0, readable-stream@^2.1.4, readable-stream@^2.3.5: +readable-stream@^2.3.5: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== @@ -5060,7 +4667,7 @@ readable-stream@^2.0.0, readable-stream@^2.1.4, readable-stream@^2.3.5: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.0.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -5145,15 +4752,6 @@ resolve-path@^1.4.0: http-errors "~1.6.2" path-is-absolute "1.0.1" -resolve@^1.22.0: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" @@ -5283,16 +4881,16 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - semver@^7.3.6, semver@^7.6.3: version "7.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== +semver@^7.5.3, semver@^7.5.4: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -5402,20 +5000,6 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" - integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== - dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - simple-update-notifier@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" @@ -5423,10 +5007,10 @@ simple-update-notifier@^2.0.0: dependencies: semver "^7.5.3" -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== socket.io-adapter@~2.5.2: version "2.5.5" @@ -5464,7 +5048,7 @@ socket.io-parser@~4.2.4: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" -socket.io@4.7.5, socket.io@^4.7.5: +socket.io@^4.7.5: version "4.7.5" resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.5.tgz#56eb2d976aef9d1445f373a62d781a41c7add8f8" integrity sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA== @@ -5477,6 +5061,14 @@ socket.io@4.7.5, socket.io@^4.7.5: socket.io-adapter "~2.5.2" socket.io-parser "~4.2.4" +socks@^2.8.6: + version "2.8.6" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.6.tgz#e335486a2552f34f932f0c27d8dbb93f2be867aa" + integrity sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA== + dependencies: + ip-address "^9.0.5" + smart-buffer "^4.2.0" + sorted-array-functions@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz#8605695563294dffb2c9796d602bd8459f7a0dd5" @@ -5509,6 +5101,11 @@ speakingurl@^14.0.1: resolved "https://registry.yarnpkg.com/speakingurl/-/speakingurl-14.0.1.tgz#f37ec8ddc4ab98e9600c1c9ec324a8c48d772a53" integrity sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ== +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + ssh2-sftp-client@^10.0.3: version "10.0.3" resolved "https://registry.yarnpkg.com/ssh2-sftp-client/-/ssh2-sftp-client-10.0.3.tgz#aa8f9b875b745a0b6108692f576343437e428a86" @@ -5559,13 +5156,6 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== -stream-meter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/stream-meter/-/stream-meter-1.0.4.tgz#52af95aa5ea760a2491716704dbff90f73afdd1d" - integrity sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ== - 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" @@ -5674,11 +5264,6 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - strip-literal@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-3.0.0.tgz#ce9c452a91a0af2876ed1ae4e583539a353df3fc" @@ -5724,32 +5309,6 @@ supports-color@^8.1.1: dependencies: has-flag "^4.0.0" -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tar-fs@^2.0.0, tar-fs@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.3.tgz#fb3b8843a26b6f13a08e606f7922875eb1fbbf92" - integrity sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -5814,11 +5373,6 @@ tough-cookie@^5.0.0: dependencies: tldts "^6.1.32" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - tree-kill@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" @@ -6169,11 +5723,6 @@ w3c-keyname@^2.2.4: resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - webpack-code-inspector-plugin@0.20.7: version "0.20.7" resolved "https://registry.yarnpkg.com/webpack-code-inspector-plugin/-/webpack-code-inspector-plugin-0.20.7.tgz#1b8fc323d5b6b3d2a98b6b618c2305998e59bad8" @@ -6186,14 +5735,6 @@ webpack-virtual-modules@^0.6.2: resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz#057faa9065c8acf48f24cb57ac0e77739ab9a7e8" integrity sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ== -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" @@ -6363,11 +5904,6 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" @@ -6390,19 +5926,6 @@ yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"