feat: oneClick to publish WeChat public account tweets (#1417)

Reviewed-on: daoyoucloud/tachybase#1417
Reviewed-by: sealday <zhanglin@daoyoucloud.com>
Co-authored-by: luliangqiang <2650321653@qq.com>
Co-committed-by: luliangqiang <2650321653@qq.com>
This commit is contained in:
luliangqiang 2024-08-02 20:35:40 +08:00 committed by sealday
parent 90ce46221b
commit 59322447dc
3 changed files with 434 additions and 214 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "@tachybase/plugin-wechat-official-account", "name": "@tachybase/plugin-wechat-official-account",
"version": "0.21.75", "version": "0.21.81",
"keywords": [ "keywords": [
"Authentication" "Authentication"
], ],
@ -12,11 +12,11 @@
"axios": "^1.7.2", "axios": "^1.7.2",
"bcrypt": "^5.1.1", "bcrypt": "^5.1.1",
"body-parser": "^1.20.2", "body-parser": "^1.20.2",
"crypto": "^1.0.1",
"jsonwebtoken": "^8.5.1", "jsonwebtoken": "^8.5.1",
"koa-bodyparser": "^4.3.0", "koa-bodyparser": "^4.3.0",
"qrcode.react": "^3.1.0", "qrcode.react": "^3.1.0",
"react-router-dom": "^6.11.2", "react-router-dom": "^6.11.2",
"sequelize": "^6.37.3",
"xml2js": "^0.6.2" "xml2js": "^0.6.2"
}, },
"peerDependencies": { "peerDependencies": {

View File

@ -1,112 +1,164 @@
// --10、解决数据库注册插入问题
import crypto from 'crypto'; import crypto from 'crypto';
import { BasicAuth } from '@tachybase/plugin-auth'; import { BasicAuth } from '@tachybase/plugin-auth';
import { Plugin } from '@tachybase/server'; import { Plugin } from '@tachybase/server';
import axios from 'axios'; import axios from 'axios';
import { Op } from 'sequelize';
import xml2js from 'xml2js'; import xml2js from 'xml2js';
import { authType } from '../constants'; import { authType } from '../constants';
export class PluginReplacePageServer extends Plugin { export class PluginReplacePageServer extends Plugin {
// 从数据库查询config表 // 从数据库查询wechatConfig表
async config() { async getWeChatConfig() {
const repo = this.app.db.getRepository('config'); const repo = this.app.db.getRepository('wechatConfig');
const config = await repo.findById(1); const config = await repo.findById(1);
return config.get(); const { appid, appsecret, token, accesstoken, token_expires_at } = config.get();
return { appid, appsecret, token, accesstoken, token_expires_at };
} }
// 从数据库查询message表 // 从数据库查询wechatMessage表
async message() { async getWeChatMessage() {
const repo = this.app.db.getRepository('message'); const repo = this.app.db.getRepository('wechatMessage');
const messages = await repo.find(); const messages = await repo.find();
return messages; return messages;
} }
// 从数据库查询menu表 // 从数据库查询wechatMenu表
async menu() { async getWeChatMenu() {
const repo = this.app.db.getRepository('menu'); const repo = this.app.db.getRepository('wechatMenu');
const menus = await repo.find();
// 查询三个一级菜单并按 createdAt 倒序排序
const primaryMenus = await repo.find({
where: { button: null },
order: [['createdAt', 'DESC']],
limit: 3,
});
// 查询所有二级菜单并按 createdAt 倒序排序
const secondaryMenus = await repo.find({
where: { button: { [Op.ne]: null } },
order: [['createdAt', 'DESC']],
limit: 5,
});
// 将数据库中的数据构建成菜单结构 // 将数据库中的数据构建成菜单结构
const menuStructure = { button: [] }; const menuStructure = { button: [] };
menus.forEach((menu) => { // 反转一级菜单数组,以便从倒数第三新的开始处理
const reversedPrimaryMenus = primaryMenus.reverse();
// 处理一级菜单
reversedPrimaryMenus.forEach((menu) => {
if (!menu.button) { if (!menu.button) {
// 一级菜单 // 一级菜单
if (menuStructure.button.length < 3) { let name = menu.name;
if (Buffer.byteLength(menu.name, 'utf8') <= 16) { if (Buffer.byteLength(name, 'utf8') > 12) {
menuStructure.button.push({ while (Buffer.byteLength(name, 'utf8') > 12 - 2) {
type: menu.type, // 预留2字节给省略号
name: menu.name, name = name.slice(0, -1);
key: menu.key || undefined,
url: menu.url || undefined,
sub_button: [],
});
} else {
console.warn(`一级菜单名称 "${menu.name}" 超过了 16 个字节的限制`);
}
} else {
console.warn('超过了一级菜单的数量限制');
}
} else {
// 二级菜单
const parentMenu = menuStructure.button.find((btn) => btn.name === menu.button);
if (parentMenu) {
if (parentMenu.sub_button.length < 5) {
if (Buffer.byteLength(menu.name, 'utf8') <= 40) {
parentMenu.sub_button.push({
type: menu.type,
name: menu.name,
key: menu.key || undefined,
url: menu.url || undefined,
});
} else {
console.warn(`二级菜单名称 "${menu.name}" 超过了 40 个字节的限制`);
}
} else {
console.warn('超过了二级菜单的数量限制');
} }
name += '..';
} }
menuStructure.button.push({
type: menu.type,
name: name,
key: menu.key || undefined,
url: menu.url || undefined,
sub_button: [],
});
} }
}); });
console.log('-------------', JSON.stringify(menuStructure, null, 2)); // 反转二级菜单数组
const reversedSecondaryMenus = secondaryMenus.reverse();
// 为一级菜单添加二级菜单
reversedSecondaryMenus.forEach((menu) => {
if (menu.button) {
// 二级菜单
const parentMenu = menuStructure.button.find((btn) => btn.name === menu.button);
if (parentMenu) {
let name = menu.name;
if (Buffer.byteLength(name, 'utf8') > 32) {
while (Buffer.byteLength(name, 'utf8') > 32 - 2) {
// 预留2字节给省略号
name = name.slice(0, -1);
}
name += '..';
}
parentMenu.sub_button.push({
type: menu.type,
name: name,
key: menu.key || undefined,
url: menu.url || undefined,
});
}
}
});
return menuStructure; return menuStructure;
} }
// 从数据库查询wechatArticle表
async getWeChatArticle() {
const repo = this.app.db.getRepository('wechatArticle');
const articles = await repo.find({ order: [['id', 'desc']], limit: 1 });
if (articles.length > 0) {
return articles[0];
} else {
this.app.logger.error('No articles found in the database');
return null;
}
}
// 验证Wechat平台的请求签名 // 验证Wechat平台的请求签名
async checkSignature(query) { async checkSignature(query) {
const { signature, timestamp, nonce } = query; const { signature, timestamp, nonce } = query;
const hash = crypto.createHash('sha1'); const hash = crypto.createHash('sha1');
const { token } = await this.config(); // 获取配置的token完成Wechat签名认证 const { token } = await this.getWeChatConfig(); // 获取配置的token完成Wechat签名认证
const str = [token, timestamp, nonce].sort().join(''); const str = [token, timestamp, nonce].sort().join('');
hash.update(str); hash.update(str);
const result = hash.digest('hex') === signature; const result = hash.digest('hex') === signature;
return result; return result;
} }
// 获取Wechat-Token // 获取AccessToken
async getAccessToken() { async getAccessToken(forceRefresh = false) {
const { appid, appsecret } = await this.config(); // 使用config方法 查询config表 const configRepo = this.app.db.getRepository('wechatConfig');
const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${appsecret}`; const config = await this.getWeChatConfig();
const { appid, appsecret, accesstoken, token_expires_at } = config;
console.log(`Fetching access token from URL: ${url}`); const now = Date.now();
console.log(`App ID: ${appid}, App Secret: ${appsecret}`); const bufferTime = 10 * 60 * 1000; // 提前10分钟转换为毫秒
// 判断是否需要刷新access token
if (!forceRefresh && accesstoken && token_expires_at && now < token_expires_at - bufferTime) {
return accesstoken;
}
const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${appsecret}`;
try { try {
const response = await axios.get(url); const response = await axios.get(url);
console.log('Access token response:', response.data); const newAccessToken = response.data.access_token;
return response.data.access_token; const expiresIn = response.data.expires_in * 1000; // 转换为毫秒
const newTokenExpiresAt = now + expiresIn; // 实际过期时间
await configRepo.update({
filter: { id: 1 },
values: { accesstoken: newAccessToken, token_expires_at: newTokenExpiresAt },
});
return newAccessToken;
} catch (error) { } catch (error) {
console.error('Error getting access token:', error); this.app.logger.error(`Error getting access token: ${JSON.stringify(error)}`);
return null; return null;
} }
} }
// 生成OAuth授权URL // 生成OAuth授权URL
async generateAuthUrl() { async generateAuthUrl() {
const { appid } = await this.config(); // 获取appid const { appid } = await this.getWeChatConfig(); // 获取appid
const redirectUri = encodeURIComponent('https://lu.dev.daoyoucloud.com/api/wechat@handleOAuthCallback'); const redirectUri = encodeURIComponent('https://lu.dev.daoyoucloud.com/api/wechat@handleOAuthCallback');
const scope = 'snsapi_userinfo'; // 获取用户信息的权限 const scope = 'snsapi_userinfo'; // 获取用户信息的权限
const state = 'STATE'; // 自定义的state参数 const state = 'STATE'; // 自定义的state参数
@ -119,10 +171,11 @@ export class PluginReplacePageServer extends Plugin {
async generateQrCode() { async generateQrCode() {
const authUrl = await this.generateAuthUrl(); const authUrl = await this.generateAuthUrl();
if (!authUrl) { if (!authUrl) {
console.error('Failed to generate OAuth URL'); this.app.logger.error('Failed to generate OAuth URL');
return null; return null;
} }
// TODO: 修改为前端使用库,生成授权二维码
const qrCodeUrl = `https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(authUrl)}&size=300x300`; const qrCodeUrl = `https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(authUrl)}&size=300x300`;
return qrCodeUrl; return qrCodeUrl;
} }
@ -130,10 +183,10 @@ export class PluginReplacePageServer extends Plugin {
// 创建菜单 // 创建菜单
async createCustomMenu() { async createCustomMenu() {
const accessToken = await this.getAccessToken(); // 获取Wechat Token const accessToken = await this.getAccessToken(); // 获取Wechat Token
const menu = await this.menu(); // 获取菜单数据 const menu = await this.getWeChatMenu(); // 获取菜单数据
if (!accessToken) { if (!accessToken) {
console.error('Failed to get access token'); this.app.logger.error('Failed to get access token');
return; return;
} }
@ -142,9 +195,9 @@ export class PluginReplacePageServer extends Plugin {
// 若通过accessToken验证则发送Wechat请求创建菜单 // 若通过accessToken验证则发送Wechat请求创建菜单
try { try {
const response = await axios.post(url, menu); const response = await axios.post(url, menu);
console.log('Create menu response:', response.data); this.app.logger.info(`Create menu response: ${JSON.stringify(response.data)}`);
} catch (error) { } catch (error) {
console.error('Error creating menu:', error); this.app.logger.error(`Error creating menu: ${JSON.stringify(error)}`);
} }
} }
@ -168,15 +221,17 @@ export class PluginReplacePageServer extends Plugin {
return; return;
} }
const messages = await this.message(); // 调用当前对象的 message方法 const messages = await this.getWeChatMessage(); // 调用当前对象的 message方法
const messagesList = messages.map((message) => `${message.id}${message.key}`).join('\n'); const messagesList = messages.map((message) => `${message.id}${message.key}`).join('\n');
// TODO: 用户可以在前端配置默认回复
// 可以把默认回复添加到wechat_cofig表里面
let replyContent = `您好,欢迎关注道有云网络科技有限公司!您可以输入下面关键字来获取您要了解的信息!\n(输入序号或关键字)\n${messagesList}`; let replyContent = `您好,欢迎关注道有云网络科技有限公司!您可以输入下面关键字来获取您要了解的信息!\n(输入序号或关键字)\n${messagesList}`;
// 解析 POST 请求的 XML 格式消息体 // 解析 POST 请求的 XML 格式消息体
xml2js.parseString(body, { explicitArray: false }, (err, result) => { xml2js.parseString(body, { explicitArray: false }, (err, result) => {
if (err) { if (err) {
console.error('Error parsing XML:', err); this.app.logger.error(`Error parsing XML: ${JSON.stringify(err)}`);
ctx.status = 500; ctx.status = 500;
ctx.body = 'Server Error'; ctx.body = 'Server Error';
return; return;
@ -251,7 +306,6 @@ export class PluginReplacePageServer extends Plugin {
// 处理OAuth回调 // 处理OAuth回调
async handleOAuthCallback(ctx) { async handleOAuthCallback(ctx) {
const { code } = ctx.query; const { code } = ctx.query;
console.log('code---:', code);
if (!code) { if (!code) {
ctx.status = 400; ctx.status = 400;
@ -260,15 +314,12 @@ export class PluginReplacePageServer extends Plugin {
} }
try { try {
const { appid, appsecret } = await this.config(); const { appid, appsecret } = await this.getWeChatConfig();
console.log('appid---:', appid);
console.log('appsecret---:', appsecret);
// 获取 access_token 和 openid // 获取 access_token 和 openid
const tokenUrl = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${appid}&secret=${appsecret}&code=${code}&grant_type=authorization_code`; const tokenUrl = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${appid}&secret=${appsecret}&code=${code}&grant_type=authorization_code`;
const tokenResponse = await axios.get(tokenUrl); const tokenResponse = await axios.get(tokenUrl);
const { access_token, openid } = tokenResponse.data; const { access_token, openid } = tokenResponse.data;
console.log('access_token---:', access_token, '\n openid---:', openid);
if (!access_token || !openid) { if (!access_token || !openid) {
throw new Error('Failed to get access token or openid'); throw new Error('Failed to get access token or openid');
@ -280,7 +331,6 @@ export class PluginReplacePageServer extends Plugin {
// 用户信息 // 用户信息
const userInfo = userInfoResponse.data; const userInfo = userInfoResponse.data;
console.log('用户信息:', userInfo);
// 检查数据库中是否存在该用户 // 检查数据库中是否存在该用户
const userRepo = this.app.db.getRepository('users'); const userRepo = this.app.db.getRepository('users');
@ -294,55 +344,225 @@ export class PluginReplacePageServer extends Plugin {
// 如果用户不存在,则插入新用户 // 如果用户不存在,则插入新用户
await userRepo.create({ await userRepo.create({
values: { values: {
username: openid.substring(0, 6), username: openid.slice(-6),
password: openid, password: openid,
nickname: userInfo.nickname, nickname: userInfo.nickname,
}, },
}); });
console.log('新用户已创建:', userInfo.nickname); this.app.logger.info(`新用户已创建: ${JSON.stringify(userInfo.nickname)}`);
} else { } else {
// 如果用户存在,直接登录 // 如果用户存在,直接登录
console.log('用户已存在:', existingUser.nickname); this.app.logger.info(`用户已存在:' ${JSON.stringify(existingUser.nickname)}`);
} }
// 这里可以设置登录态或返回登录成功的信息 // 这里可以设置登录态或返回登录成功的信息
ctx.body = '完成注册,登录成功!'; ctx.body = '完成注册,登录成功!';
// 返回手机端页面
// ctx.redirect('https://lu.dev.daoyoucloud.com/admin/4tr7gnzlwni');
} catch (error) { } catch (error) {
console.error('Error handling OAuth callback:', error); this.app.logger.error(`Error handling OAuth callback: ${JSON.stringify(error)}`);
ctx.status = 500; ctx.status = 500;
ctx.body = 'Server Error'; ctx.body = 'Server Error';
// ctx.body = '您已存在账户,登录成功!';
} }
} }
// 从素材库获取素材列表
async getMaterialList() {
const accessToken = await this.getAccessToken(); // 获取WeChat的access token
if (!accessToken) {
this.app.logger.error('Failed to get access token');
return null;
}
const url = `https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=${accessToken}`;
const data = {
type: 'image', // 需要检查的素材类型image, video, voice, news
offset: 0,
count: 20, // 每次获取的素材数量,可以根据需要调整
};
try {
const response = await axios.post(url, data);
if (response.data.item) {
response.data.item.forEach((material) => {
this.app.logger.info(
`Media ID: ${JSON.stringify(material.media_id)}, Name: ${JSON.stringify(material.name)}, Update Time: ${JSON.stringify(material.update_time)}`,
);
});
return response.data.item;
} else {
this.app.logger.error(`Failed to get material list: ${JSON.stringify(response.data)}`);
return null;
}
} catch (error) {
this.app.logger.error(`Error getting material list: ${JSON.stringify(error)}`);
return null;
}
}
// 检查素材是否为永久素材
async checkMaterialType(mediaId) {
const materials = await this.getMaterialList();
if (materials) {
const material = materials.find((item) => item.media_id === mediaId);
if (material) {
this.app.logger.info(`Material ID: ${JSON.stringify(mediaId)} is a permanent material.`);
return true; // 表示是永久素材
} else {
this.app.logger.info(`Material ID: ${JSON.stringify(mediaId)} is not found in permanent materials.`);
return false; // 表示不是永久素材
}
} else {
this.app.logger.error('No materials found.');
return false;
}
}
// 更新articles表中的thumb_media_id字段
async updateLatestArticleWithLatestMediaId() {
const materialList = await this.getMaterialList();
if (materialList && materialList.length > 0) {
const latestMediaId = materialList[materialList.length - 1].media_id;
// 获取articles表中的最后一条记录
const repo = this.app.db.getRepository('wechatArticle');
const articles = await repo.find({ order: [['id', 'desc']], limit: 1 });
if (articles.length > 0) {
const latestArticle = articles[0];
await repo.update({
filter: { id: latestArticle.id },
values: { thumb_media_id: latestMediaId },
});
this.app.logger.info(
`Article ${JSON.stringify(latestArticle.id)} thumb_media_id updated to ${JSON.stringify(latestMediaId)}`,
);
} else {
this.app.logger.error('No articles found in the database');
}
} else {
this.app.logger.error('No materials found in WeChat material list');
}
}
// 上传图文到草稿箱
async uploadNewsToDraft(article) {
const isPermanent = await this.checkMaterialType(article.thumb_media_id);
if (!isPermanent) {
this.app.logger.error(`Thumb media ID: ${JSON.stringify(article.thumb_media_id)} is not a permanent material.`);
return null;
}
const accessToken = await this.getAccessToken(); // 获取WeChat的access token
if (!accessToken) {
this.app.logger.error('Failed to get access token');
return null;
}
const url = `https://api.weixin.qq.com/cgi-bin/draft/add?access_token=${accessToken}`;
const articleData = {
articles: [
{
title: article.title,
thumb_media_id: article.thumb_media_id, // 确保这是一个永久素材的 thumb_media_id
author: article.author,
digest: article.digest || '',
show_cover_pic: 1,
content: article.content,
content_source_url: article.content_source_url || '',
},
],
};
try {
const response = await axios.post(url, articleData);
this.app.logger.info(`Upload news to draft response: ${JSON.stringify(response.data)}`);
if (response.data.errcode) {
this.app.logger.error(
`Error code: ${JSON.stringify(response.data.errcode)}, message: ${JSON.stringify(response.data.errmsg)}`,
);
return null;
}
return response.data.media_id;
} catch (error) {
this.app.logger.error(`Error uploading news to draft: ${JSON.stringify(error)}`);
return null;
}
}
// 发送推文接口
async sendNewsToAll(mediaId) {
const accessToken = await this.getAccessToken();
if (!accessToken) {
this.app.logger.error('Failed to get access token');
return null;
}
const url = `https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=${accessToken}`;
const messageData = {
filter: {
is_to_all: true, // 发送给所有用户
},
mpnews: {
media_id: mediaId,
},
msgtype: 'mpnews',
send_ignore_reprint: 0,
};
try {
const response = await axios.post(url, messageData);
this.app.logger.info(`Send news response: ${JSON.stringify(response.data)}`);
if (response.data.errcode) {
this.app.logger.error(
`Error code: ${JSON.stringify(response.data.errcode)}, message: ${JSON.stringify(response.data.errmsg)}`,
);
return null;
}
return response.data;
} catch (error) {
this.app.logger.error(`Error sending news: ${JSON.stringify(error)}`);
return null;
}
}
// 发布文章接口
async publishLastArticleToWeChat() {
const article = await this.getWeChatArticle(); // 获取最后一条文章
if (article) {
const mediaId = await this.uploadNewsToDraft(article); // 上传图文消息到草稿箱获取media_id
if (mediaId) {
const result = await this.sendNewsToAll(mediaId); // 使用media_id进行群发
return result;
}
}
return null;
}
// load() 生命周期函数,在插件加载时执行 // load() 生命周期函数,在插件加载时执行
async load() { async load() {
// 监听 message 表的 afterCreate 事件 // 监听 message 表的 afterCreate 事件
this.app.db.on('message.afterCreate', this.handleMessageCreate.bind(this)); this.app.db.on('wechatMessage.afterCreate', this.handleMessageCreate.bind(this));
// 监听 menu 表的 afterUpdate 事件 // 监听 menu 表的 afterUpdate 事件
this.app.db.on('menu.afterUpdate', this.handleMenuUpdate.bind(this)); this.app.db.on('wechatMenu.afterUpdate', this.handleMenuUpdate.bind(this));
// 注册认证(前端显示按钮) // 注册认证(前端显示按钮)
this.app.authManager.registerTypes(authType, { this.app.authManager.registerTypes(authType, {
auth: BasicAuth, auth: BasicAuth,
}); });
// 定义资源动作
this.app.resourcer.define({ this.app.resourcer.define({
name: 'wechat', name: 'wechat',
actions: { actions: {
// 测试接口
test: async (ctx) => {
ctx.withoutDataWrapping = true;
ctx.body = 'Hello World!';
console.log('Hello World!');
},
// 创建菜单接口 // 创建菜单接口
createMenu: async (ctx) => { createMenu: async (ctx) => {
await this.createCustomMenu(); await this.createCustomMenu();
console.log('Custom menu created successfully.'); this.app.logger.info('Custom menu created successfully.');
ctx.body = 'success'; ctx.body = 'success';
}, },
// Wechat 消息处理接口/服务器URL配置接口 // Wechat 消息处理接口/服务器URL配置接口
@ -359,7 +579,7 @@ export class PluginReplacePageServer extends Plugin {
const qrCodeUrl = await this.generateQrCode(); const qrCodeUrl = await this.generateQrCode();
if (qrCodeUrl) { if (qrCodeUrl) {
ctx.body = { data: { url: qrCodeUrl } }; // 确保返回的数据格式正确 ctx.body = { data: { url: qrCodeUrl } }; // 确保返回的数据格式正确
console.log(`我是生成二维码接口的URL: ${qrCodeUrl}`); this.app.logger.info(`我是生成二维码接口的URL: ${JSON.stringify(qrCodeUrl)}`);
} else { } else {
ctx.status = 500; ctx.status = 500;
ctx.body = 'Failed to generate QR code'; ctx.body = 'Failed to generate QR code';
@ -369,6 +589,21 @@ export class PluginReplacePageServer extends Plugin {
handleOAuthCallback: async (ctx) => { handleOAuthCallback: async (ctx) => {
await this.handleOAuthCallback(ctx); await this.handleOAuthCallback(ctx);
}, },
// 获取素材列表并更新最新文章的封面图片接口
updateLatestArticleWithLatestMediaId: async (ctx) => {
await this.updateLatestArticleWithLatestMediaId();
ctx.body = 'Latest article updated with latest media ID';
},
// 发布最新文章到微信公众号接口
publishLastArticleToWeChat: async (ctx) => {
const result = await this.publishLastArticleToWeChat();
if (result) {
ctx.body = 'Article published to WeChat successfully';
} else {
ctx.status = 500;
ctx.body = 'Failed to publish article to WeChat';
}
},
}, },
}); });
@ -378,11 +613,11 @@ export class PluginReplacePageServer extends Plugin {
// 处理 message 表的 afterCreate 事件 // 处理 message 表的 afterCreate 事件
async handleMessageCreate(model, options) { async handleMessageCreate(model, options) {
const { id, key, value } = model.get(); const { id, key, value } = model.get();
console.log(`New message created: ${key} - ${value}`); this.app.logger.info(`New message created: ${JSON.stringify(key)} - ${JSON.stringify(value)}`);
// 获取所有关注公众号的用户 ID // 获取所有关注公众号的用户 ID
const userIds = await this.getAllFollowers(); const userIds = await this.getAllFollowers();
console.log('Follower IDs:', userIds); this.app.logger.info(`Follower IDs: ${JSON.stringify(userIds)}`);
// 推送消息content // 推送消息content
await this.pushMessageToFollowers(userIds, `目前系统提示已经更新,大家可以使用新的关键字 "${key}" 来获取信息!`); await this.pushMessageToFollowers(userIds, `目前系统提示已经更新,大家可以使用新的关键字 "${key}" 来获取信息!`);
@ -391,11 +626,11 @@ export class PluginReplacePageServer extends Plugin {
// 处理 menu 表的 afterUpdate 事件 // 处理 menu 表的 afterUpdate 事件
async handleMenuUpdate(model, options) { async handleMenuUpdate(model, options) {
const { id, name } = model.get(); const { id, name } = model.get();
console.log(`Menu item updated: ${name} (ID: ${id})`); this.app.logger.info(`Menu item updated: ${JSON.stringify(name)} (ID: ${JSON.stringify(id)})`);
// 获取所有关注公众号的用户 ID // 获取所有关注公众号的用户 ID
const userIds = await this.getAllFollowers(); const userIds = await this.getAllFollowers();
console.log('Follower IDs:', userIds); this.app.logger.info(`Follower IDs: ${JSON.stringify(userIds)}`);
// 推送消息content // 推送消息content
await this.pushMessageToFollowers(userIds, '用户你好,菜单项已经更新'); await this.pushMessageToFollowers(userIds, '用户你好,菜单项已经更新');
@ -405,7 +640,7 @@ export class PluginReplacePageServer extends Plugin {
async getAllFollowers() { async getAllFollowers() {
const accessToken = await this.getAccessToken(); const accessToken = await this.getAccessToken();
if (!accessToken) { if (!accessToken) {
console.error('Failed to get access token'); this.app.logger.error('Failed to get access token');
return []; return [];
} }
@ -413,13 +648,12 @@ export class PluginReplacePageServer extends Plugin {
try { try {
const response = await axios.get(url); const response = await axios.get(url);
if (response.data.errcode) { if (response.data.errcode) {
console.error(`Error getting followers: ${response.data.errmsg}`); this.app.logger.error(`Error getting followers: ${JSON.stringify(response.data.errmsg)}`);
return []; return [];
} }
console.log('返回用户ID数组----');
return response.data.data.openid; // 返回关注者的OpenID数组 return response.data.data.openid; // 返回关注者的OpenID数组
} catch (error) { } catch (error) {
console.error('Error getting followers:', error); this.app.logger.error(`Error getting followers: ${JSON.stringify(error)}`);
return []; return [];
} }
} }
@ -428,7 +662,7 @@ export class PluginReplacePageServer extends Plugin {
async pushMessageToFollowers(userIds, message) { async pushMessageToFollowers(userIds, message) {
const accessToken = await this.getAccessToken(); const accessToken = await this.getAccessToken();
if (!accessToken) { if (!accessToken) {
console.error('Failed to get access token'); this.app.logger.error('Failed to get access token');
return; return;
} }
@ -447,12 +681,14 @@ export class PluginReplacePageServer extends Plugin {
try { try {
const response = await axios.post(url, data); const response = await axios.post(url, data);
if (response.data.errcode) { if (response.data.errcode) {
console.error(`Error pushing message to user ${userId}: ${response.data.errmsg}`); this.app.logger.error(
`Error pushing message to user ${JSON.stringify(userId)}: ${JSON.stringify(response.data.errmsg)}`,
);
} else { } else {
console.log(`Message pushed to user ${userId} successfully.`); this.app.logger.info(`Message pushed to user ${JSON.stringify(userId)} successfully.`);
} }
} catch (error) { } catch (error) {
console.error(`Error pushing message to user ${userId}:`, error); this.app.logger.error(`Error pushing message to user ${JSON.stringify(userId)}: ${JSON.stringify(error)}`);
} }
} }
} }

View File

@ -2206,7 +2206,7 @@ importers:
dependencies: dependencies:
'@nomicfoundation/hardhat-toolbox': '@nomicfoundation/hardhat-toolbox':
specifier: ^5.0.0 specifier: ^5.0.0
version: 5.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7)(@nomicfoundation/hardhat-ethers@3.0.6)(@nomicfoundation/hardhat-ignition-ethers@0.15.5)(@nomicfoundation/hardhat-network-helpers@1.0.11)(@nomicfoundation/hardhat-verify@2.0.8)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.16)(@types/mocha@10.0.7)(@types/node@20.14.2)(chai@4.3.10)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.6)(solidity-coverage@0.8.12)(ts-node@9.1.1)(typechain@8.3.2)(typescript@5.5.4) version: 5.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7)(@nomicfoundation/hardhat-ethers@3.0.6)(@nomicfoundation/hardhat-ignition-ethers@0.15.5)(@nomicfoundation/hardhat-network-helpers@1.0.11)(@nomicfoundation/hardhat-verify@2.0.9)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.16)(@types/mocha@10.0.7)(@types/node@20.14.2)(chai@4.3.10)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.7)(solidity-coverage@0.8.12)(ts-node@9.1.1)(typechain@8.3.2)(typescript@5.5.4)
'@tachybase/actions': '@tachybase/actions':
specifier: workspace:* specifier: workspace:*
version: link:../../../core/actions version: link:../../../core/actions
@ -2230,7 +2230,7 @@ importers:
version: 0.0.1-security version: 0.0.1-security
hardhat: hardhat:
specifier: ^2.22.6 specifier: ^2.22.6
version: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) version: 2.22.7(ts-node@9.1.1)(typescript@5.5.4)
path: path:
specifier: ^0.12.7 specifier: ^0.12.7
version: 0.12.7 version: 0.12.7
@ -4104,9 +4104,6 @@ importers:
body-parser: body-parser:
specifier: ^1.20.2 specifier: ^1.20.2
version: 1.20.2 version: 1.20.2
crypto:
specifier: ^1.0.1
version: 1.0.1
jsonwebtoken: jsonwebtoken:
specifier: ^8.5.1 specifier: ^8.5.1
version: 8.5.1 version: 8.5.1
@ -4119,6 +4116,9 @@ importers:
react-router-dom: react-router-dom:
specifier: ^6.11.2 specifier: ^6.11.2
version: 6.25.1(react-dom@18.3.1)(react@18.3.1) version: 6.25.1(react-dom@18.3.1)(react@18.3.1)
sequelize:
specifier: ^6.37.3
version: 6.37.3
xml2js: xml2js:
specifier: ^0.6.2 specifier: ^0.6.2
version: 0.6.2 version: 0.6.2
@ -5010,7 +5010,7 @@ packages:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0
react-router: ^5.0.0 || ^6.0.0 react-router: ^5.0.0 || ^6.0.0
dependencies: dependencies:
ahooks: 3.7.8(react@18.3.1) ahooks: 3.7.11(react@18.3.1)
query-string: 6.14.1 query-string: 6.14.1
react: 18.3.1 react: 18.3.1
react-router: 6.21.1(react@18.3.1) react-router: 6.21.1(react@18.3.1)
@ -10672,7 +10672,6 @@ packages:
/@mapbox/node-pre-gyp@1.0.11: /@mapbox/node-pre-gyp@1.0.11:
resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==}
hasBin: true hasBin: true
requiresBuild: true
dependencies: dependencies:
detect-libc: 2.0.3 detect-libc: 2.0.3
https-proxy-agent: 5.0.1 https-proxy-agent: 5.0.1
@ -10834,52 +10833,52 @@ packages:
'@nodelib/fs.scandir': 2.1.5 '@nodelib/fs.scandir': 2.1.5
fastq: 1.15.0 fastq: 1.15.0
/@nomicfoundation/edr-darwin-arm64@0.4.2: /@nomicfoundation/edr-darwin-arm64@0.5.0:
resolution: {integrity: sha512-S+hhepupfqpBvMa9M1PVS08sVjGXsLnjyAsjhrrsjsNuTHVLhKzhkguvBD5g4If5skrwgOaVqpag4wnQbd15kQ==} resolution: {integrity: sha512-G6OX/PESdfU4ZOyJ4MDh4eevW0wt2mduuxA+thXtTcStOiQTtPuV205h4kLOR5wRB1Zz6Zy0LedTMax7TzOtGw==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
dev: false dev: false
/@nomicfoundation/edr-darwin-x64@0.4.2: /@nomicfoundation/edr-darwin-x64@0.5.0:
resolution: {integrity: sha512-/zM94AUrXz6CmcsecRNHJ50jABDUFafmGc4iBmkfX/mTp4tVZj7XTyIogrQIt0FnTaeb4CgZoLap2+8tW/Uldg==} resolution: {integrity: sha512-fI7uHfHqPtdPZjkFUTpotc/F5gGv41ws+jSZy9+2AR9RDMOAIXMEArOx9rGLBcevWu8SFnyH/l/77kG/5FXbDw==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
dev: false dev: false
/@nomicfoundation/edr-linux-arm64-gnu@0.4.2: /@nomicfoundation/edr-linux-arm64-gnu@0.5.0:
resolution: {integrity: sha512-TV3Pr2tFvvmCfPCi9PaCGLtqn+oLaPKfL2NWpnoCeFFdzDQXi2L930yP1oUPY5RXd78NLdVHMkEkbhb2b6Wuvg==} resolution: {integrity: sha512-eMC3sWPkBZILg2/YB4Xv6IR0nggCLt5hS8K8jjHeGEeUs9pf8poBF2Oy+G4lSu0YLLjexGzHypz9/P+pIuxZHw==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
dev: false dev: false
/@nomicfoundation/edr-linux-arm64-musl@0.4.2: /@nomicfoundation/edr-linux-arm64-musl@0.5.0:
resolution: {integrity: sha512-PALwrLBk1M9rolXyhSX8xdhe5jL0qf/PgiCIF7W7lUyVKrI/I0oiU0EHDk/Xw7yi2UJg4WRyhhZoHYa0g4g8Qg==} resolution: {integrity: sha512-yPK0tKjYRxe5ktggFr8aBHH0DCI9uafuaD8QuzyrQAfSf/m/ebTdgthROdbYp6eRk5mJyfAQT/45fM3tnlYsWw==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
dev: false dev: false
/@nomicfoundation/edr-linux-x64-gnu@0.4.2: /@nomicfoundation/edr-linux-x64-gnu@0.5.0:
resolution: {integrity: sha512-5svkftypDjAZ1LxV1onojlaqPRxrTEjJLkrUwLL+Fao5ZMe7aTnk5QQ1Jv76gW6WYZnMXNgjPhRcnw3oSNrqFA==} resolution: {integrity: sha512-Hds8CRYi4DEyuErjcwUNSvNpMzmOYUihW4qYCoKgSBUVS5saX1PyPYvFYuYpeU5J8/T2iMk6yAPVLCxtKbgnKg==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
dev: false dev: false
/@nomicfoundation/edr-linux-x64-musl@0.4.2: /@nomicfoundation/edr-linux-x64-musl@0.5.0:
resolution: {integrity: sha512-qiMlXQTggdH9zfOB4Eil4rQ95z8s7QdLJcOfz5Aym12qJNkCyF9hi4cc4dDCWA0CdI3x3oLbuf8qb81SF8R45w==} resolution: {integrity: sha512-1hXMDSzdyh5ojwO3ZSRbt7t5KKYycGUlFdC3lgJRZ7gStB8xjb7RA3hZn2csn9OydS950Ne4nh+puNq91iXApw==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
dev: false dev: false
/@nomicfoundation/edr-win32-x64-msvc@0.4.2: /@nomicfoundation/edr-win32-x64-msvc@0.5.0:
resolution: {integrity: sha512-hDkAb0iaMmGYwBY/rA1oCX8VpsezfQcHPEPIEGXEcWC3WbnOgIZo0Qkpu/g0OMtFOJSQlWLXvKZuV7blhnrQag==} resolution: {integrity: sha512-CFagD423400xXkRmACIR13FoocN48qi4ogRnuFQIvBDtEE3aMEajfFj4bycmQQDqnqChsZy/jwD4OxbX6oaNJw==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
dev: false dev: false
/@nomicfoundation/edr@0.4.2: /@nomicfoundation/edr@0.5.0:
resolution: {integrity: sha512-U7v0HuZHfrsl/5FpUzuB2FYA0+FUglHHwiO6NhvLtNYKMZcPzdS6iUriMp/7GWs0SVxW3bAht9GinZPxdhVwWg==} resolution: {integrity: sha512-nAUyjGhxntXje/1AkDX9POfH+pqUxdi4XHzIhaf/dJYs7fgAFxL3STBK1OYcA3LR7vtiylLHMz7wxjqLzlLGKg==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
dependencies: dependencies:
'@nomicfoundation/edr-darwin-arm64': 0.4.2 '@nomicfoundation/edr-darwin-arm64': 0.5.0
'@nomicfoundation/edr-darwin-x64': 0.4.2 '@nomicfoundation/edr-darwin-x64': 0.5.0
'@nomicfoundation/edr-linux-arm64-gnu': 0.4.2 '@nomicfoundation/edr-linux-arm64-gnu': 0.5.0
'@nomicfoundation/edr-linux-arm64-musl': 0.4.2 '@nomicfoundation/edr-linux-arm64-musl': 0.5.0
'@nomicfoundation/edr-linux-x64-gnu': 0.4.2 '@nomicfoundation/edr-linux-x64-gnu': 0.5.0
'@nomicfoundation/edr-linux-x64-musl': 0.4.2 '@nomicfoundation/edr-linux-x64-musl': 0.5.0
'@nomicfoundation/edr-win32-x64-msvc': 0.4.2 '@nomicfoundation/edr-win32-x64-msvc': 0.5.0
dev: false dev: false
/@nomicfoundation/ethereumjs-common@4.0.4: /@nomicfoundation/ethereumjs-common@4.0.4:
@ -10924,7 +10923,7 @@ packages:
ethereum-cryptography: 0.1.3 ethereum-cryptography: 0.1.3
dev: false dev: false
/@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.6)(chai@4.3.10)(ethers@6.13.2)(hardhat@2.22.6): /@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.6)(chai@4.3.10)(ethers@6.13.2)(hardhat@2.22.7):
resolution: {integrity: sha512-RQfsiTwdf0SP+DtuNYvm4921X6VirCQq0Xyh+mnuGlTwEFSPZ/o27oQC+l+3Y/l48DDU7+ZcYBR+Fp+Rp94LfQ==} resolution: {integrity: sha512-RQfsiTwdf0SP+DtuNYvm4921X6VirCQq0Xyh+mnuGlTwEFSPZ/o27oQC+l+3Y/l48DDU7+ZcYBR+Fp+Rp94LfQ==}
peerDependencies: peerDependencies:
'@nomicfoundation/hardhat-ethers': ^3.0.0 '@nomicfoundation/hardhat-ethers': ^3.0.0
@ -10932,17 +10931,17 @@ packages:
ethers: ^6.1.0 ethers: ^6.1.0
hardhat: ^2.9.4 hardhat: ^2.9.4
dependencies: dependencies:
'@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.2)(hardhat@2.22.6) '@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.2)(hardhat@2.22.7)
'@types/chai-as-promised': 7.1.8 '@types/chai-as-promised': 7.1.8
chai: 4.3.10 chai: 4.3.10
chai-as-promised: 7.1.2(chai@4.3.10) chai-as-promised: 7.1.2(chai@4.3.10)
deep-eql: 4.1.3 deep-eql: 4.1.3
ethers: 6.13.2 ethers: 6.13.2
hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4)
ordinal: 1.0.3 ordinal: 1.0.3
dev: false dev: false
/@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.2)(hardhat@2.22.6): /@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.2)(hardhat@2.22.7):
resolution: {integrity: sha512-/xzkFQAaHQhmIAYOQmvHBPwL+NkwLzT9gRZBsgWUYeV+E6pzXsBQsHfRYbAZ3XEYare+T7S+5Tg/1KDJgepSkA==} resolution: {integrity: sha512-/xzkFQAaHQhmIAYOQmvHBPwL+NkwLzT9gRZBsgWUYeV+E6pzXsBQsHfRYbAZ3XEYare+T7S+5Tg/1KDJgepSkA==}
peerDependencies: peerDependencies:
ethers: ^6.1.0 ethers: ^6.1.0
@ -10950,13 +10949,13 @@ packages:
dependencies: dependencies:
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@5.5.0)
ethers: 6.13.2 ethers: 6.13.2
hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4)
lodash.isequal: 4.5.0 lodash.isequal: 4.5.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
dev: false dev: false
/@nomicfoundation/hardhat-ignition-ethers@0.15.5(@nomicfoundation/hardhat-ethers@3.0.6)(@nomicfoundation/hardhat-ignition@0.15.5)(@nomicfoundation/ignition-core@0.15.5)(ethers@6.13.2)(hardhat@2.22.6): /@nomicfoundation/hardhat-ignition-ethers@0.15.5(@nomicfoundation/hardhat-ethers@3.0.6)(@nomicfoundation/hardhat-ignition@0.15.5)(@nomicfoundation/ignition-core@0.15.5)(ethers@6.13.2)(hardhat@2.22.7):
resolution: {integrity: sha512-W6s1QN9CFxzSVZS6w9Jcj3WLaK32z2FP5MxNU2OKY1Fn9ZzLr+miXbUbWYuRHl6dxrrl6sE8cv33Cybv19pmCg==} resolution: {integrity: sha512-W6s1QN9CFxzSVZS6w9Jcj3WLaK32z2FP5MxNU2OKY1Fn9ZzLr+miXbUbWYuRHl6dxrrl6sE8cv33Cybv19pmCg==}
peerDependencies: peerDependencies:
'@nomicfoundation/hardhat-ethers': ^3.0.4 '@nomicfoundation/hardhat-ethers': ^3.0.4
@ -10965,26 +10964,26 @@ packages:
ethers: ^6.7.0 ethers: ^6.7.0
hardhat: ^2.18.0 hardhat: ^2.18.0
dependencies: dependencies:
'@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.2)(hardhat@2.22.6) '@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.2)(hardhat@2.22.7)
'@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@2.0.8)(hardhat@2.22.6) '@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@2.0.9)(hardhat@2.22.7)
'@nomicfoundation/ignition-core': 0.15.5 '@nomicfoundation/ignition-core': 0.15.5
ethers: 6.13.2 ethers: 6.13.2
hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4)
dev: false dev: false
/@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.8)(hardhat@2.22.6): /@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9)(hardhat@2.22.7):
resolution: {integrity: sha512-Y5nhFXFqt4owA6Ooag8ZBFDF2RAZElMXViknVIsi3m45pbQimS50ti6FU8HxfRkDnBARa40CIn7UGV0hrelzDw==} resolution: {integrity: sha512-Y5nhFXFqt4owA6Ooag8ZBFDF2RAZElMXViknVIsi3m45pbQimS50ti6FU8HxfRkDnBARa40CIn7UGV0hrelzDw==}
peerDependencies: peerDependencies:
'@nomicfoundation/hardhat-verify': ^2.0.1 '@nomicfoundation/hardhat-verify': ^2.0.1
hardhat: ^2.18.0 hardhat: ^2.18.0
dependencies: dependencies:
'@nomicfoundation/hardhat-verify': 2.0.8(hardhat@2.22.6) '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.7)
'@nomicfoundation/ignition-core': 0.15.5 '@nomicfoundation/ignition-core': 0.15.5
'@nomicfoundation/ignition-ui': 0.15.5 '@nomicfoundation/ignition-ui': 0.15.5
chalk: 4.1.2 chalk: 4.1.2
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@5.5.0)
fs-extra: 10.1.0 fs-extra: 10.1.0
hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4)
prompts: 2.4.2 prompts: 2.4.2
transitivePeerDependencies: transitivePeerDependencies:
- bufferutil - bufferutil
@ -10992,16 +10991,16 @@ packages:
- utf-8-validate - utf-8-validate
dev: false dev: false
/@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.6): /@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.7):
resolution: {integrity: sha512-uGPL7QSKvxrHRU69dx8jzoBvuztlLCtyFsbgfXIwIjnO3dqZRz2GNMHJoO3C3dIiUNM6jdNF4AUnoQKDscdYrA==} resolution: {integrity: sha512-uGPL7QSKvxrHRU69dx8jzoBvuztlLCtyFsbgfXIwIjnO3dqZRz2GNMHJoO3C3dIiUNM6jdNF4AUnoQKDscdYrA==}
peerDependencies: peerDependencies:
hardhat: ^2.9.5 hardhat: ^2.9.5
dependencies: dependencies:
ethereumjs-util: 7.1.5 ethereumjs-util: 7.1.5
hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4)
dev: false dev: false
/@nomicfoundation/hardhat-toolbox@5.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7)(@nomicfoundation/hardhat-ethers@3.0.6)(@nomicfoundation/hardhat-ignition-ethers@0.15.5)(@nomicfoundation/hardhat-network-helpers@1.0.11)(@nomicfoundation/hardhat-verify@2.0.8)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.16)(@types/mocha@10.0.7)(@types/node@20.14.2)(chai@4.3.10)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.6)(solidity-coverage@0.8.12)(ts-node@9.1.1)(typechain@8.3.2)(typescript@5.5.4): /@nomicfoundation/hardhat-toolbox@5.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7)(@nomicfoundation/hardhat-ethers@3.0.6)(@nomicfoundation/hardhat-ignition-ethers@0.15.5)(@nomicfoundation/hardhat-network-helpers@1.0.11)(@nomicfoundation/hardhat-verify@2.0.9)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.16)(@types/mocha@10.0.7)(@types/node@20.14.2)(chai@4.3.10)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.7)(solidity-coverage@0.8.12)(ts-node@9.1.1)(typechain@8.3.2)(typescript@5.5.4):
resolution: {integrity: sha512-FnUtUC5PsakCbwiVNsqlXVIWG5JIb5CEZoSXbJUsEBun22Bivx2jhF1/q9iQbzuaGpJKFQyOhemPB2+XlEE6pQ==} resolution: {integrity: sha512-FnUtUC5PsakCbwiVNsqlXVIWG5JIb5CEZoSXbJUsEBun22Bivx2jhF1/q9iQbzuaGpJKFQyOhemPB2+XlEE6pQ==}
peerDependencies: peerDependencies:
'@nomicfoundation/hardhat-chai-matchers': ^2.0.0 '@nomicfoundation/hardhat-chai-matchers': ^2.0.0
@ -11023,37 +11022,37 @@ packages:
typechain: ^8.3.0 typechain: ^8.3.0
typescript: '>=4.5.0' typescript: '>=4.5.0'
dependencies: dependencies:
'@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.6)(chai@4.3.10)(ethers@6.13.2)(hardhat@2.22.6) '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.6)(chai@4.3.10)(ethers@6.13.2)(hardhat@2.22.7)
'@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.2)(hardhat@2.22.6) '@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.2)(hardhat@2.22.7)
'@nomicfoundation/hardhat-ignition-ethers': 0.15.5(@nomicfoundation/hardhat-ethers@3.0.6)(@nomicfoundation/hardhat-ignition@0.15.5)(@nomicfoundation/ignition-core@0.15.5)(ethers@6.13.2)(hardhat@2.22.6) '@nomicfoundation/hardhat-ignition-ethers': 0.15.5(@nomicfoundation/hardhat-ethers@3.0.6)(@nomicfoundation/hardhat-ignition@0.15.5)(@nomicfoundation/ignition-core@0.15.5)(ethers@6.13.2)(hardhat@2.22.7)
'@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.6) '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.7)
'@nomicfoundation/hardhat-verify': 2.0.8(hardhat@2.22.6) '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.7)
'@typechain/ethers-v6': 0.5.1(ethers@6.13.2)(typechain@8.3.2)(typescript@5.5.4) '@typechain/ethers-v6': 0.5.1(ethers@6.13.2)(typechain@8.3.2)(typescript@5.5.4)
'@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1)(ethers@6.13.2)(hardhat@2.22.6)(typechain@8.3.2) '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1)(ethers@6.13.2)(hardhat@2.22.7)(typechain@8.3.2)
'@types/chai': 4.3.16 '@types/chai': 4.3.16
'@types/mocha': 10.0.7 '@types/mocha': 10.0.7
'@types/node': 20.14.2 '@types/node': 20.14.2
chai: 4.3.10 chai: 4.3.10
ethers: 6.13.2 ethers: 6.13.2
hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4)
hardhat-gas-reporter: 1.0.10(hardhat@2.22.6) hardhat-gas-reporter: 1.0.10(hardhat@2.22.7)
solidity-coverage: 0.8.12(hardhat@2.22.6) solidity-coverage: 0.8.12(hardhat@2.22.7)
ts-node: 9.1.1(typescript@5.5.4) ts-node: 9.1.1(typescript@5.5.4)
typechain: 8.3.2(typescript@5.5.4) typechain: 8.3.2(typescript@5.5.4)
typescript: 5.5.4 typescript: 5.5.4
dev: false dev: false
/@nomicfoundation/hardhat-verify@2.0.8(hardhat@2.22.6): /@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.7):
resolution: {integrity: sha512-x/OYya7A2Kcz+3W/J78dyDHxr0ezU23DKTrRKfy5wDPCnePqnr79vm8EXqX3gYps6IjPBYyGPZ9K6E5BnrWx5Q==} resolution: {integrity: sha512-7kD8hu1+zlnX87gC+UN4S0HTKBnIsDfXZ/pproq1gYsK94hgCk+exvzXbwR0X2giiY/RZPkqY9oKRi0Uev91hQ==}
peerDependencies: peerDependencies:
hardhat: ^2.0.4 hardhat: ^2.22.72.0.4
dependencies: dependencies:
'@ethersproject/abi': 5.7.0 '@ethersproject/abi': 5.7.0
'@ethersproject/address': 5.7.0 '@ethersproject/address': 5.7.0
cbor: 8.1.0 cbor: 8.1.0
chalk: 2.4.2 chalk: 2.4.2
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@5.5.0)
hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4)
lodash.clonedeep: 4.5.0 lodash.clonedeep: 4.5.0
semver: 6.3.1 semver: 6.3.1
table: 6.8.2 table: 6.8.2
@ -12838,7 +12837,7 @@ packages:
react: '>=16.9.0' react: '>=16.9.0'
react-dom: '>=16.9.0' react-dom: '>=16.9.0'
dependencies: dependencies:
'@babel/runtime': 7.25.0 '@babel/runtime': 7.24.7
classnames: 2.5.1 classnames: 2.5.1
rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1)
react: 18.3.1 react: 18.3.1
@ -12899,7 +12898,7 @@ packages:
'@babel/runtime': 7.24.7 '@babel/runtime': 7.24.7
'@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1)
classnames: 2.5.1 classnames: 2.5.1
rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) rc-motion: 2.9.1(react-dom@18.3.1)(react@18.3.1)
rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1)
rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1)
react: 18.3.1 react: 18.3.1
@ -14217,7 +14216,7 @@ packages:
typescript: 5.5.4 typescript: 5.5.4
dev: false dev: false
/@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1)(ethers@6.13.2)(hardhat@2.22.6)(typechain@8.3.2): /@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1)(ethers@6.13.2)(hardhat@2.22.7)(typechain@8.3.2):
resolution: {integrity: sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==} resolution: {integrity: sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==}
peerDependencies: peerDependencies:
'@typechain/ethers-v6': ^0.5.1 '@typechain/ethers-v6': ^0.5.1
@ -14228,7 +14227,7 @@ packages:
'@typechain/ethers-v6': 0.5.1(ethers@6.13.2)(typechain@8.3.2)(typescript@5.5.4) '@typechain/ethers-v6': 0.5.1(ethers@6.13.2)(typechain@8.3.2)(typescript@5.5.4)
ethers: 6.13.2 ethers: 6.13.2
fs-extra: 9.1.0 fs-extra: 9.1.0
hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4)
typechain: 8.3.2(typescript@5.5.4) typechain: 8.3.2(typescript@5.5.4)
dev: false dev: false
@ -16254,12 +16253,12 @@ packages:
acorn: 7.4.1 acorn: 7.4.1
acorn-walk: 7.2.0 acorn-walk: 7.2.0
/acorn-import-assertions@1.9.0(acorn@8.12.1): /acorn-import-assertions@1.9.0(acorn@8.11.3):
resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==}
peerDependencies: peerDependencies:
acorn: ^8 acorn: ^8
dependencies: dependencies:
acorn: 8.12.1 acorn: 8.11.3
dev: false dev: false
/acorn-import-attributes@1.9.5(acorn@8.12.1): /acorn-import-attributes@1.9.5(acorn@8.12.1):
@ -16269,12 +16268,12 @@ packages:
dependencies: dependencies:
acorn: 8.12.1 acorn: 8.12.1
/acorn-jsx@5.3.2(acorn@8.12.1): /acorn-jsx@5.3.2(acorn@8.11.3):
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies: peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies: dependencies:
acorn: 8.12.1 acorn: 8.11.3
/acorn-walk@7.2.0: /acorn-walk@7.2.0:
resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==}
@ -16334,7 +16333,6 @@ packages:
/agent-base@6.0.2: /agent-base@6.0.2:
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
engines: {node: '>= 6.0.0'} engines: {node: '>= 6.0.0'}
requiresBuild: true
dependencies: dependencies:
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@5.5.0)
transitivePeerDependencies: transitivePeerDependencies:
@ -16752,7 +16750,6 @@ packages:
/aproba@2.0.0: /aproba@2.0.0:
resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==}
requiresBuild: true
/arch@2.2.0: /arch@2.2.0:
resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==}
@ -16810,7 +16807,6 @@ packages:
/are-we-there-yet@2.0.0: /are-we-there-yet@2.0.0:
resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==}
engines: {node: '>=10'} engines: {node: '>=10'}
requiresBuild: true
dependencies: dependencies:
delegates: 1.0.0 delegates: 1.0.0
readable-stream: 3.6.2 readable-stream: 3.6.2
@ -18152,7 +18148,7 @@ packages:
engines: {node: '>= 8.10.0'} engines: {node: '>= 8.10.0'}
dependencies: dependencies:
anymatch: 3.1.3 anymatch: 3.1.3
braces: 3.0.3 braces: 3.0.2
glob-parent: 5.1.2 glob-parent: 5.1.2
is-binary-path: 2.1.0 is-binary-path: 2.1.0
is-glob: 4.0.3 is-glob: 4.0.3
@ -18164,7 +18160,6 @@ packages:
/chownr@2.0.0: /chownr@2.0.0:
resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
engines: {node: '>=10'} engines: {node: '>=10'}
requiresBuild: true
/chrome-trace-event@1.0.4: /chrome-trace-event@1.0.4:
resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
@ -18412,7 +18407,6 @@ packages:
/color-support@1.1.3: /color-support@1.1.3:
resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==}
hasBin: true hasBin: true
requiresBuild: true
/color@3.2.1: /color@3.2.1:
resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==}
@ -18661,7 +18655,6 @@ packages:
/console-control-strings@1.1.0: /console-control-strings@1.1.0:
resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==}
requiresBuild: true
/consolidate@0.16.0(ejs@3.1.10)(react-dom@18.3.1)(react@18.3.1): /consolidate@0.16.0(ejs@3.1.10)(react-dom@18.3.1)(react@18.3.1):
resolution: {integrity: sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ==} resolution: {integrity: sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ==}
@ -20012,7 +20005,6 @@ packages:
/delegates@1.0.0: /delegates@1.0.0:
resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
requiresBuild: true
/denque@2.1.0: /denque@2.1.0:
resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
@ -20061,7 +20053,6 @@ packages:
/detect-libc@2.0.3: /detect-libc@2.0.3:
resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
engines: {node: '>=8'} engines: {node: '>=8'}
requiresBuild: true
/detect-newline@4.0.1: /detect-newline@4.0.1:
resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==}
@ -21234,8 +21225,8 @@ packages:
resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies: dependencies:
acorn: 8.12.1 acorn: 8.11.3
acorn-jsx: 5.3.2(acorn@8.12.1) acorn-jsx: 5.3.2(acorn@8.11.3)
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
/esprima@2.7.3: /esprima@2.7.3:
@ -22192,7 +22183,6 @@ packages:
/fs-minipass@2.1.0: /fs-minipass@2.1.0:
resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
requiresBuild: true
dependencies: dependencies:
minipass: 3.3.6 minipass: 3.3.6
@ -22253,7 +22243,6 @@ packages:
/gauge@3.0.2: /gauge@3.0.2:
resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==}
engines: {node: '>=10'} engines: {node: '>=10'}
requiresBuild: true
dependencies: dependencies:
aproba: 2.0.0 aproba: 2.0.0
color-support: 1.1.3 color-support: 1.1.3
@ -22542,7 +22531,6 @@ packages:
/glob@5.0.15: /glob@5.0.15:
resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==}
deprecated: Glob versions prior to v9 are no longer supported
dependencies: dependencies:
inflight: 1.0.6 inflight: 1.0.6
inherits: 2.0.4 inherits: 2.0.4
@ -22565,7 +22553,6 @@ packages:
/glob@7.1.7: /glob@7.1.7:
resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==}
deprecated: Glob versions prior to v9 are no longer supported
dependencies: dependencies:
fs.realpath: 1.0.0 fs.realpath: 1.0.0
inflight: 1.0.6 inflight: 1.0.6
@ -22577,7 +22564,6 @@ packages:
/glob@7.2.0: /glob@7.2.0:
resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==}
deprecated: Glob versions prior to v9 are no longer supported
dependencies: dependencies:
fs.realpath: 1.0.0 fs.realpath: 1.0.0
inflight: 1.0.6 inflight: 1.0.6
@ -22768,14 +22754,14 @@ packages:
resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==}
engines: {node: '>=6'} engines: {node: '>=6'}
/hardhat-gas-reporter@1.0.10(hardhat@2.22.6): /hardhat-gas-reporter@1.0.10(hardhat@2.22.7):
resolution: {integrity: sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==} resolution: {integrity: sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==}
peerDependencies: peerDependencies:
hardhat: ^2.0.2 hardhat: ^2.0.2
dependencies: dependencies:
array-uniq: 1.0.3 array-uniq: 1.0.3
eth-gas-reporter: 0.2.27 eth-gas-reporter: 0.2.27
hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4)
sha1: 1.1.1 sha1: 1.1.1
transitivePeerDependencies: transitivePeerDependencies:
- '@codechecks/client' - '@codechecks/client'
@ -22784,8 +22770,8 @@ packages:
- utf-8-validate - utf-8-validate
dev: false dev: false
/hardhat@2.22.6(ts-node@9.1.1)(typescript@5.5.4): /hardhat@2.22.7(ts-node@9.1.1)(typescript@5.5.4):
resolution: {integrity: sha512-abFEnd9QACwEtSvZZGSmzvw7N3zhQN1cDKz5SLHAupfG24qTHofCjqvD5kT5Wwsq5XOL0ON1Mq5rr4v0XX5ciw==} resolution: {integrity: sha512-nrXQAl+qUr75TsCLDo8P41YXLc+5U7qQMMCIrbbmy1/uQaVPncdjDrD5BR0CENvHRj7EBqO+JkofpozXoIfJKg==}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
ts-node: '*' ts-node: '*'
@ -22798,7 +22784,7 @@ packages:
dependencies: dependencies:
'@ethersproject/abi': 5.7.0 '@ethersproject/abi': 5.7.0
'@metamask/eth-sig-util': 4.0.1 '@metamask/eth-sig-util': 4.0.1
'@nomicfoundation/edr': 0.4.2 '@nomicfoundation/edr': 0.5.0
'@nomicfoundation/ethereumjs-common': 4.0.4 '@nomicfoundation/ethereumjs-common': 4.0.4
'@nomicfoundation/ethereumjs-tx': 5.0.4 '@nomicfoundation/ethereumjs-tx': 5.0.4
'@nomicfoundation/ethereumjs-util': 9.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4
@ -22894,7 +22880,6 @@ packages:
/has-unicode@2.0.1: /has-unicode@2.0.1:
resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==}
requiresBuild: true
/has-yarn@2.1.0: /has-yarn@2.1.0:
resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==}
@ -23175,7 +23160,6 @@ packages:
/https-proxy-agent@5.0.1: /https-proxy-agent@5.0.1:
resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
engines: {node: '>= 6'} engines: {node: '>= 6'}
requiresBuild: true
dependencies: dependencies:
agent-base: 6.0.2 agent-base: 6.0.2
debug: 4.3.5(supports-color@5.5.0) debug: 4.3.5(supports-color@5.5.0)
@ -23253,7 +23237,7 @@ packages:
/i18next@23.11.5: /i18next@23.11.5:
resolution: {integrity: sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==} resolution: {integrity: sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==}
dependencies: dependencies:
'@babel/runtime': 7.25.0 '@babel/runtime': 7.24.7
/iconv-lite@0.4.24: /iconv-lite@0.4.24:
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
@ -23330,8 +23314,8 @@ packages:
/import-in-the-middle@1.7.1: /import-in-the-middle@1.7.1:
resolution: {integrity: sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==} resolution: {integrity: sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==}
dependencies: dependencies:
acorn: 8.12.1 acorn: 8.11.3
acorn-import-assertions: 1.9.0(acorn@8.12.1) acorn-import-assertions: 1.9.0(acorn@8.11.3)
cjs-module-lexer: 1.2.3 cjs-module-lexer: 1.2.3
module-details-from-path: 1.0.3 module-details-from-path: 1.0.3
dev: false dev: false
@ -25273,7 +25257,6 @@ packages:
/make-dir@3.1.0: /make-dir@3.1.0:
resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
engines: {node: '>=8'} engines: {node: '>=8'}
requiresBuild: true
dependencies: dependencies:
semver: 6.3.1 semver: 6.3.1
@ -25768,7 +25751,6 @@ packages:
/minipass@3.3.6: /minipass@3.3.6:
resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
engines: {node: '>=8'} engines: {node: '>=8'}
requiresBuild: true
dependencies: dependencies:
yallist: 4.0.0 yallist: 4.0.0
@ -25780,7 +25762,6 @@ packages:
/minipass@5.0.0: /minipass@5.0.0:
resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
engines: {node: '>=8'} engines: {node: '>=8'}
requiresBuild: true
/minipass@7.0.4: /minipass@7.0.4:
resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==}
@ -25794,7 +25775,6 @@ packages:
/minizlib@2.1.2: /minizlib@2.1.2:
resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
requiresBuild: true
dependencies: dependencies:
minipass: 3.3.6 minipass: 3.3.6
yallist: 4.0.0 yallist: 4.0.0
@ -25822,12 +25802,11 @@ packages:
resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
engines: {node: '>=10'} engines: {node: '>=10'}
hasBin: true hasBin: true
requiresBuild: true
/mlly@1.6.1: /mlly@1.6.1:
resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==}
dependencies: dependencies:
acorn: 8.12.1 acorn: 8.11.3
pathe: 1.1.2 pathe: 1.1.2
pkg-types: 1.0.3 pkg-types: 1.0.3
ufo: 1.4.0 ufo: 1.4.0
@ -26356,7 +26335,6 @@ packages:
resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==}
engines: {node: '>=6'} engines: {node: '>=6'}
hasBin: true hasBin: true
requiresBuild: true
dependencies: dependencies:
abbrev: 1.1.1 abbrev: 1.1.1
@ -26434,7 +26412,6 @@ packages:
/npmlog@5.0.1: /npmlog@5.0.1:
resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==}
requiresBuild: true
dependencies: dependencies:
are-we-there-yet: 2.0.0 are-we-there-yet: 2.0.0
console-control-strings: 1.1.0 console-control-strings: 1.1.0
@ -28739,6 +28716,19 @@ packages:
react-dom: 18.3.1(react@18.3.1) react-dom: 18.3.1(react@18.3.1)
dev: false dev: false
/rc-motion@2.9.1(react-dom@18.3.1)(react@18.3.1):
resolution: {integrity: sha512-QD4bUqByjVQs7PhUT1d4bNxvtTcK9ETwtg7psbDfo6TmYalH/1hhjj4r2hbhW7g5OOEqYHhfwfj4noIvuOVRtQ==}
peerDependencies:
react: '>=16.9.0'
react-dom: '>=16.9.0'
dependencies:
'@babel/runtime': 7.24.7
classnames: 2.5.1
rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
dev: true
/rc-motion@2.9.2(react-dom@18.3.1)(react@18.3.1): /rc-motion@2.9.2(react-dom@18.3.1)(react@18.3.1):
resolution: {integrity: sha512-fUAhHKLDdkAXIDLH0GYwof3raS58dtNUmzLF2MeiR8o6n4thNpSDQhOqQzWE4WfFZDCi9VEN8n7tiB7czREcyw==} resolution: {integrity: sha512-fUAhHKLDdkAXIDLH0GYwof3raS58dtNUmzLF2MeiR8o6n4thNpSDQhOqQzWE4WfFZDCi9VEN8n7tiB7czREcyw==}
peerDependencies: peerDependencies:
@ -28946,9 +28936,9 @@ packages:
react-dom: '*' react-dom: '*'
dependencies: dependencies:
'@babel/runtime': 7.24.7 '@babel/runtime': 7.24.7
'@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) '@rc-component/trigger': 2.1.1(react-dom@18.3.1)(react@18.3.1)
classnames: 2.5.1 classnames: 2.5.1
rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) rc-motion: 2.9.1(react-dom@18.3.1)(react@18.3.1)
rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1)
rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1)
rc-virtual-list: 3.11.4(react-dom@18.3.1)(react@18.3.1) rc-virtual-list: 3.11.4(react-dom@18.3.1)(react@18.3.1)
@ -29170,7 +29160,7 @@ packages:
dependencies: dependencies:
'@babel/runtime': 7.24.7 '@babel/runtime': 7.24.7
classnames: 2.5.1 classnames: 2.5.1
rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) rc-motion: 2.9.1(react-dom@18.3.1)(react@18.3.1)
rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1)
rc-virtual-list: 3.14.2(react-dom@18.3.1)(react@18.3.1) rc-virtual-list: 3.14.2(react-dom@18.3.1)(react@18.3.1)
react: 18.3.1 react: 18.3.1
@ -30304,7 +30294,6 @@ packages:
/rimraf@3.0.2: /rimraf@3.0.2:
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
hasBin: true hasBin: true
requiresBuild: true
dependencies: dependencies:
glob: 7.2.3 glob: 7.2.3
@ -30647,7 +30636,6 @@ packages:
/semver@6.3.1: /semver@6.3.1:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true hasBin: true
requiresBuild: true
/semver@7.3.7: /semver@7.3.7:
resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==}
@ -30806,7 +30794,6 @@ packages:
wkx: 0.5.0 wkx: 0.5.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
dev: true
/serialize-javascript@6.0.2: /serialize-javascript@6.0.2:
resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
@ -30984,7 +30971,6 @@ packages:
/signal-exit@3.0.7: /signal-exit@3.0.7:
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
requiresBuild: true
/signal-exit@4.1.0: /signal-exit@4.1.0:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
@ -31141,7 +31127,7 @@ packages:
- debug - debug
dev: false dev: false
/solidity-coverage@0.8.12(hardhat@2.22.6): /solidity-coverage@0.8.12(hardhat@2.22.7):
resolution: {integrity: sha512-8cOB1PtjnjFRqOgwFiD8DaUsYJtVJ6+YdXQtSZDrLGf8cdhhh8xzTtGzVTGeBf15kTv0v7lYPJlV/az7zLEPJw==} resolution: {integrity: sha512-8cOB1PtjnjFRqOgwFiD8DaUsYJtVJ6+YdXQtSZDrLGf8cdhhh8xzTtGzVTGeBf15kTv0v7lYPJlV/az7zLEPJw==}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@ -31156,7 +31142,7 @@ packages:
ghost-testrpc: 0.0.2 ghost-testrpc: 0.0.2
global-modules: 2.0.0 global-modules: 2.0.0
globby: 10.0.2 globby: 10.0.2
hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4)
jsonschema: 1.4.1 jsonschema: 1.4.1
lodash: 4.17.21 lodash: 4.17.21
mocha: 10.7.0 mocha: 10.7.0
@ -32165,7 +32151,6 @@ packages:
/tar@6.2.1: /tar@6.2.1:
resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
engines: {node: '>=10'} engines: {node: '>=10'}
requiresBuild: true
dependencies: dependencies:
chownr: 2.0.0 chownr: 2.0.0
fs-minipass: 2.1.0 fs-minipass: 2.1.0
@ -32544,7 +32529,7 @@ packages:
'@tsconfig/node14': 1.0.3 '@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.4 '@tsconfig/node16': 1.0.4
'@types/node': 20.14.2 '@types/node': 20.14.2
acorn: 8.12.1 acorn: 8.11.3
acorn-walk: 8.3.2 acorn-walk: 8.3.2
arg: 4.1.3 arg: 4.1.3
create-require: 1.1.1 create-require: 1.1.1
@ -34401,7 +34386,6 @@ packages:
/wide-align@1.1.5: /wide-align@1.1.5:
resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==}
requiresBuild: true
dependencies: dependencies:
string-width: 4.2.3 string-width: 4.2.3