From e61daaee2d0dec19710cd4ec759219a071f2435e Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sat, 27 Dec 2025 01:54:47 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E6=94=AF=E6=8C=81ucloud=EF=BC=8C?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=88=B0ussl=EF=BC=8C=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E5=88=B0ucdn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/pipeline/src/plugin/api.ts | 2 + packages/ui/certd-server/package.json | 1 + packages/ui/certd-server/src/plugins/index.ts | 3 +- .../src/plugins/plugin-ucloud/access.ts | 214 ++++++++++++++++++ .../src/plugins/plugin-ucloud/index.ts | 2 + .../plugins/plugin-ucloud/plugins/index.ts | 2 + .../plugins/plugin-deploy-to-cdn.ts | 189 ++++++++++++++++ .../plugins/plugin-upload-to-ussl.ts | 73 ++++++ pnpm-lock.yaml | 109 ++------- 9 files changed, 505 insertions(+), 90 deletions(-) create mode 100644 packages/ui/certd-server/src/plugins/plugin-ucloud/access.ts create mode 100644 packages/ui/certd-server/src/plugins/plugin-ucloud/index.ts create mode 100644 packages/ui/certd-server/src/plugins/plugin-ucloud/plugins/index.ts create mode 100644 packages/ui/certd-server/src/plugins/plugin-ucloud/plugins/plugin-deploy-to-cdn.ts create mode 100644 packages/ui/certd-server/src/plugins/plugin-ucloud/plugins/plugin-upload-to-ussl.ts diff --git a/packages/core/pipeline/src/plugin/api.ts b/packages/core/pipeline/src/plugin/api.ts index 8cb10d199..8c1e2415b 100644 --- a/packages/core/pipeline/src/plugin/api.ts +++ b/packages/core/pipeline/src/plugin/api.ts @@ -185,6 +185,8 @@ export abstract class AbstractTaskPlugin implements ITaskPlugin { if (res == null) { throw new Error("授权不存在,可能已被删除,请前往任务配置里面重新选择授权"); } + res.ctx.logger = this.logger; + res.ctx.http = this.http; // @ts-ignore if (this.logger?.addSecret) { // 隐藏加密信息,不在日志中输出 diff --git a/packages/ui/certd-server/package.json b/packages/ui/certd-server/package.json index dc7dbac6f..68c08fb62 100644 --- a/packages/ui/certd-server/package.json +++ b/packages/ui/certd-server/package.json @@ -75,6 +75,7 @@ "@midwayjs/upload": "3.20.13", "@midwayjs/validate": "3.20.13", "@peculiar/x509": "^1.11.0", + "@ucloud-sdks/ucloud-sdk-js": "^0.2.4", "@volcengine/openapi": "^1.28.1", "ali-oss": "^6.21.0", "axios": "^1.7.2", diff --git a/packages/ui/certd-server/src/plugins/index.ts b/packages/ui/certd-server/src/plugins/index.ts index f3f1ea1c6..4fdadb6b1 100644 --- a/packages/ui/certd-server/src/plugins/index.ts +++ b/packages/ui/certd-server/src/plugins/index.ts @@ -40,4 +40,5 @@ export * from './plugin-xinnet/index.js' export * from './plugin-xinnetconnet/index.js' export * from './plugin-oauth/index.js' export * from './plugin-cmcc/index.js' -export * from './plugin-template/index.js' \ No newline at end of file +export * from './plugin-template/index.js' +export * from './plugin-ucloud/index.js' \ No newline at end of file diff --git a/packages/ui/certd-server/src/plugins/plugin-ucloud/access.ts b/packages/ui/certd-server/src/plugins/plugin-ucloud/access.ts new file mode 100644 index 000000000..5736b5025 --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-ucloud/access.ts @@ -0,0 +1,214 @@ +import { IsAccess, AccessInput, BaseAccess } from '@certd/pipeline'; +import { CertInfo, CertReader } from '@certd/plugin-cert'; + +/** + * 这个注解将注册一个授权配置 + * 在certd的后台管理系统中,用户可以选择添加此类型的授权 + */ +@IsAccess({ + name: 'ucloud', + title: 'UCloud授权', + icon: 'lsicon:badge-new-filled', + desc: '优刻得授权', +}) +export class UCloudAccess extends BaseAccess { + + /** + * 授权属性配置 + */ + @AccessInput({ + title: '项目Id', + component: { + placeholder: '项目Id', + }, + helper: "[项目管理](https://console.ucloud.cn/uaccount/iam/project_manage)项目ID列获取", + required: true, + encrypt: false, + }) + projectId = ''; + + + /** + * 授权属性配置 + */ + @AccessInput({ + title: '公钥', + component: { + placeholder: '公钥', + }, + helper: "[Api管理](https://console.ucloud.cn/uaccount/api_manage)获取", + required: true, + encrypt: false, + }) + publicKey = ''; + + @AccessInput({ + title: '私钥', + component: { + name: "a-input-password", + vModel: "value", + placeholder: '私钥', + }, + required: true, + encrypt: true, + }) + privateKey = ''; + + + + @AccessInput({ + title: "测试", + component: { + name: "api-test", + action: "TestRequest" + }, + helper: "点击测试接口是否正常" + }) + testRequest = true; + + client: any; + + async onTestRequest() { + await this.ProjectList(); + return "ok"; + } + + + async getClient() { + if (this.client) { + return this.client; + } + const { Client } = await import('@ucloud-sdks/ucloud-sdk-js'); + const client = new Client({ + config: { + region: 'cn-bj2', + projectId: this.projectId || "", + baseUrl: "https://api.ucloud.cn" + }, + credential: { + publicKey: this.publicKey, + privateKey: this.privateKey, + } + }); + this.client = client; + return client + } + + async ProjectList() { + const client = await this.getClient(); + const resp = await client.uaccount().getProjectList({ + "Action": "GetProjectList" + }); + this.ctx.logger.info(`获取到项目列表:${JSON.stringify(resp)}`); + return resp; + } + + async GetRegion() { + const client = await this.getClient(); + const res = await client.uaccount().getRegion({ + "Action": "GetRegion" + }); + this.ctx.logger.info(`获取到区域列表:${JSON.stringify(res)}`); + return res; + } + + async CdnDominList(req: { PageNo: number, PageSize: number }) { + const client = await this.getClient(); + const resp = await client.ucdn().getUcdnDomainInfoList({ + "Action": "GetUcdnDomainInfoList", + "ProjectId": this.projectId || "", + "PageNo": req.PageNo, + "PageSize": req.PageSize, + }); + this.ctx.logger.info(`获取到CDN域名列表:${JSON.stringify(resp)}`); + return resp; + } + + async CdnAddCert(req: { certName: string, cert: CertInfo }) { + const client = await this.getClient(); + const resp = await client.ucdn().addCertificate({ + "Action": "AddCertificate", + "ProjectId": this.projectId || "", + "CertName": req.certName, + "UserCert": req.cert.crt, + "PrivateKey": req.cert.key + }); + this.ctx.logger.info(`添加CDN证书:${JSON.stringify(resp)}`); + return resp; + } + + + async SslUploadCert(req: { cert: CertInfo }) { + const { cert } = req + /** +&SslPublicKey=lXUzWbSR +&SslCaKey=lXUzWbSR +&SslMD5=lXUzWbSR +&CertificateName=GoodCertcification + */ + const certReader = new CertReader(cert) + const certName = certReader.buildCertName() + const crtBase64 = this.ctx.utils.hash.base64(cert.crt) + const keyBase64 = this.ctx.utils.hash.base64(cert.key) + const allDomains = certReader.getAllDomains().join(",") + + this.ctx.logger.info(`----------- 上传USSL证书,certName:${certName},domains:${allDomains}`); + try { + const resp = await this.invoke({ + Action: "UploadNormalCertificate", + "SslPublicKey": crtBase64, + "SslPrivateKey": keyBase64, + "CertificateName": certName, + "SslMD5": this.ctx.utils.hash.md5(crtBase64 + keyBase64) + }); + this.ctx.logger.info(`----------- 上传USSL证书成功,certId:${resp.CertificateID}`); + return { type: "ussl", id: resp.CertificateID, name: certName, resourceId: resp.LongResourceID,domains:allDomains } + } catch (err) { + + if(err.message.includes("重复上传证书")){ + //查找证书 + const certList = await this.SslGetCertList(certReader.getMainDomain()); + + const cert = certList.find((item: any) => item.Domains === allDomains) + if(cert){ + this.ctx.logger.info(`----------- 找到已存在证书,certId:${cert.CertificateID}`); + return { type: "ussl", id: cert.CertificateID, name: certName, domains: cert.Domains } + } + } + + this.ctx.logger.error(`上传USSL证书失败:${err}`); + throw err; + } + + + } + + async SslGetCertList(domain: string) { + const resp = await this.invoke({ + Action: "GetCertificateList", + Mode: "trust", + Domain: domain, + Sort:"2" + }); + return resp.CertificateList||[]; + } + + + async invoke(req: { Action: string, [key: string]: any }) { + const { Request } = await import('@ucloud-sdks/ucloud-sdk-js'); + const client = await this.getClient(); + const resp = await client.invoke(new Request({ + ...req + })); + this.ctx.logger.info(`请求UCloud API:${JSON.stringify(resp)}`); + const res = resp.data || {} + if (res.RetCode !== 0) { + throw new Error(res.Message) + } + + return res; + } + +} + +new UCloudAccess(); diff --git a/packages/ui/certd-server/src/plugins/plugin-ucloud/index.ts b/packages/ui/certd-server/src/plugins/plugin-ucloud/index.ts new file mode 100644 index 000000000..c49d8bf88 --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-ucloud/index.ts @@ -0,0 +1,2 @@ +export * from './access.js'; +export * from './plugins/index.js'; diff --git a/packages/ui/certd-server/src/plugins/plugin-ucloud/plugins/index.ts b/packages/ui/certd-server/src/plugins/plugin-ucloud/plugins/index.ts new file mode 100644 index 000000000..8ba439d47 --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-ucloud/plugins/index.ts @@ -0,0 +1,2 @@ +export * from './plugin-deploy-to-cdn.js'; +export * from './plugin-upload-to-ussl.js'; \ No newline at end of file diff --git a/packages/ui/certd-server/src/plugins/plugin-ucloud/plugins/plugin-deploy-to-cdn.ts b/packages/ui/certd-server/src/plugins/plugin-ucloud/plugins/plugin-deploy-to-cdn.ts new file mode 100644 index 000000000..115c462f2 --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-ucloud/plugins/plugin-deploy-to-cdn.ts @@ -0,0 +1,189 @@ +import { AbstractTaskPlugin, IsTaskPlugin, PageSearch, pluginGroups, RunStrategy, TaskInput } from "@certd/pipeline"; +import { CertApplyPluginNames, CertInfo } from "@certd/plugin-cert"; +import { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from "@certd/plugin-lib"; +import { UCloudAccess } from "../access.js"; + +@IsTaskPlugin({ + //命名规范,插件类型+功能(就是目录plugin-demo中的demo),大写字母开头,驼峰命名 + name: "UCloudDeployToCDN", + title: "UCloud-部署到CDN", + desc: "将证书部署到UCloud CDN", + icon: "svg:icon-lucky", + //插件分组 + group: pluginGroups.cdn.key, + needPlus: false, + default: { + //默认值配置照抄即可 + strategy: { + runStrategy: RunStrategy.SkipWhenSucceed + } + } +}) +//类名规范,跟上面插件名称(name)一致 +export class UCloudDeployToCDN extends AbstractTaskPlugin { + //证书选择,此项必须要有 + @TaskInput({ + title: "域名证书", + helper: "请选择前置任务输出的域名证书", + component: { + name: "output-selector", + from: [...CertApplyPluginNames, ":UCloudCertId:"] + } + // required: true, // 必填 + }) + cert!: CertInfo | { type: string, id: number, name: string }; + + @TaskInput(createCertDomainGetterInputDefine({ props: { required: false } })) + certDomains!: string[]; + + //授权选择框 + @TaskInput({ + title: "UCloud授权", + component: { + name: "access-selector", + type: "ucloud" //固定授权类型 + }, + required: true //必填 + }) + accessId!: string; + // + + @TaskInput( + createRemoteSelectInputDefine({ + title: "域名列表", + helper: "要更新的UCloud域名列表", + + action: UCloudDeployToCDN.prototype.onGetDomainList.name + }) + ) + domainList!: string[]; + + //插件实例化时执行的方法 + async onInstance() { + } + + //插件执行方法 + async execute(): Promise { + const access = await this.getAccess(this.accessId); + let certType = "ussl" + let certId = 0 + let certName = this.appendTimeSuffix("certd") + // @ts-ignore + if (this.cert?.id) { + //从上一步传过来的ssl证书 + // @ts-ignore + certId = this.cert.id + // @ts-ignore + certName = this.cert.name + + } else { + const cert = await access.SslUploadCert({ + cert: this.cert as CertInfo + }); + certId = cert.id + certName = cert.name + } + + for (const item of this.domainList) { + this.logger.info(`----------- 开始更新域名:${item}`); + await this.deployToCdn({ + access: access, + certName: certName, + domain: item, + certId: certId, + certType: certType + }); + this.logger.info(`----------- 更新域名证书${item}成功`); + } + + this.logger.info("部署完成"); + } + + + async deployToCdn(req: { access: any, domain: string, certId: number, certType: string, certName: string }) { + const { access, domain, certId, certType, certName } = req + + const domainsRes = await access.invoke({ + "Action": "GetUcdnDomainConfig", + "ProjectId": access.projectId, + "Domain": [ + domain + ] + }); + + const domainList = domainsRes.DomainList || []; + const domainConf = domainList.find((item: any) => item.Domain === domain); + if (!domainConf) { + throw new Error(`没有找到CDN域名${domain}`); + } + + const domainId = domainConf.DomainId; + const httpsStatusAbroad = domainConf.HttpsStatusAbroad; + let httpsStatusCn = domainConf.HttpsStatusCn; + if (httpsStatusAbroad === "disable" && httpsStatusCn === "disable") { + this.logger.info(`原CDN域名HTTPS未开启,将开启国内加速`); + httpsStatusCn = "enable" + } + + + const body: any = { + "Action": "UpdateUcdnDomainHttpsConfigV2", + "DomainId": domainId, + "CertName": certName, + "CertId": certId, + "CertType": certType, + EnableHttp2: domainConf.EnableHttp2 ||"0", + RedirectHttp2Https: domainConf.RedirectHttp2Https || "0", + TlsVersion: domainConf.TlsVersion || "tlsv1.0,tlsv1.1,tlsv1.2,tlsv1.3" + } + if (httpsStatusAbroad === "enable") { + body.HttpsStatusAbroad = httpsStatusAbroad; + } + if (httpsStatusCn === "enable") { + body.HttpsStatusCn = httpsStatusCn; + } + this.logger.info(`----------- 更新CDN域名HTTPS配置${domainId},${JSON.stringify(body)}`); + const resp = await access.invoke(body); + this.logger.info(`----------- 部署CDN证书${domainId}成功,${JSON.stringify(resp)}`); + } + + async onGetDomainList(req: PageSearch = {}) { + const access = await this.getAccess(this.accessId); + + const pageNo = req.pageNo ?? 1; + const pageSize = req.pageSize ?? 100; + const res = await access.CdnDominList( + { + PageNo: pageNo, + PageSize: pageSize + } + ); + const total = res.TotalCount; + const list = res.DomainInfoList || []; + if (!list || list.length === 0) { + throw new Error("没有找到CDN域名,请先在控制台创建CDN域名"); + } + + /** + * "Domain": "ucloud.certd.handsfree.work", + "DomainId": "ucdn-1kwdtph5ygbb" + */ + const options = list.map((item: any) => { + return { + label: `${item.Domain}<${item.DomainId}>`, + value: `${item.Domain}`, + domain: item.Domain + }; + }); + return { + list: this.ctx.utils.options.buildGroupOptions(options, this.certDomains), + total: total, + pageNo: pageNo, + pageSize: pageSize + }; + } + +} + +//实例化一下,注册插件 +new UCloudDeployToCDN(); diff --git a/packages/ui/certd-server/src/plugins/plugin-ucloud/plugins/plugin-upload-to-ussl.ts b/packages/ui/certd-server/src/plugins/plugin-ucloud/plugins/plugin-upload-to-ussl.ts new file mode 100644 index 000000000..ef081792f --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-ucloud/plugins/plugin-upload-to-ussl.ts @@ -0,0 +1,73 @@ +import { AbstractTaskPlugin, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, TaskOutput } from "@certd/pipeline"; +import { CertApplyPluginNames, CertInfo } from "@certd/plugin-cert"; +import { UCloudAccess } from "../access.js"; + +@IsTaskPlugin({ + //命名规范,插件类型+功能(就是目录plugin-demo中的demo),大写字母开头,驼峰命名 + name: "UCloudUploadToUSSL", + title: "UCloud-上传到USSL", + desc: "将证书上传到UCloud USSL", + icon: "svg:icon-lucky", + //插件分组 + group: pluginGroups.cdn.key, + needPlus: false, + default: { + //默认值配置照抄即可 + strategy: { + runStrategy: RunStrategy.SkipWhenSucceed + } + } +}) +//类名规范,跟上面插件名称(name)一致 +export class UCloudUploadToUSSL extends AbstractTaskPlugin { + //证书选择,此项必须要有 + @TaskInput({ + title: "域名证书", + helper: "请选择前置任务输出的域名证书", + component: { + name: "output-selector", + from: [...CertApplyPluginNames] + } + // required: true, // 必填 + }) + cert!: CertInfo; + + + + //授权选择框 + @TaskInput({ + title: "UCloud授权", + component: { + name: "access-selector", + type: "ucloud" //固定授权类型 + }, + required: true //必填 + }) + accessId!: string; + // + + @TaskOutput({ + title: "证书ID", + type: "UCloudCertId", + }) + certId!: {type:string,id:number,name:string}; + + + //插件实例化时执行的方法 + async onInstance() { + } + + //插件执行方法 + async execute(): Promise { + const access = await this.getAccess(this.accessId); + const certId = await access.SslUploadCert({cert:this.cert}); + this.certId = certId; + this.logger.info("部署完成"); + } + + + +} + +//实例化一下,注册插件 +new UCloudUploadToUSSL(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ff5810213..24b4b217e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -214,7 +214,7 @@ importers: version: link:../basic '@certd/plus-core': specifier: ^1.37.16 - version: 1.37.16 + version: link:../../pro/plus-core dayjs: specifier: ^1.11.7 version: 1.11.13 @@ -462,7 +462,7 @@ importers: version: link:../../plugins/plugin-lib '@certd/plus-core': specifier: ^1.37.16 - version: 1.37.16 + version: link:../../pro/plus-core '@midwayjs/cache': specifier: 3.14.0 version: 3.14.0 @@ -1490,7 +1490,7 @@ importers: version: link:../../core/basic '@certd/commercial-core': specifier: ^1.37.16 - version: 1.37.16(better-sqlite3@11.10.0)(encoding@0.1.13)(mysql2@3.14.1)(pg@8.16.0)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.100)(typescript@5.8.3)) + version: link:../../pro/commercial-core '@certd/cv4pve-api-javascript': specifier: ^8.4.2 version: 8.4.2 @@ -1520,10 +1520,10 @@ importers: version: link:../../plugins/plugin-lib '@certd/plugin-plus': specifier: ^1.37.16 - version: 1.37.16(encoding@0.1.13) + version: link:../../pro/plugin-plus '@certd/plus-core': specifier: ^1.37.16 - version: 1.37.16 + version: link:../../pro/plus-core '@huaweicloud/huaweicloud-sdk-cdn': specifier: ^3.1.120 version: 3.1.149 @@ -1569,6 +1569,9 @@ importers: '@peculiar/x509': specifier: ^1.11.0 version: 1.12.3 + '@ucloud-sdks/ucloud-sdk-js': + specifier: ^0.2.4 + version: 0.2.4 '@volcengine/openapi': specifier: ^1.28.1 version: 1.30.1(buffer@6.0.3) @@ -2876,18 +2879,9 @@ packages: '@better-scroll/zoom@2.5.1': resolution: {integrity: sha512-aGvFY5ooeZWS4RcxQLD+pGLpQHQxpPy0sMZV3yadcd2QK53PK9gS4Dp+BYfRv8lZ4/P2LoNEhr6Wq1DN6+uPlA==} - '@certd/commercial-core@1.37.16': - resolution: {integrity: sha512-JH6wlx88ljh2m2QiTJ1dvI/Up3jjOTEQqD/x3cfVmXHYfT//QFIL/O6cRIFKLWxN5Q+0k4YHmCDw/DI+WWdwlQ==} - '@certd/cv4pve-api-javascript@8.4.2': resolution: {integrity: sha512-udGce7ewrVl4DmZvX+17PjsnqsdDIHEDatr8QP0AVrY2p+8JkaSPW4mXCKiLGf82C9K2+GXgT+qNIqgW7tfF9Q==} - '@certd/plugin-plus@1.37.16': - resolution: {integrity: sha512-lzxyHyq9K+sDDFlPICs/0/W1nODvxTwk7N+qI1gskTbNpPt5CY1b47sPhwLb6oRTeW2/8iVdmt283GECFEAXXg==} - - '@certd/plus-core@1.37.16': - resolution: {integrity: sha512-PAyDMlLy/r5kx03A6pH4ICUAdPR9WZroGOx/ivJJo0Auk07uHU/kyXMfSCB6LytUHH0tOy36K+zuTCTdGr2NOA==} - '@certd/vue-js-cron-core@6.0.3': resolution: {integrity: sha512-kqzoAMhYz9j6FGNWEODRYtt4NpUEUwjpkU89z5WVg2tCtOcI5VhwyUGOd8AxiBCRfd6PtXvzuqw85PaOps9wrQ==} @@ -5364,6 +5358,9 @@ packages: resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ucloud-sdks/ucloud-sdk-js@0.2.4': + resolution: {integrity: sha512-jAE8IEagtLXoj172/YMmwnMHDH+DlwgvSmMYtEge618oa/Wkn1BwSofRAx1r5afjBkDGLRdGN9+X+53Y+akqag==} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -15440,84 +15437,12 @@ snapshots: dependencies: '@better-scroll/core': 2.5.1 - '@certd/commercial-core@1.37.16(better-sqlite3@11.10.0)(encoding@0.1.13)(mysql2@3.14.1)(pg@8.16.0)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.100)(typescript@5.8.3))': - dependencies: - '@certd/basic': link:packages/core/basic - '@certd/lib-server': link:packages/libs/lib-server - '@certd/pipeline': link:packages/core/pipeline - '@certd/plugin-plus': 1.37.16(encoding@0.1.13) - '@certd/plus-core': 1.37.16 - '@midwayjs/core': 3.20.11 - '@midwayjs/koa': 3.20.13 - '@midwayjs/logger': 3.4.2 - '@midwayjs/typeorm': 3.20.11 - alipay-sdk: 4.14.0 - dayjs: 1.11.13 - typeorm: 0.3.24(better-sqlite3@11.10.0)(mysql2@3.14.1)(pg@8.16.0)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.100)(typescript@5.8.3)) - wechatpay-node-v3: 2.2.1 - transitivePeerDependencies: - - '@google-cloud/spanner' - - '@sap/hana-client' - - babel-plugin-macros - - better-sqlite3 - - encoding - - hdb-pool - - ioredis - - mongodb - - mssql - - mysql2 - - oracledb - - pg - - pg-native - - pg-query-stream - - proxy-agent - - redis - - reflect-metadata - - sql.js - - sqlite3 - - supports-color - - ts-node - - typeorm-aurora-data-api-driver - '@certd/cv4pve-api-javascript@8.4.2': dependencies: debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@certd/plugin-plus@1.37.16(encoding@0.1.13)': - dependencies: - '@alicloud/pop-core': 1.8.0 - '@baiducloud/sdk': 1.0.3 - '@certd/basic': link:packages/core/basic - '@certd/lib-k8s': link:packages/libs/lib-k8s - '@certd/pipeline': link:packages/core/pipeline - '@certd/plugin-cert': link:packages/plugins/plugin-cert - '@certd/plugin-lib': link:packages/plugins/plugin-lib - '@certd/plus-core': 1.37.16 - ali-oss: 6.23.0 - baidu-aip-sdk: 4.16.16 - basic-ftp: 5.0.5 - cos-nodejs-sdk-v5: 2.14.7 - crypto-js: 4.2.0 - dayjs: 1.11.13 - form-data: 4.0.2 - https-proxy-agent: 7.0.6 - js-yaml: 4.1.0 - jsencrypt: 3.3.2 - jsrsasign: 11.1.0 - qiniu: 7.14.0 - tencentcloud-sdk-nodejs: 4.1.112(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - proxy-agent - - supports-color - - '@certd/plus-core@1.37.16': - dependencies: - '@certd/basic': link:packages/core/basic - dayjs: 1.11.13 - '@certd/vue-js-cron-core@6.0.3': dependencies: mustache: 4.2.0 @@ -18700,6 +18625,12 @@ snapshots: '@typescript-eslint/types': 8.32.1 eslint-visitor-keys: 4.2.0 + '@ucloud-sdks/ucloud-sdk-js@0.2.4': + dependencies: + axios: 0.21.4(debug@4.4.1) + transitivePeerDependencies: + - debug + '@ungap/structured-clone@1.3.0': {} '@uppy/companion-client@2.2.2': @@ -21364,13 +21295,13 @@ snapshots: resolve: 1.22.10 semver: 6.3.1 - eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@7.32.0)(prettier@2.8.8): + eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.10.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.8.8): dependencies: eslint: 7.32.0 prettier: 2.8.8 prettier-linter-helpers: 1.0.0 optionalDependencies: - eslint-config-prettier: 8.10.0(eslint@8.57.0) + eslint-config-prettier: 8.10.0(eslint@7.32.0) eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8): dependencies: @@ -23784,7 +23715,7 @@ snapshots: eslint: 7.32.0 eslint-config-prettier: 8.10.0(eslint@7.32.0) eslint-plugin-node: 11.1.0(eslint@7.32.0) - eslint-plugin-prettier: 3.4.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@7.32.0)(prettier@2.8.8) + eslint-plugin-prettier: 3.4.1(eslint-config-prettier@8.10.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.8.8) execa: 5.1.1 inquirer: 7.3.3 json5: 2.2.3