diff --git a/.trae/skills/dns-provider-dev/SKILL.md b/.trae/skills/dns-provider-dev/SKILL.md index b0cb7855c..ee75b0a11 100644 --- a/.trae/skills/dns-provider-dev/SKILL.md +++ b/.trae/skills/dns-provider-dev/SKILL.md @@ -70,9 +70,9 @@ version: 1.0.0 #### 你的回答 ```typescript -import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions, PageSearch, PageRes, DomainRecord } from '@certd/plugin-cert'; +import { Pager, PageRes, PageSearch } from "@certd/pipeline"; +import { AbstractDnsProvider, CreateRecordOptions, IsDnsProvider, RemoveRecordOptions, DomainRecord } from '@certd/plugin-cert'; import { DemoAccess } from './access.js'; -import { Pager } from '@certd/pipeline'; type DemoRecord = { // 这里定义 Record 记录的数据结构,跟对应云平台接口返回值一样即可 diff --git a/packages/ui/certd-server/package.json b/packages/ui/certd-server/package.json index 8093eb1e6..52f81a912 100644 --- a/packages/ui/certd-server/package.json +++ b/packages/ui/certd-server/package.json @@ -64,6 +64,7 @@ "@certd/plugin-lib": "^1.39.10", "@certd/plugin-plus": "^1.39.10", "@certd/plus-core": "^1.39.10", + "@google-cloud/dns": "^5.3.1", "@google-cloud/publicca": "^1.3.0", "@huaweicloud/huaweicloud-sdk-cdn": "^3.1.185", "@huaweicloud/huaweicloud-sdk-core": "^3.1.185", diff --git a/packages/ui/certd-server/src/plugins/plugin-google/dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-google/dns-provider.ts new file mode 100644 index 000000000..af197b5c8 --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-google/dns-provider.ts @@ -0,0 +1,281 @@ +import { Pager, PageRes, PageSearch } from "@certd/pipeline"; +import { + AbstractDnsProvider, + CreateRecordOptions, + DomainRecord, + IsDnsProvider, + RemoveRecordOptions, +} from "@certd/plugin-cert"; +import { GoogleAccess } from "../plugin-cert/access/index.js"; + +// TODO: 接口待明确 - 需要确认Google Cloud DNS API的具体参数和返回值格式 + +export type GoogleCloudDnsRecord = { + name: string; + type: string; + ttl: number; + rrdatas: string[]; + zoneId: string; + projectId: string; +}; + +@IsDnsProvider({ + name: "google-cloud-dns", + title: "Google Cloud DNS", + desc: "Google Cloud DNS提供商", + icon: "flat-color-icons:google", + accessType: "google", + order: 50, +}) +export class GoogleCloudDnsProvider extends AbstractDnsProvider { + access!: GoogleAccess; + projectId!: string; + credentials!: any; + envHttpsProxy: string = ""; + + async onInstance() { + this.access = this.ctx.access as GoogleAccess; + if (!this.access.serviceAccountSecret) { + throw new Error("服务账号密钥不能为空"); + } + this.credentials = JSON.parse(this.access.serviceAccountSecret); + this.projectId = this.credentials.project_id; + this.logger.debug("Google Cloud DNS Provider 初始化成功"); + } + + private async setupProxy() { + if (this.access.httpsProxy) { + this.envHttpsProxy = process.env.HTTPS_PROXY || ""; + process.env.HTTPS_PROXY = this.access.httpsProxy; + } + } + + private async restoreProxy() { + if (this.envHttpsProxy) { + process.env.HTTPS_PROXY = this.envHttpsProxy; + this.envHttpsProxy = ""; + } + } + + private async getGoogleDnsClient() { + const { DNS } = await import("@google-cloud/dns"); + return new DNS({ credentials: this.credentials }); + } + + private async findManagedZone(domain: string): Promise { + const dns = await this.getGoogleDnsClient(); + const [zones] = await dns.getZones(); + + // 查找匹配的托管区域 + const normalizedDomain = domain.endsWith(".") ? domain : domain + "."; + for (const zone of zones) { + const zoneDnsName = zone.metadata.dnsName; + if (normalizedDomain.endsWith(zoneDnsName) || zoneDnsName === normalizedDomain) { + return zone; + } + } + throw new Error(`未找到域名 ${domain} 对应的托管区域`); + } + + private async getExistingRecord(zone: any, recordName: string, type: string): Promise { + const [records] = await zone.getRecords({ + name: recordName, + type: type, + }); + return records.length > 0 ? records[0] : null; + } + + // 去掉引号的辅助函数 + private stripQuotes(str: string): string { + return str.replace(/^"|"$/g, ""); + } + + // 添加引号的辅助函数(如果没有的话) + private addQuotes(str: string): string { + if (str.startsWith('"') && str.endsWith('"')) { + return str; + } + return `"${str}"`; + } + // 比较值是否相等(忽略引号) + private valuesEqual(a: string, b: string): boolean { + return this.stripQuotes(a) === this.stripQuotes(b); + } + + async createRecord(options: CreateRecordOptions): Promise { + const { fullRecord, value, type, domain } = options; + this.logger.info("Google Cloud DNS: 添加解析记录", fullRecord, value, type, domain); + + await this.setupProxy(); + try { + const zone = await this.findManagedZone(domain); + const recordName = fullRecord.endsWith(".") ? fullRecord : fullRecord + "."; + + // 检查是否已存在该记录集 + const existingRecord = await this.getExistingRecord(zone, recordName, type); + + let newRrdatas: string[]; + let ttl: number; + if (existingRecord) { + // 记录已存在,追加新值 + this.logger.info("Google Cloud DNS: 记录已存在,追加新值"); + const existingRrdatas = existingRecord.metadata.rrdatas || []; + + // 检查值是否已存在(忽略引号) + const valueExists = existingRrdatas.some((existing: string) => + this.valuesEqual(existing, value) + ); + + if (valueExists) { + this.logger.info("Google Cloud DNS: 值已存在,无需重复添加", fullRecord, value); + return { + name: recordName, + type: type, + ttl: existingRecord.metadata.ttl, + rrdatas: existingRrdatas, + zoneId: zone.metadata.name, + projectId: this.projectId, + }; + } + + newRrdatas = [...existingRrdatas, this.addQuotes(value)]; + ttl = existingRecord.metadata.ttl; + } else { + // 创建新记录,加上引号 + newRrdatas = [this.addQuotes(value)]; + ttl = 60; + } + + const changeConfig: any = {}; + + // 如果存在旧记录,需要先删除 + if (existingRecord) { + // 使用Record对象格式 + changeConfig.delete = existingRecord; + } + + // 创建新的Record对象 + const newRecord = zone.record(type, { + name: recordName, + data: newRrdatas, + ttl: ttl, + }); + changeConfig.add = newRecord; + + await zone.createChange(changeConfig); + + this.logger.info("Google Cloud DNS: 解析记录创建成功", fullRecord); + + return { + name: recordName, + type: type, + ttl: ttl, + rrdatas: newRrdatas, // 已经包含引号了 + zoneId: zone.metadata.name, + projectId: this.projectId, + }; + } finally { + await this.restoreProxy(); + } + } + + async removeRecord(options: RemoveRecordOptions): Promise { + const { fullRecord, value } = options.recordReq; + const record = options.recordRes; + this.logger.info("Google Cloud DNS: 删除解析记录", fullRecord, value); + + if (!record) { + this.logger.info("记录为空,不执行删除"); + return; + } + + await this.setupProxy(); + try { + const dns = await this.getGoogleDnsClient(); + const zone = dns.zone(record.zoneId); + const recordName = record.name; + + // 先获取服务器最新的记录状态 + const existingRecord = await this.getExistingRecord(zone, recordName, record.type); + + if (!existingRecord) { + this.logger.info("Google Cloud DNS: 记录已不存在,无需删除", fullRecord); + return; + } + + const currentRrdatas = existingRecord.metadata.rrdatas || []; + + // 检查要删除的值是否存在(忽略引号) + const valueIndex = currentRrdatas.findIndex((existing: string) => + this.valuesEqual(existing, value) + ); + + if (valueIndex === -1) { + this.logger.info("Google Cloud DNS: 要删除的值不存在", fullRecord, value); + return; + } + + // 过滤掉要删除的值(精确匹配找到的那个,保持其他记录的原样) + const newRrdatas = currentRrdatas.filter((_: string, i: number) => i !== valueIndex); + + const changeConfig: any = { + delete: existingRecord, + }; + + if (newRrdatas.length > 0) { + // 还有剩余值,添加更新后的记录 + const newRecord = zone.record(record.type, { + name: recordName, + data: newRrdatas, + ttl: existingRecord.metadata.ttl, + }); + changeConfig.add = newRecord; + this.logger.info("Google Cloud DNS: 记录值已移除,剩余值", fullRecord, newRrdatas); + } else { + this.logger.info("Google Cloud DNS: 记录集已删除(无剩余值)", fullRecord); + } + + await zone.createChange(changeConfig); + } catch (error: any) { + this.logger.error("Google Cloud DNS: 删除解析记录失败", error.message); + // 即使删除失败也不抛出异常,避免影响整个证书申请流程 + } finally { + await this.restoreProxy(); + } + } + + async getDomainListPage(req: PageSearch): Promise> { + await this.setupProxy(); + try { + const pager = new Pager(req); + const dns = await this.getGoogleDnsClient(); + const [zones] = await dns.getZones({ + maxResults: pager.pageSize, + pageToken: pager.pageNo > 1 ? String(pager.pageNo) : undefined, + }); + + const list: DomainRecord[] = zones.map((zone: any) => ({ + id: zone.metadata.name, + domain: zone.metadata.dnsName.replace(/\.$/, ""), // 去掉结尾的点 + })); + + // 简单的搜索过滤 + let filteredList = list; + if (req.searchKey) { + filteredList = list.filter((item) => + item.domain.toLowerCase().includes(req.searchKey.toLowerCase()) + ); + } + + return { + list: filteredList, + total: zones.length, + }; + } finally { + await this.restoreProxy(); + } + } +} + +// 实例化插件 +new GoogleCloudDnsProvider(); diff --git a/packages/ui/certd-server/src/plugins/plugin-google/index.ts b/packages/ui/certd-server/src/plugins/plugin-google/index.ts new file mode 100644 index 000000000..5aec6fa47 --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-google/index.ts @@ -0,0 +1 @@ +export * from "./dns-provider.js"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc98da0c9..614952812 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,7 +49,7 @@ importers: packages/core/acme-client: dependencies: '@certd/basic': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../basic '@peculiar/x509': specifier: ^1.11.0 @@ -213,11 +213,11 @@ importers: packages/core/pipeline: dependencies: '@certd/basic': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../basic '@certd/plus-core': - specifier: ^1.39.9 - version: 1.39.9 + specifier: ^1.39.10 + version: link:../../pro/plus-core dayjs: specifier: ^1.11.7 version: 1.11.13 @@ -412,7 +412,7 @@ importers: packages/libs/lib-k8s: dependencies: '@certd/basic': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../core/basic '@kubernetes/client-node': specifier: 0.21.0 @@ -452,20 +452,20 @@ importers: packages/libs/lib-server: dependencies: '@certd/acme-client': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../core/acme-client '@certd/basic': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../core/basic '@certd/pipeline': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../core/pipeline '@certd/plugin-lib': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../plugins/plugin-lib '@certd/plus-core': - specifier: ^1.39.9 - version: 1.39.9 + specifier: ^1.39.10 + version: link:../../pro/plus-core '@midwayjs/cache': specifier: 3.14.0 version: 3.14.0 @@ -610,16 +610,16 @@ importers: packages/plugins/plugin-cert: dependencies: '@certd/acme-client': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../core/acme-client '@certd/basic': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../core/basic '@certd/pipeline': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../core/pipeline '@certd/plugin-lib': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../plugin-lib psl: specifier: ^1.9.0 @@ -683,17 +683,17 @@ importers: specifier: ^3.964.0 version: 3.964.0(aws-crt@1.26.2) '@certd/acme-client': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../core/acme-client '@certd/basic': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../core/basic '@certd/pipeline': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../core/pipeline '@certd/plus-core': - specifier: ^1.39.9 - version: 1.39.9 + specifier: ^1.39.10 + version: link:../../pro/plus-core '@kubernetes/client-node': specifier: 0.21.0 version: 0.21.0 @@ -783,16 +783,16 @@ importers: packages/pro/commercial-core: dependencies: '@certd/basic': - specifier: ^1.39.7 + specifier: ^1.39.10 version: link:../../core/basic '@certd/lib-server': - specifier: ^1.39.7 + specifier: ^1.39.10 version: link:../../libs/lib-server '@certd/pipeline': - specifier: ^1.39.7 + specifier: ^1.39.10 version: link:../../core/pipeline '@certd/plus-core': - specifier: ^1.39.7 + specifier: ^1.39.10 version: link:../plus-core '@midwayjs/core': specifier: 3.20.11 @@ -868,16 +868,16 @@ importers: packages/pro/plugin-plus: dependencies: '@certd/basic': - specifier: ^1.39.7 + specifier: ^1.39.10 version: link:../../core/basic '@certd/pipeline': - specifier: ^1.39.7 + specifier: ^1.39.10 version: link:../../core/pipeline '@certd/plugin-lib': - specifier: ^1.39.7 + specifier: ^1.39.10 version: link:../../plugins/plugin-lib '@certd/plus-core': - specifier: ^1.39.7 + specifier: ^1.39.10 version: link:../plus-core crypto-js: specifier: ^4.2.0 @@ -953,7 +953,7 @@ importers: packages/pro/plus-core: dependencies: '@certd/basic': - specifier: ^1.39.7 + specifier: ^1.39.10 version: link:../../core/basic dayjs: specifier: ^1.11.7 @@ -1249,10 +1249,10 @@ importers: version: 0.1.3(zod@3.24.4) devDependencies: '@certd/lib-iframe': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../libs/lib-iframe '@certd/pipeline': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../core/pipeline '@rollup/plugin-commonjs': specifier: ^25.0.7 @@ -1447,47 +1447,50 @@ importers: specifier: ^3.990.0 version: 3.990.0(aws-crt@1.26.2) '@certd/acme-client': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../core/acme-client '@certd/basic': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../core/basic '@certd/commercial-core': - specifier: ^1.39.9 - version: 1.39.9(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.9.3)) + specifier: ^1.39.10 + version: link:../../pro/commercial-core '@certd/cv4pve-api-javascript': specifier: ^8.4.2 version: 8.4.2 '@certd/jdcloud': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../libs/lib-jdcloud '@certd/lib-huawei': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../libs/lib-huawei '@certd/lib-k8s': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../libs/lib-k8s '@certd/lib-server': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../libs/lib-server '@certd/midway-flyway-js': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../libs/midway-flyway-js '@certd/pipeline': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../core/pipeline '@certd/plugin-cert': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../plugins/plugin-cert '@certd/plugin-lib': - specifier: ^1.39.9 + specifier: ^1.39.10 version: link:../../plugins/plugin-lib '@certd/plugin-plus': - specifier: ^1.39.9 - version: 1.39.9 + specifier: ^1.39.10 + version: link:../../pro/plugin-plus '@certd/plus-core': - specifier: ^1.39.9 - version: 1.39.9 + specifier: ^1.39.10 + version: link:../../pro/plus-core + '@google-cloud/dns': + specifier: ^5.3.1 + version: 5.3.1 '@google-cloud/publicca': specifier: ^1.3.0 version: 1.3.0(encoding@0.1.13) @@ -2838,18 +2841,9 @@ packages: '@better-scroll/zoom@2.5.1': resolution: {integrity: sha512-aGvFY5ooeZWS4RcxQLD+pGLpQHQxpPy0sMZV3yadcd2QK53PK9gS4Dp+BYfRv8lZ4/P2LoNEhr6Wq1DN6+uPlA==} - '@certd/commercial-core@1.39.9': - resolution: {integrity: sha512-oq4rWrK6Xxy9hkxZaUbQbZ2pFgtRcPuqlg9Ud1vtzO8zmFkZY48j+vsUH0V32k1dNr75BIl9r9RFY2Vwc6rcVg==} - '@certd/cv4pve-api-javascript@8.4.2': resolution: {integrity: sha512-udGce7ewrVl4DmZvX+17PjsnqsdDIHEDatr8QP0AVrY2p+8JkaSPW4mXCKiLGf82C9K2+GXgT+qNIqgW7tfF9Q==} - '@certd/plugin-plus@1.39.9': - resolution: {integrity: sha512-OdY0glIHQeaGUYwH8KvN++go4QB5KUBmRvw1jzIDKu5pHZEKkEij0UBfeDv8a5CC9ynA+4/aoNPCvB0tncNuCg==} - - '@certd/plus-core@1.39.9': - resolution: {integrity: sha512-75Wo4KQoHFxhWwLB3XjRC+ihButagGiaxiwS1u4oVzESW9EqQ+XKcGEw/WJF3oh81dE7orexo2nA4p/PdoTSlg==} - '@certd/vue-js-cron-core@6.0.3': resolution: {integrity: sha512-kqzoAMhYz9j6FGNWEODRYtt4NpUEUwjpkU89z5WVg2tCtOcI5VhwyUGOd8AxiBCRfd6PtXvzuqw85PaOps9wrQ==} @@ -3524,6 +3518,30 @@ packages: '@floating-ui/vue@1.1.6': resolution: {integrity: sha512-XFlUzGHGv12zbgHNk5FN2mUB7ROul3oG2ENdTpWdE+qMFxyNxWSRmsoyhiEnpmabNm6WnUvR1OvJfUfN4ojC1A==} + '@google-cloud/common@6.0.0': + resolution: {integrity: sha512-IXh04DlkLMxWgYLIUYuHHKXKOUwPDzDgke1ykkkJPe48cGIS9kkL2U/o0pm4ankHLlvzLF/ma1eO86n/bkumIA==} + engines: {node: '>=18'} + + '@google-cloud/dns@5.3.1': + resolution: {integrity: sha512-1kkLU/si7zpIZpY2yg3pXZ1LH8Ifl/ujhxvxd/1d5e8qQ2pcyrobaxqlCekKltjBA24s/o3Up7Cl9pqj4elxdg==} + engines: {node: '>=18'} + + '@google-cloud/paginator@6.0.0': + resolution: {integrity: sha512-g5nmMnzC+94kBxOKkLGpK1ikvolTFCC3s2qtE4F+1EuArcJ7HHC23RDQVt3Ra3CqpUYZ+oXNKZ8n5Cn5yug8DA==} + engines: {node: '>=18'} + + '@google-cloud/projectify@4.0.0': + resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==} + engines: {node: '>=14.0.0'} + + '@google-cloud/promisify@4.1.0': + resolution: {integrity: sha512-G/FQx5cE/+DqBbOpA5jKsegGwdPniU6PuIEMt+qxWgFxvxuFOzVmp6zYchtYuwAWV5/8Dgs0yAmjvNZv3uXLQg==} + engines: {node: '>=18'} + + '@google-cloud/promisify@5.0.0': + resolution: {integrity: sha512-N8qS6dlORGHwk7WjGXKOSsLjIjNINCPicsOX6gyyLiYk7mq3MtII96NZ9N2ahwA2vnkLmZODOIH9rlNniYWvCQ==} + engines: {node: '>=18'} + '@google-cloud/publicca@1.3.0': resolution: {integrity: sha512-Uaqrzs6N8O3lGZx+r9aOxW1KCtE3BBNZEewhcX2UvKW/2CEAV2HmW0bFVYwtiu3zGppkVMz9pXZInz/Q1qOwvQ==} engines: {node: '>=14.0.0'} @@ -3537,6 +3555,11 @@ packages: engines: {node: '>=6'} hasBin: true + '@grpc/proto-loader@0.8.0': + resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} + engines: {node: '>=6'} + hasBin: true + '@hapi/bourne@3.0.0': resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==} @@ -5800,6 +5823,10 @@ packages: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} + arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -5958,7 +5985,7 @@ packages: basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} - deprecated: Security vulnerability fixed in 5.2.0, please upgrade + deprecated: Security vulnerability fixed in 5.2.1, please upgrade bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} @@ -7041,6 +7068,10 @@ packages: resolution: {integrity: sha512-SIEkjrG7cZ9GWZQYk/mH+mWtcRPly/3ibVuXO/tP/MFoWz6KiRK77tSMq6YQBPl7RljPtXPQ/JhxbNuCdi1bNw==} engines: {node: '>=12'} + dns-zonefile@0.2.10: + resolution: {integrity: sha512-YXs0T8EjhwI3YFpL4l7n9Uy+g/ufmd3WyDSQsI4mrMNlrrdgK6aN0AbNjOkKoHyF59l/x4Y3/z64F3aJWCKWpg==} + hasBin: true + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -7806,10 +7837,18 @@ packages: resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} engines: {node: '>=14'} + gaxios@7.1.4: + resolution: {integrity: sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==} + engines: {node: '>=18'} + gcp-metadata@6.1.1: resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} engines: {node: '>=14'} + gcp-metadata@8.1.2: + resolution: {integrity: sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==} + engines: {node: '>=18'} + generate-function@2.3.1: resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} @@ -7966,6 +8005,10 @@ packages: good-listener@1.2.2: resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==} + google-auth-library@10.6.2: + resolution: {integrity: sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==} + engines: {node: '>=18'} + google-auth-library@9.15.1: resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==} engines: {node: '>=14'} @@ -7974,10 +8017,18 @@ packages: resolution: {integrity: sha512-zKKLeLfcYBVOzzM48Brtn4EQkKcTli9w6c1ilzFK2NbJvcd4ATD8/XqFExImvE/W5IwMlKKwa5qqVufji3ioNQ==} engines: {node: '>=14'} + google-gax@5.0.6: + resolution: {integrity: sha512-1kGbqVQBZPAAu4+/R1XxPQKP0ydbNYoLAr4l0ZO2bMV0kLyLW4I1gAk++qBLWt7DPORTzmWRMsCZe86gDjShJA==} + engines: {node: '>=18'} + google-logging-utils@0.0.2: resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} engines: {node: '>=14'} + google-logging-utils@1.1.3: + resolution: {integrity: sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==} + engines: {node: '>=14'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -8103,6 +8154,9 @@ packages: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -9042,6 +9096,9 @@ packages: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. + lodash.groupby@4.6.0: + resolution: {integrity: sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==} + lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -10732,6 +10789,10 @@ packages: resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==} engines: {node: '>=14.0.0'} + proto3-json-serializer@3.0.4: + resolution: {integrity: sha512-E1sbAYg3aEbXrq0n1ojJkRHQJGE1kaE/O6GLA94y8rnJBfgvOPTOd1b9hOceQK1FFZI9qMh1vBERCyO2ifubcw==} + engines: {node: '>=18'} + protobufjs@7.2.5: resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} engines: {node: '>=12.0.0'} @@ -10740,6 +10801,10 @@ packages: resolution: {integrity: sha512-f2ls6rpO6G153Cy+o2XQ+Y0sARLOZ17+OGVLHrc3VUKcLHYKEKWbkSujdBWQXM7gKn5NTfp0XnRPZn1MIu8n9w==} engines: {node: '>=12.0.0'} + protobufjs@7.5.5: + resolution: {integrity: sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==} + engines: {node: '>=12.0.0'} + protocols@2.0.2: resolution: {integrity: sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==} @@ -11086,6 +11151,10 @@ packages: resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} engines: {node: '>=14'} + retry-request@8.0.2: + resolution: {integrity: sha512-JzFPAfklk1kjR1w76f0QOIhoDkNkSqW8wYKT08n9yysTmZfB+RQ2QoXoTAeOi1HD9ZipTyTAZg3c4pM/jeqgSw==} + engines: {node: '>=18'} + retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} @@ -11536,6 +11605,9 @@ packages: resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} engines: {node: '>=8.0'} + string-format-obj@1.1.1: + resolution: {integrity: sha512-Mm+sROy+pHJmx0P/0Bs1uxIX6UhGJGj6xDGQZ5zh9v/SZRmLGevp+p0VJxV7lirrkAmQ2mvva/gHKpnF/pTb+Q==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -11779,6 +11851,10 @@ packages: teamcity-service-messages@0.1.14: resolution: {integrity: sha512-29aQwaHqm8RMX74u2o/h1KbMLP89FjNiMxD9wbF2BbWOnbM+q+d1sCEC+MqCc4QW3NJykn77OMpTFw/xTHIc0w==} + teeny-request@10.1.2: + resolution: {integrity: sha512-Xj0ZAQ0CeuQn6UxCDPLbFRlgcSTUEyO3+wiepr2grjIjyL/lMMs1Z4OwXn8kLvn/V1OuaEP0UY7Na6UDNNsYrQ==} + engines: {node: '>=18'} + teeny-request@9.0.0: resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} engines: {node: '>=14'} @@ -15155,64 +15231,12 @@ snapshots: dependencies: '@better-scroll/core': 2.5.1 - '@certd/commercial-core@1.39.9(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.9.3))': - dependencies: - '@certd/basic': link:packages/core/basic - '@certd/lib-server': link:packages/libs/lib-server - '@certd/pipeline': link:packages/core/pipeline - '@certd/plus-core': 1.39.9 - '@midwayjs/core': 3.20.11 - '@midwayjs/koa': 3.20.13 - '@midwayjs/logger': 3.4.2 - '@midwayjs/swagger': 3.20.11 - '@midwayjs/typeorm': 3.20.11 - 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.9.3)) - transitivePeerDependencies: - - '@google-cloud/spanner' - - '@sap/hana-client' - - babel-plugin-macros - - better-sqlite3 - - hdb-pool - - ioredis - - mongodb - - mssql - - mysql2 - - oracledb - - pg - - pg-native - - pg-query-stream - - 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.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@certd/plugin-plus@1.39.9': - dependencies: - '@certd/basic': link:packages/core/basic - '@certd/pipeline': link:packages/core/pipeline - '@certd/plugin-lib': link:packages/plugins/plugin-lib - '@certd/plus-core': 1.39.9 - crypto-js: 4.2.0 - dayjs: 1.11.13 - form-data: 4.0.2 - jsrsasign: 11.1.0 - querystring: 0.2.1 - - '@certd/plus-core@1.39.9': - dependencies: - '@certd/basic': link:packages/core/basic - dayjs: 1.11.13 - '@certd/vue-js-cron-core@6.0.3': dependencies: mustache: 4.2.0 @@ -15804,6 +15828,43 @@ snapshots: - '@vue/composition-api' - vue + '@google-cloud/common@6.0.0': + dependencies: + '@google-cloud/projectify': 4.0.0 + '@google-cloud/promisify': 4.1.0 + arrify: 2.0.1 + duplexify: 4.1.3 + extend: 3.0.2 + google-auth-library: 10.6.2 + html-entities: 2.6.0 + retry-request: 8.0.2 + teeny-request: 10.1.2 + transitivePeerDependencies: + - supports-color + + '@google-cloud/dns@5.3.1': + dependencies: + '@google-cloud/common': 6.0.0 + '@google-cloud/paginator': 6.0.0 + '@google-cloud/promisify': 5.0.0 + arrify: 2.0.1 + dns-zonefile: 0.2.10 + google-gax: 5.0.6 + lodash.groupby: 4.6.0 + string-format-obj: 1.1.1 + transitivePeerDependencies: + - supports-color + + '@google-cloud/paginator@6.0.0': + dependencies: + extend: 3.0.2 + + '@google-cloud/projectify@4.0.0': {} + + '@google-cloud/promisify@4.1.0': {} + + '@google-cloud/promisify@5.0.0': {} + '@google-cloud/publicca@1.3.0(encoding@0.1.13)': dependencies: google-gax: 4.6.0(encoding@0.1.13) @@ -15823,6 +15884,13 @@ snapshots: protobufjs: 7.5.2 yargs: 17.7.2 + '@grpc/proto-loader@0.8.0': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.5 + yargs: 17.7.2 + '@hapi/bourne@3.0.0': {} '@hapi/hoek@9.3.0': {} @@ -19035,6 +19103,8 @@ snapshots: arrify@1.0.1: {} + arrify@2.0.1: {} + asap@2.0.6: {} asn1@0.2.6: @@ -20436,6 +20506,8 @@ snapshots: test-value: 3.0.0 walk-back: 5.1.1 + dns-zonefile@0.2.10: {} + doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -20925,13 +20997,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: @@ -21463,6 +21535,14 @@ snapshots: - encoding - supports-color + gaxios@7.1.4: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + node-fetch: 3.3.2 + transitivePeerDependencies: + - supports-color + gcp-metadata@6.1.1(encoding@0.1.13): dependencies: gaxios: 6.7.1(encoding@0.1.13) @@ -21472,6 +21552,14 @@ snapshots: - encoding - supports-color + gcp-metadata@8.1.2: + dependencies: + gaxios: 7.1.4 + google-logging-utils: 1.1.3 + json-bigint: 1.0.0 + transitivePeerDependencies: + - supports-color + generate-function@2.3.1: dependencies: is-property: 1.0.2 @@ -21664,6 +21752,17 @@ snapshots: dependencies: delegate: 3.2.0 + google-auth-library@10.6.2: + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 7.1.4 + gcp-metadata: 8.1.2 + google-logging-utils: 1.1.3 + jws: 4.0.0 + transitivePeerDependencies: + - supports-color + google-auth-library@9.15.1(encoding@0.1.13): dependencies: base64-js: 1.5.1 @@ -21694,8 +21793,26 @@ snapshots: - encoding - supports-color + google-gax@5.0.6: + dependencies: + '@grpc/grpc-js': 1.13.3 + '@grpc/proto-loader': 0.8.0 + duplexify: 4.1.3 + google-auth-library: 10.6.2 + google-logging-utils: 1.1.3 + node-fetch: 3.3.2 + object-hash: 3.0.0 + proto3-json-serializer: 3.0.4 + protobufjs: 7.5.5 + retry-request: 8.0.2 + rimraf: 5.0.10 + transitivePeerDependencies: + - supports-color + google-logging-utils@0.0.2: {} + google-logging-utils@1.1.3: {} + gopd@1.2.0: {} got@9.6.0: @@ -21830,6 +21947,8 @@ snapshots: dependencies: lru-cache: 10.4.3 + html-entities@2.6.0: {} + html-escaper@2.0.2: {} html-minifier-terser@6.1.0: @@ -22824,6 +22943,8 @@ snapshots: lodash.get@4.4.2: {} + lodash.groupby@4.6.0: {} + lodash.includes@4.3.0: {} lodash.isboolean@3.0.3: {} @@ -23357,7 +23478,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 @@ -24586,6 +24707,10 @@ snapshots: dependencies: protobufjs: 7.5.2 + proto3-json-serializer@3.0.4: + dependencies: + protobufjs: 7.5.5 + protobufjs@7.2.5: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -24616,6 +24741,21 @@ snapshots: '@types/node': 20.17.47 long: 5.3.2 + protobufjs@7.5.5: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.17.47 + long: 5.3.2 + protocols@2.0.2: {} proxy-from-env@1.1.0: {} @@ -25041,6 +25181,13 @@ snapshots: - encoding - supports-color + retry-request@8.0.2: + dependencies: + extend: 3.0.2 + teeny-request: 10.1.2 + transitivePeerDependencies: + - supports-color + retry@0.12.0: {} reusify@1.1.0: {} @@ -25510,6 +25657,8 @@ snapshots: transitivePeerDependencies: - supports-color + string-format-obj@1.1.1: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -25875,6 +26024,15 @@ snapshots: teamcity-service-messages@0.1.14: {} + teeny-request@10.1.2: + dependencies: + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + node-fetch: 3.3.2 + stream-events: 1.0.5 + transitivePeerDependencies: + - supports-color + teeny-request@9.0.0(encoding@0.1.13): dependencies: http-proxy-agent: 5.0.0