feat: official-account (#1348)

Reviewed-on: daoyoucloud/tachybase#1348
Reviewed-by: sealday <zhanglin@daoyoucloud.com>
Co-authored-by: ALIANG <2650321653@qq.com>
Co-committed-by: ALIANG <2650321653@qq.com>
This commit is contained in:
ALIANG 2024-07-18 18:29:19 +08:00 committed by sealday
parent 297414187c
commit bb82ade8cf
15 changed files with 370 additions and 83 deletions

View File

@ -183,7 +183,7 @@ export function parseRequest(request: ParseRequest, options: ParseOptions = {}):
}
if (params.resourceName) {
const [resourceName, actionName] = params.resourceName.split(':');
const [resourceName, actionName] = params.resourceName.split(/:|@/);
if (actionName) {
params.resourceName = resourceName;
params.actionName = actionName;

View File

@ -57,6 +57,7 @@ export function registerMiddlewares(app: Application, options: ApplicationOption
const bodyLimit = '10mb';
app.use(
bodyParser({
enableTypes: ['json', 'form', 'xml'],
jsonLimit: bodyLimit,
formLimit: bodyLimit,
textLimit: bodyLimit,

View File

@ -0,0 +1,2 @@
/node_modules
/src

View File

@ -0,0 +1 @@
# @samples/plugin-replace-page

View File

@ -0,0 +1,2 @@
export * from './dist/client';
export { default } from './dist/client';

View File

@ -0,0 +1 @@
module.exports = require('./dist/client/index.js');

View File

@ -0,0 +1,19 @@
{
"name": "@tachybase/plugin-wechat-official-account",
"version": "0.21.73",
"main": "dist/server/index.js",
"dependencies": {
"@types/xml2js": "^0.4.14",
"antd": "^5.18.3",
"body-parser": "^1.20.2",
"koa-bodyparser": "^4.3.0",
"react-router-dom": "^6.11.2",
"xml2js": "^0.6.2"
},
"peerDependencies": {
"@tachybase/client": "workspace:*",
"@tachybase/plugin-auth": "workspace:*",
"@tachybase/server": "workspace:*",
"@tachybase/test": "workspace:*"
}
}

View File

@ -0,0 +1,2 @@
export * from './dist/server';
export { default } from './dist/server';

View File

@ -0,0 +1 @@
module.exports = require('./dist/server/index.js');

View File

@ -0,0 +1,17 @@
import React from 'react';
import { Plugin, useRequest } from '@tachybase/client';
import { CustomAuthLayout } from './AuthLayout';
export class PluginReplacePageClient extends Plugin {
async afterAdd() {
// await this.app.pm.add()
}
async beforeLoad() {}
// You can get and modify the app instance here
async load() {}
}
export default PluginReplacePageClient;

View File

@ -0,0 +1,2 @@
export * from './server';
export { default } from './server';

View File

@ -0,0 +1 @@
export { default } from './plugin';

View File

@ -0,0 +1,216 @@
import crypto from 'crypto';
import { Plugin } from '@tachybase/server';
import axios from 'axios';
import xml2js from 'xml2js';
export class PluginReplacePageServer extends Plugin {
// 从数据库查询cofig表
async config(): Promise<any> {
const repo = this.app.db.getRepository('config');
const config = (await repo.findById(1)) as any;
return config.get(); // get()返回具体的data
}
// 从数据库查询message表
async message(): Promise<any[]> {
const repo = this.app.db.getRepository('message');
const messages = (await repo.find()) as any;
return messages; // 返回数组Type
}
// 验证Wechat平台的请求签名
async checkSignature(query) {
const { signature, timestamp, nonce } = query;
const hash = crypto.createHash('sha1');
const { token } = await this.config(); // 获取配置的token完成Wechat签名认证
const str = [token, timestamp, nonce].sort().join('');
hash.update(str);
const result = hash.digest('hex') === signature;
return result;
}
// 获取Wechat-Token
async getAccessToken() {
const { appid, appsecret } = await this.config(); // 使用config方法 查询config表
const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${appsecret}`;
try {
const response = await axios.get(url);
return response.data.access_token;
} catch (error) {
console.error('Error getting access token:', error);
return null;
}
}
// 创建菜单
async createCustomMenu() {
const accessToken = await this.getAccessToken(); // 获取Wechat Token
if (!accessToken) {
console.error('Failed to get access token');
return;
}
const url = `https://api.weixin.qq.com/cgi-bin/menu/create?access_token=${accessToken}`;
const menu = {
button: [
{
type: 'view',
name: '音乐',
url: 'https://music.163.com/', // 确保这个 URL 不超过 256 个字符
},
{
type: 'view',
name: '官网',
url: 'https://daoyoucloud.com/',
},
{
name: '服务',
sub_button: [
{
type: 'view',
name: '正在开发中...',
url: 'https://daoyoucloud.com/coming-soon',
},
{
type: 'view',
name: '开发者管理',
url: 'https://lu.dev.daoyoucloud.com/',
},
],
},
],
};
// 若通过accessToken验证则发送Wechat请求创建菜单
try {
const response = await axios.post(url, menu);
console.log('Create menu response:', response.data);
} catch (error) {
console.error('Error creating menu:', error);
}
}
// Wechat从用户这里获取签名 若通过则允许后续交互
async get(ctx) {
const { query } = ctx.request;
if (await this.checkSignature(query)) {
ctx.body = query.echostr;
} else {
ctx.status = 403;
}
}
// 微信向服务发送post请求
async post(ctx) {
const { query, body } = ctx.request;
// Wechat从用户这里获取签名
if (!(await this.checkSignature(query))) {
ctx.status = 403;
ctx.body = 'Forbidden';
return;
}
const messages = await this.message(); // 调用当前对象的 message方法
// const keywordsList = keywords.map(keyword => keyword.keywords).join(`${keywords}`);
const messagesList = messages.map((message, index) => `${index + 1}${message.key}`).join('\n');
let replyContent = `您好,欢迎关注道有云网络科技有限公司!您可以输入下面关键字来获取您要了解的信息!\n(输入序号即可)\n${messagesList}`; // 默认回复内容
// 解析 POST 请求的 XML 格式消息体
xml2js.parseString(body, { explicitArray: false }, (err, result) => {
if (err) {
console.error('Error parsing XML:', err);
ctx.status = 500;
ctx.body = 'Server Error';
return;
}
const msg = result.xml;
let replyMessage; // 处理用户输入后的回复结果
if (msg.MsgType === 'text') {
// 处理文本信息
// 匹配用户输入的关键字和message表里的messages字段是否一致一致则 filter()出一个数组
const values = messages.filter((message) => msg.Content.includes(message.id));
if (values?.length > 0) {
// 问号? 异常处理
replyContent = values[0].value;
}
replyMessage = `
<xml>
<ToUserName><![CDATA[${msg.FromUserName}]]></ToUserName>
<FromUserName><![CDATA[${msg.ToUserName}]]></FromUserName>
<CreateTime>${Math.floor(Date.now() / 1000)}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[${replyContent}]]></Content>
</xml>
`;
} else if (msg.MsgType === 'image') {
// 处理图像信息
replyMessage = `
<xml>
<ToUserName><![CDATA[${msg.FromUserName}]]></ToUserName>
<FromUserName><![CDATA[${msg.ToUserName}]]></FromUserName>
<CreateTime>${Math.floor(Date.now() / 1000)}</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[${msg.MediaId}]]></MediaId>
</Image>
</xml>
`;
} else {
// 处理非文本和非图像信息
replyMessage = `
<xml>
<ToUserName><![CDATA[${msg.FromUserName}]]></ToUserName>
<FromUserName><![CDATA[${msg.ToUserName}]]></FromUserName>
<CreateTime>${Math.floor(Date.now() / 1000)}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[]]></Content>
</xml>
`;
}
ctx.type = 'application/xml';
ctx.body = replyMessage;
});
}
// 加载
async load() {
// load() 生命周期函数,在插件加载时执行
// 定义资源动作
this.app.resourcer.define({
name: 'wechat',
actions: {
test: async (ctx) => {
ctx.withoutDataWrapping = true;
ctx.body = 'Hello World!';
console.log('Hello World!');
},
createMenu: async (ctx) => {
await this.createCustomMenu();
console.log('Custom menu created successfully.');
ctx.body = 'success';
},
handler: async (ctx) => {
ctx.withoutDataWrapping = true;
if (ctx.request.method.toLowerCase() === 'get') {
//toLowerCase()转换字符串为小写
await this.get(ctx);
} else {
await this.post(ctx);
}
},
},
});
this.app.acl.allow('wechat', '*', 'public'); // 实体名称,允许所有资源,公共级别访问
}
}
export default PluginReplacePageServer;

View File

@ -3948,6 +3948,39 @@ importers:
specifier: ^4.0.525
version: 4.0.759
packages/plugins/@tachybase/plugin-wechat-official-account:
dependencies:
'@tachybase/client':
specifier: workspace:*
version: link:../../../core/client
'@tachybase/plugin-auth':
specifier: workspace:*
version: link:../plugin-auth
'@tachybase/server':
specifier: workspace:*
version: link:../../../core/server
'@tachybase/test':
specifier: workspace:*
version: link:../../../core/test
'@types/xml2js':
specifier: ^0.4.14
version: 0.4.14
antd:
specifier: 5.19.1
version: 5.19.1(react-dom@18.3.1)(react@18.3.1)
body-parser:
specifier: ^1.20.2
version: 1.20.2
koa-bodyparser:
specifier: ^4.3.0
version: 4.4.1
react-router-dom:
specifier: ^6.11.2
version: 6.25.1(react-dom@18.3.1)(react@18.3.1)
xml2js:
specifier: ^0.6.2
version: 0.6.2
packages/plugins/@tachybase/plugin-workflow:
dependencies:
'@tachybase/actions':
@ -5008,7 +5041,7 @@ packages:
'@emotion/unitless': 0.7.5
classnames: 2.5.1
csstype: 3.1.3
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
stylis: 4.3.2
@ -10331,7 +10364,7 @@ packages:
async: 3.2.5
chalk: 3.0.0
dayjs: 1.11.10
debug: 4.3.4
debug: 4.3.5(supports-color@5.5.0)
eventemitter2: 5.0.1
fast-json-patch: 3.1.1
fclone: 1.0.11
@ -10354,7 +10387,7 @@ packages:
'@opencensus/core': 0.0.9
'@opencensus/propagation-b3': 0.0.8
async: 2.6.4
debug: 4.3.4
debug: 4.3.5(supports-color@5.5.0)
eventemitter2: 6.4.9
require-in-the-middle: 5.2.0
semver: 7.5.4
@ -10385,9 +10418,9 @@ packages:
engines: {node: '>=4.0'}
dependencies:
async: 2.6.4
debug: 4.3.4
debug: 4.3.5(supports-color@5.5.0)
eventemitter2: 6.4.9
extrareqp2: 1.0.0(debug@4.3.4)
extrareqp2: 1.0.0(debug@4.3.5)
ws: 7.5.9
transitivePeerDependencies:
- bufferutil
@ -10801,7 +10834,7 @@ packages:
'@babel/runtime': 7.24.7
'@ctrl/tinycolor': 3.6.1
classnames: 2.5.1
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -10831,7 +10864,7 @@ packages:
dependencies:
'@babel/runtime': 7.24.7
classnames: 2.5.1
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -10857,7 +10890,7 @@ packages:
dependencies:
'@babel/runtime': 7.24.7
classnames: 2.5.1
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -10872,7 +10905,7 @@ packages:
'@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1)
'@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1)
classnames: 2.5.1
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -12693,7 +12726,6 @@ packages:
resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==}
dependencies:
'@types/node': 20.14.2
dev: true
/@types/yargs-parser@21.0.3:
resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
@ -15572,7 +15604,7 @@ packages:
dev: false
/call-bind@1.0.7:
resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==, tarball: https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz}
engines: {node: '>= 0.4'}
dependencies:
es-define-property: 1.0.0
@ -15991,10 +16023,10 @@ packages:
engines: {node: '>=0.10.0'}
/co-body@6.1.0:
resolution: {integrity: sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==}
resolution: {integrity: sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==, tarball: https://registry.npmmirror.com/co-body/-/co-body-6.1.0.tgz}
dependencies:
inflation: 2.1.0
qs: 6.12.1
qs: 6.12.3
raw-body: 2.5.2
type-is: 1.6.18
@ -16357,7 +16389,7 @@ packages:
toggle-selection: 1.0.6
/copy-to@2.0.1:
resolution: {integrity: sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==}
resolution: {integrity: sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==, tarball: https://registry.npmmirror.com/copy-to/-/copy-to-2.0.1.tgz}
/core-js-compat@3.34.0:
resolution: {integrity: sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==}
@ -17351,7 +17383,7 @@ packages:
dev: false
/define-data-property@1.1.4:
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, tarball: https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz}
engines: {node: '>= 0.4'}
dependencies:
es-define-property: 1.0.0
@ -17879,7 +17911,7 @@ packages:
is-string: 1.0.7
is-typed-array: 1.1.12
is-weakref: 1.0.2
object-inspect: 1.13.1
object-inspect: 1.13.2
object-keys: 1.1.1
object.assign: 4.1.5
regexp.prototype.flags: 1.5.1
@ -17930,7 +17962,7 @@ packages:
is-string: 1.0.7
is-typed-array: 1.1.13
is-weakref: 1.0.2
object-inspect: 1.13.1
object-inspect: 1.13.2
object-keys: 1.1.1
object.assign: 4.1.5
regexp.prototype.flags: 1.5.2
@ -17947,13 +17979,13 @@ packages:
which-typed-array: 1.1.15
/es-define-property@1.0.0:
resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==, tarball: https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz}
engines: {node: '>= 0.4'}
dependencies:
get-intrinsic: 1.2.4
/es-errors@1.3.0:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, tarball: https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz}
engines: {node: '>= 0.4'}
/es-get-iterator@1.1.3:
@ -18822,10 +18854,10 @@ packages:
tmp: 0.0.33
dev: true
/extrareqp2@1.0.0(debug@4.3.4):
/extrareqp2@1.0.0(debug@4.3.5):
resolution: {integrity: sha512-Gum0g1QYb6wpPJCVypWP3bbIuaibcFiJcpuPM10YSXp/tzqi84x9PJageob+eN4xVRIOto4wjSGNLyMD54D2xA==}
dependencies:
follow-redirects: 1.15.6(debug@4.3.4)
follow-redirects: 1.15.6(debug@4.3.5)
transitivePeerDependencies:
- debug
dev: false
@ -19108,18 +19140,6 @@ packages:
debug:
optional: true
/follow-redirects@1.15.6(debug@4.3.4):
resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==}
engines: {node: '>=4.0'}
peerDependencies:
debug: '*'
peerDependenciesMeta:
debug:
optional: true
dependencies:
debug: 4.3.4
dev: false
/follow-redirects@1.15.6(debug@4.3.5):
resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==}
engines: {node: '>=4.0'}
@ -19252,7 +19272,7 @@ packages:
dezalgo: 1.0.4
hexoid: 1.0.0
once: 1.4.0
qs: 6.12.1
qs: 6.12.3
/formidable@3.5.1:
resolution: {integrity: sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==}
@ -19361,7 +19381,7 @@ packages:
dev: true
/function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, tarball: https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz}
/function.prototype.name@1.1.6:
resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
@ -19428,7 +19448,7 @@ packages:
resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
/get-intrinsic@1.2.4:
resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==, tarball: https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz}
engines: {node: '>= 0.4'}
dependencies:
es-errors: 1.3.0
@ -19725,7 +19745,7 @@ packages:
resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==}
/gopd@1.0.1:
resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, tarball: https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz}
dependencies:
get-intrinsic: 1.2.4
@ -19822,16 +19842,16 @@ packages:
engines: {node: '>=8'}
/has-property-descriptors@1.0.2:
resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, tarball: https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz}
dependencies:
es-define-property: 1.0.0
/has-proto@1.0.3:
resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==, tarball: https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz}
engines: {node: '>= 0.4'}
/has-symbols@1.0.3:
resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, tarball: https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz}
engines: {node: '>= 0.4'}
/has-tostringtag@1.0.0:
@ -19887,7 +19907,7 @@ packages:
dev: false
/hasown@2.0.2:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, tarball: https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz}
engines: {node: '>= 0.4'}
dependencies:
function-bind: 1.1.2
@ -20288,7 +20308,7 @@ packages:
optional: true
/inflation@2.1.0:
resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==}
resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==, tarball: https://registry.npmmirror.com/inflation/-/inflation-2.1.0.tgz}
engines: {node: '>= 0.8.0'}
/inflection@1.13.4:
@ -22142,7 +22162,7 @@ packages:
dev: true
/media-typer@0.3.0:
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, tarball: https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz}
engines: {node: '>= 0.6'}
/mem@8.1.1:
@ -22306,12 +22326,12 @@ packages:
brorand: 1.1.0
/mime-db@1.33.0:
resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==}
resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==, tarball: https://registry.npmmirror.com/mime-db/-/mime-db-1.33.0.tgz}
engines: {node: '>= 0.6'}
dev: false
/mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, tarball: https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz}
engines: {node: '>= 0.6'}
/mime-match@1.0.2:
@ -22321,14 +22341,14 @@ packages:
dev: true
/mime-types@2.1.18:
resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==}
resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==, tarball: https://registry.npmmirror.com/mime-types/-/mime-types-2.1.18.tgz}
engines: {node: '>= 0.6'}
dependencies:
mime-db: 1.33.0
dev: false
/mime-types@2.1.35:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, tarball: https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz}
engines: {node: '>= 0.6'}
dependencies:
mime-db: 1.52.0
@ -23079,13 +23099,14 @@ packages:
engines: {node: '>= 6'}
/object-inspect@1.12.3:
resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==, tarball: https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz}
/object-inspect@1.13.1:
resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==}
dev: false
/object-inspect@1.13.2:
resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==, tarball: https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.2.tgz}
engines: {node: '>= 0.4'}
/object-is@1.1.5:
@ -23927,7 +23948,7 @@ packages:
requiresBuild: true
dependencies:
async: 3.2.5
debug: 4.3.4
debug: 4.3.5(supports-color@5.5.0)
pidusage: 2.0.21
systeminformation: 5.22.8
tx2: 1.0.5
@ -24862,6 +24883,7 @@ packages:
engines: {node: '>=0.6'}
dependencies:
side-channel: 1.0.6
dev: false
/qs@6.12.3:
resolution: {integrity: sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==}
@ -25024,7 +25046,7 @@ packages:
classnames: 2.5.1
rc-select: 14.15.0(react-dom@18.3.1)(react@18.3.1)
rc-tree: 5.8.8(react-dom@18.3.1)(react@18.3.1)
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25036,7 +25058,7 @@ packages:
dependencies:
'@babel/runtime': 7.24.7
classnames: 2.5.1
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25049,7 +25071,7 @@ packages:
'@babel/runtime': 7.24.7
classnames: 2.5.1
rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1)
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25063,7 +25085,7 @@ packages:
'@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1)
classnames: 2.5.1
rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1)
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25077,7 +25099,7 @@ packages:
'@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1)
classnames: 2.5.1
rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1)
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25090,7 +25112,7 @@ packages:
'@babel/runtime': 7.24.7
'@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1)
classnames: 2.5.1
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25116,7 +25138,7 @@ packages:
dependencies:
'@babel/runtime': 7.24.7
'@rc-component/async-validator': 5.0.4
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25131,7 +25153,7 @@ packages:
classnames: 2.5.1
rc-dialog: 9.5.2(react-dom@18.3.1)(react@18.3.1)
rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1)
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25185,7 +25207,7 @@ packages:
dependencies:
'@babel/runtime': 7.24.7
classnames: 2.5.1
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25201,7 +25223,7 @@ packages:
rc-input: 1.5.1(react-dom@18.3.1)(react@18.3.1)
rc-menu: 9.14.1(react-dom@18.3.1)(react@18.3.1)
rc-textarea: 1.7.0(react-dom@18.3.1)(react@18.3.1)
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25268,7 +25290,7 @@ packages:
'@babel/runtime': 7.24.7
classnames: 2.5.1
rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1)
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25293,7 +25315,7 @@ packages:
dependencies:
'@babel/runtime': 7.24.7
classnames: 2.5.1
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25366,7 +25388,7 @@ packages:
dependencies:
'@babel/runtime': 7.24.7
classnames: 2.5.1
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25379,7 +25401,7 @@ packages:
dependencies:
'@babel/runtime': 7.24.7
classnames: 2.5.1
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25405,7 +25427,7 @@ packages:
'@babel/runtime': 7.24.7
classnames: 2.5.1
rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1)
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25489,7 +25511,7 @@ packages:
dependencies:
'@babel/runtime': 7.24.7
classnames: 2.5.1
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25502,7 +25524,7 @@ packages:
dependencies:
'@babel/runtime': 7.24.7
classnames: 2.5.1
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25514,7 +25536,7 @@ packages:
dependencies:
'@babel/runtime': 7.24.7
classnames: 2.5.1
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25529,7 +25551,7 @@ packages:
'@rc-component/context': 1.4.0(react-dom@18.3.1)(react@18.3.1)
classnames: 2.5.1
rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1)
rc-util: 5.38.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-virtual-list: 3.14.5(react-dom@18.3.1)(react@18.3.1)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
@ -25547,7 +25569,7 @@ packages:
rc-menu: 9.14.1(react-dom@18.3.1)(react@18.3.1)
rc-motion: 2.9.2(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.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25617,7 +25639,7 @@ packages:
classnames: 2.5.1
rc-select: 14.15.0(react-dom@18.3.1)(react@18.3.1)
rc-tree: 5.8.8(react-dom@18.3.1)(react@18.3.1)
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -25723,7 +25745,7 @@ packages:
dependencies:
'@babel/runtime': 7.24.7
classnames: 2.5.1
rc-util: 5.38.1(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-dom: 18.3.1(react@18.3.1)
@ -26952,7 +26974,7 @@ packages:
engines: {node: '>=10'}
/safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, tarball: https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz}
/sanitize-html@2.10.0:
resolution: {integrity: sha512-JqdovUd81dG4k87vZt6uA6YhDfWkUGruUu/aPmXLxXi45gZExnt9Bnw/qeQU8oGf82vPyaE0vO4aH0PbobB9JQ==}
@ -27219,7 +27241,7 @@ packages:
resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
/set-function-length@1.2.2:
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, tarball: https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz}
engines: {node: '>= 0.4'}
dependencies:
define-data-property: 1.1.4
@ -27254,7 +27276,7 @@ packages:
dev: true
/setprototypeof@1.2.0:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, tarball: https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz}
/sha.js@2.4.11:
resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==}
@ -27303,13 +27325,13 @@ packages:
dev: false
/side-channel@1.0.6:
resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==, tarball: https://registry.npmmirror.com/side-channel/-/side-channel-1.0.6.tgz}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.7
es-errors: 1.3.0
get-intrinsic: 1.2.4
object-inspect: 1.13.1
object-inspect: 1.13.2
/siginfo@2.0.0:
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
@ -28121,7 +28143,7 @@ packages:
formidable: 2.1.2
methods: 1.1.2
mime: 2.6.0
qs: 6.12.1
qs: 6.12.3
semver: 7.6.2
transitivePeerDependencies:
- supports-color
@ -28138,7 +28160,7 @@ packages:
formidable: 3.5.1
methods: 1.1.2
mime: 2.6.0
qs: 6.12.1
qs: 6.12.3
transitivePeerDependencies:
- supports-color
dev: true
@ -28590,7 +28612,7 @@ packages:
resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
/toidentifier@1.0.1:
resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, tarball: https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz}
engines: {node: '>=0.6'}
/toposort-class@1.0.1:
@ -28965,7 +28987,7 @@ packages:
dev: false
/type-is@1.6.18:
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, tarball: https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz}
engines: {node: '>= 0.6'}
dependencies:
media-typer: 0.3.0
@ -29464,7 +29486,7 @@ packages:
iconv-lite: 0.4.24
ip: 1.1.8
pump: 3.0.0
qs: 6.12.1
qs: 6.12.3
statuses: 1.5.0
utility: 1.18.0
transitivePeerDependencies: