diff --git a/CHANGELOG.md b/CHANGELOG.md index 9dc7e21a..6d4afd94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,24 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26) + +### Bug Fixes + +* 服务器时间获取不准确的bug ([5d10cbf](https://github.com/certd/certd/commit/5d10cbf18daf94a90a7551641a3b13e3c5fec611)) +* 修复复制流水线无效的bug ([3df20a9](https://github.com/certd/certd/commit/3df20a924f32970b052e2588ea20de095f0ea693)) +* 修复http上传方式无法清除记录文件的bug ([72a7b51](https://github.com/certd/certd/commit/72a7b51d479602b2c54c6c3ac8d8a0dcb9664e73)) +* 修复token过期后,疯狂打印token过期信息的bug ([50a5fa1](https://github.com/certd/certd/commit/50a5fa15bb240a125bbc91d2ce1ff3c835888a77)) + +### Performance Improvements + +* 从域名的soa获取主域名,子域名托管无需额外配置 ([a586a92](https://github.com/certd/certd/commit/a586a92d5e32ea846ac37be52a7ad8c328d89966)) +* 七牛oss支持删除过期备份 ([b7113bd](https://github.com/certd/certd/commit/b7113bda2378116d6c116dc583f563cce7cf9f00)) +* 数据库备份支持oss ([308d460](https://github.com/certd/certd/commit/308d4600efe2002f199c33b4594d3071784e58ea)) +* 支持阿里云中文域名申请 ([b3468cf](https://github.com/certd/certd/commit/b3468cf7f28228d7c9cf68de6b5a9bbeb67f2c6d)) +* 支持反向代理增加contextPath路径 ([0088929](https://github.com/certd/certd/commit/0088929622160cc922995de9a563e8061686ff34)) +* 支持中文域名 ([162ebfd](https://github.com/certd/certd/commit/162ebfd4e0c25727efb33952d3bbf7420a02e2c3)) + ## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22) ### Performance Improvements diff --git a/build.trigger b/build.trigger index de3fb51f..e8e2d5aa 100644 --- a/build.trigger +++ b/build.trigger @@ -1 +1 @@ -22:32 +01:58 diff --git a/docs/guide/changelogs/CHANGELOG.md b/docs/guide/changelogs/CHANGELOG.md index 9dc7e21a..6d4afd94 100644 --- a/docs/guide/changelogs/CHANGELOG.md +++ b/docs/guide/changelogs/CHANGELOG.md @@ -3,6 +3,24 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26) + +### Bug Fixes + +* 服务器时间获取不准确的bug ([5d10cbf](https://github.com/certd/certd/commit/5d10cbf18daf94a90a7551641a3b13e3c5fec611)) +* 修复复制流水线无效的bug ([3df20a9](https://github.com/certd/certd/commit/3df20a924f32970b052e2588ea20de095f0ea693)) +* 修复http上传方式无法清除记录文件的bug ([72a7b51](https://github.com/certd/certd/commit/72a7b51d479602b2c54c6c3ac8d8a0dcb9664e73)) +* 修复token过期后,疯狂打印token过期信息的bug ([50a5fa1](https://github.com/certd/certd/commit/50a5fa15bb240a125bbc91d2ce1ff3c835888a77)) + +### Performance Improvements + +* 从域名的soa获取主域名,子域名托管无需额外配置 ([a586a92](https://github.com/certd/certd/commit/a586a92d5e32ea846ac37be52a7ad8c328d89966)) +* 七牛oss支持删除过期备份 ([b7113bd](https://github.com/certd/certd/commit/b7113bda2378116d6c116dc583f563cce7cf9f00)) +* 数据库备份支持oss ([308d460](https://github.com/certd/certd/commit/308d4600efe2002f199c33b4594d3071784e58ea)) +* 支持阿里云中文域名申请 ([b3468cf](https://github.com/certd/certd/commit/b3468cf7f28228d7c9cf68de6b5a9bbeb67f2c6d)) +* 支持反向代理增加contextPath路径 ([0088929](https://github.com/certd/certd/commit/0088929622160cc922995de9a563e8061686ff34)) +* 支持中文域名 ([162ebfd](https://github.com/certd/certd/commit/162ebfd4e0c25727efb33952d3bbf7420a02e2c3)) + ## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22) ### Performance Improvements diff --git a/docs/guide/install/docker/index.md b/docs/guide/install/docker/index.md index 99514771..03e59825 100644 --- a/docs/guide/install/docker/index.md +++ b/docs/guide/install/docker/index.md @@ -55,6 +55,11 @@ https://your_server_ip:7002 ## 二、升级 +::: warning +如果您是第一次升级certd版本,切记切记先备份一下数据 +::: + + ### 如果使用固定版本号 1. 修改`docker-compose.yaml`中的镜像版本号 2. 运行`docker compose up -d` 即可 diff --git a/docs/guide/install/source/index.md b/docs/guide/install/source/index.md index 728633ae..28a9caf0 100644 --- a/docs/guide/install/source/index.md +++ b/docs/guide/install/source/index.md @@ -44,6 +44,11 @@ kill -9 $(lsof -t -i:7001) ./start.sh ``` +::: warning +升级certd版本前,切记切记先备份一下数据 +::: + + ## 三、数据备份 > 数据默认保存在 `./packages/ui/certd-server/data` 目录下 > 建议配置一条[数据库备份流水线](../../use/backup/) 自动备份 diff --git a/docs/guide/install/upgrade.md b/docs/guide/install/upgrade.md index 716c3ec0..11c6dc42 100644 --- a/docs/guide/install/upgrade.md +++ b/docs/guide/install/upgrade.md @@ -8,5 +8,9 @@ 3. [1Panel面板方式部署升级](./1panel/#三、升级) 4. [源码方式部署](./source/#二、升级) +::: warning +如果您是第一次升级certd版本,切记切记先备份一下数据 +::: + ## 升级日志 [CHANGELOG](../changelogs/CHANGELOG.md) diff --git a/lerna.json b/lerna.json index dc2ef4c8..252aa5a2 100644 --- a/lerna.json +++ b/lerna.json @@ -9,5 +9,5 @@ } }, "npmClient": "pnpm", - "version": "1.33.7" + "version": "1.33.8" } diff --git a/packages/core/acme-client/CHANGELOG.md b/packages/core/acme-client/CHANGELOG.md index deec53e4..ec932cac 100644 --- a/packages/core/acme-client/CHANGELOG.md +++ b/packages/core/acme-client/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.33.8](https://github.com/publishlab/node-acme-client/compare/v1.33.7...v1.33.8) (2025-04-26) + +### Bug Fixes + +* 修复http上传方式无法清除记录文件的bug ([72a7b51](https://github.com/publishlab/node-acme-client/commit/72a7b51d479602b2c54c6c3ac8d8a0dcb9664e73)) + +### Performance Improvements + +* 从域名的soa获取主域名,子域名托管无需额外配置 ([a586a92](https://github.com/publishlab/node-acme-client/commit/a586a92d5e32ea846ac37be52a7ad8c328d89966)) +* 七牛oss支持删除过期备份 ([b7113bd](https://github.com/publishlab/node-acme-client/commit/b7113bda2378116d6c116dc583f563cce7cf9f00)) + ## [1.33.7](https://github.com/publishlab/node-acme-client/compare/v1.33.6...v1.33.7) (2025-04-22) **Note:** Version bump only for package @certd/acme-client diff --git a/packages/core/acme-client/package.json b/packages/core/acme-client/package.json index 01e88030..151317c1 100644 --- a/packages/core/acme-client/package.json +++ b/packages/core/acme-client/package.json @@ -3,7 +3,7 @@ "description": "Simple and unopinionated ACME client", "private": false, "author": "nmorsman", - "version": "1.33.7", + "version": "1.33.8", "type": "module", "module": "scr/index.js", "main": "src/index.js", @@ -18,7 +18,7 @@ "types" ], "dependencies": { - "@certd/basic": "^1.33.7", + "@certd/basic": "^1.33.8", "@peculiar/x509": "^1.11.0", "asn1js": "^3.0.5", "axios": "^1.7.2", @@ -26,7 +26,8 @@ "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.5", "lodash-es": "^4.17.21", - "node-forge": "^1.3.1" + "node-forge": "^1.3.1", + "punycode": "^2.3.1" }, "devDependencies": { "@types/node": "^20.14.10", @@ -67,5 +68,5 @@ "bugs": { "url": "https://github.com/publishlab/node-acme-client/issues" }, - "gitHead": "a188385817e8dbd270dbdbf7f86a5b812884cf59" + "gitHead": "9b420ad33ff4c36fc99d643c18be9ec7e29f220d" } diff --git a/packages/core/acme-client/src/auto.js b/packages/core/acme-client/src/auto.js index 86c82192..30c454a3 100644 --- a/packages/core/acme-client/src/auto.js +++ b/packages/core/acme-client/src/auto.js @@ -117,12 +117,12 @@ export default async (client, userOpts) => { log(`[auto] [${d}] Trigger challengeCreateFn()`); try { - const { recordReq, recordRes, dnsProvider, challenge, keyAuthorization } = await opts.challengeCreateFn(authz, keyAuthorizationGetter); + const { recordReq, recordRes, dnsProvider, challenge, keyAuthorization ,httpUploader} = await opts.challengeCreateFn(authz, keyAuthorizationGetter); clearTasks.push(async () => { /* Trigger challengeRemoveFn(), suppress errors */ log(`[auto] [${d}] Trigger challengeRemoveFn()`); try { - await opts.challengeRemoveFn(authz, challenge, keyAuthorization, recordReq, recordRes, dnsProvider); + await opts.challengeRemoveFn(authz, challenge, keyAuthorization, recordReq, recordRes, dnsProvider,httpUploader); } catch (e) { log(`[auto] [${d}] challengeRemoveFn threw error: ${e.message}`); } diff --git a/packages/core/acme-client/src/index.js b/packages/core/acme-client/src/index.js index acc95e48..99cb041f 100644 --- a/packages/core/acme-client/src/index.js +++ b/packages/core/acme-client/src/index.js @@ -46,3 +46,5 @@ export * from './axios.js' export * from './logger.js' export * from './verify.js' export * from './error.js' + +export * from './util.js' \ No newline at end of file diff --git a/packages/core/acme-client/src/util.js b/packages/core/acme-client/src/util.js index 1c578501..bc373835 100644 --- a/packages/core/acme-client/src/util.js +++ b/packages/core/acme-client/src/util.js @@ -340,5 +340,6 @@ export { formatResponseError, getAuthoritativeDnsResolver, retrieveTlsAlpnCertificate, + resolveDomainBySoaRecord }; diff --git a/packages/core/acme-client/types/index.d.ts b/packages/core/acme-client/types/index.d.ts index 09179f21..6fa941da 100644 --- a/packages/core/acme-client/types/index.d.ts +++ b/packages/core/acme-client/types/index.d.ts @@ -59,7 +59,7 @@ export interface ClientExternalAccountBindingOptions { export interface ClientAutoOptions { csr: CsrBuffer | CsrString; challengeCreateFn: (authz: Authorization, keyAuthorization: (challenge:rfc8555.Challenge)=>Promise) => Promise<{recordReq?:any,recordRes?:any,dnsProvider?:any,challenge: rfc8555.Challenge,keyAuthorization:string}>; - challengeRemoveFn: (authz: Authorization, challenge: rfc8555.Challenge, keyAuthorization: string,recordReq:any, recordRes:any,dnsProvider:any) => Promise; + challengeRemoveFn: (authz: Authorization, challenge: rfc8555.Challenge, keyAuthorization: string,recordReq:any, recordRes:any,dnsProvider:any,httpUploader:any) => Promise; email?: string; termsOfServiceAgreed?: boolean; skipChallengeVerification?: boolean; @@ -204,4 +204,6 @@ export function setLogger(fn: (message: any, ...args: any[]) => void): void; export function walkTxtRecord(record: any): Promise; -export const CancelError: typeof CancelError; \ No newline at end of file +export const CancelError: typeof CancelError; + +export function resolveDomainBySoaRecord(domain: string): Promise; \ No newline at end of file diff --git a/packages/core/acme-client/types/index.test-d.js b/packages/core/acme-client/types/index.test-d.js deleted file mode 100644 index 58a1822b..00000000 --- a/packages/core/acme-client/types/index.test-d.js +++ /dev/null @@ -1,137 +0,0 @@ -"use strict"; -/** - * acme-client type definition tests - */ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -var acme = require("acme-client"); -(function () { return __awaiter(void 0, void 0, void 0, function () { - var accountKey, client, order, authorizations, authorization, challenge, _a, certKey, certCsr; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: return [4 /*yield*/, acme.crypto.createPrivateKey()]; - case 1: - accountKey = _b.sent(); - client = new acme.Client({ - accountKey: accountKey, - directoryUrl: acme.directory.letsencrypt.staging - }); - /* Account */ - return [4 /*yield*/, client.createAccount({ - termsOfServiceAgreed: true, - contact: ['mailto:test@example.com'] - })]; - case 2: - /* Account */ - _b.sent(); - return [4 /*yield*/, client.createOrder({ - identifiers: [ - { type: 'dns', value: 'example.com' }, - { type: 'dns', value: '*.example.com' }, - ] - })]; - case 3: - order = _b.sent(); - return [4 /*yield*/, client.getOrder(order)]; - case 4: - _b.sent(); - return [4 /*yield*/, client.getAuthorizations(order)]; - case 5: - authorizations = _b.sent(); - authorization = authorizations[0]; - challenge = authorization.challenges[0]; - return [4 /*yield*/, client.getChallengeKeyAuthorization(challenge)]; - case 6: - _b.sent(); - return [4 /*yield*/, client.verifyChallenge(authorization, challenge)]; - case 7: - _b.sent(); - return [4 /*yield*/, client.completeChallenge(challenge)]; - case 8: - _b.sent(); - return [4 /*yield*/, client.waitForValidStatus(challenge)]; - case 9: - _b.sent(); - return [4 /*yield*/, acme.crypto.createCsr({ - commonName: 'example.com', - altNames: ['example.com', '*.example.com'] - })]; - case 10: - _a = _b.sent(), certKey = _a[0], certCsr = _a[1]; - return [4 /*yield*/, client.finalizeOrder(order, certCsr)]; - case 11: - _b.sent(); - return [4 /*yield*/, client.getCertificate(order)]; - case 12: - _b.sent(); - return [4 /*yield*/, client.getCertificate(order, 'DST Root CA X3')]; - case 13: - _b.sent(); - /* Auto */ - return [4 /*yield*/, client.auto({ - csr: certCsr, - challengeCreateFn: function (authz, challenge, keyAuthorization) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { - return [2 /*return*/]; - }); }); }, - challengeRemoveFn: function (authz, challenge, keyAuthorization) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { - return [2 /*return*/]; - }); }); } - })]; - case 14: - /* Auto */ - _b.sent(); - return [4 /*yield*/, client.auto({ - csr: certCsr, - email: 'test@example.com', - termsOfServiceAgreed: false, - skipChallengeVerification: false, - challengePriority: ['http-01', 'dns-01'], - preferredChain: 'DST Root CA X3', - challengeCreateFn: function (authz, challenge, keyAuthorization) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { - return [2 /*return*/]; - }); }); }, - challengeRemoveFn: function (authz, challenge, keyAuthorization) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { - return [2 /*return*/]; - }); }); } - })]; - case 15: - _b.sent(); - return [2 /*return*/]; - } - }); -}); })(); diff --git a/packages/core/basic/CHANGELOG.md b/packages/core/basic/CHANGELOG.md index cbaffcd6..652677b9 100644 --- a/packages/core/basic/CHANGELOG.md +++ b/packages/core/basic/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26) + +**Note:** Version bump only for package @certd/basic + ## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22) ### Performance Improvements diff --git a/packages/core/basic/build.md b/packages/core/basic/build.md index 5b0d1491..a0251e1d 100644 --- a/packages/core/basic/build.md +++ b/packages/core/basic/build.md @@ -1 +1 @@ -22:12 +01:54 diff --git a/packages/core/basic/package.json b/packages/core/basic/package.json index 58036850..ec0a09e4 100644 --- a/packages/core/basic/package.json +++ b/packages/core/basic/package.json @@ -1,7 +1,7 @@ { "name": "@certd/basic", "private": false, - "version": "1.33.7", + "version": "1.33.8", "type": "module", "main": "./dist/index.js", "module": "./dist/index.js", @@ -44,5 +44,5 @@ "tslib": "^2.8.1", "typescript": "^5.4.2" }, - "gitHead": "a188385817e8dbd270dbdbf7f86a5b812884cf59" + "gitHead": "9b420ad33ff4c36fc99d643c18be9ec7e29f220d" } diff --git a/packages/core/pipeline/CHANGELOG.md b/packages/core/pipeline/CHANGELOG.md index 0fa368ea..623603d5 100644 --- a/packages/core/pipeline/CHANGELOG.md +++ b/packages/core/pipeline/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26) + +**Note:** Version bump only for package @certd/pipeline + ## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22) **Note:** Version bump only for package @certd/pipeline diff --git a/packages/core/pipeline/package.json b/packages/core/pipeline/package.json index f8f345e9..f826effd 100644 --- a/packages/core/pipeline/package.json +++ b/packages/core/pipeline/package.json @@ -1,7 +1,7 @@ { "name": "@certd/pipeline", "private": false, - "version": "1.33.7", + "version": "1.33.8", "type": "module", "main": "./dist/index.js", "module": "./dist/index.js", @@ -16,8 +16,8 @@ "test": "mocha --loader=ts-node/esm" }, "dependencies": { - "@certd/basic": "^1.33.7", - "@certd/plus-core": "^1.33.7", + "@certd/basic": "^1.33.8", + "@certd/plus-core": "^1.33.8", "dayjs": "^1.11.7", "lodash-es": "^4.17.21", "reflect-metadata": "^0.1.13" @@ -43,5 +43,5 @@ "tslib": "^2.8.1", "typescript": "^5.4.2" }, - "gitHead": "a188385817e8dbd270dbdbf7f86a5b812884cf59" + "gitHead": "9b420ad33ff4c36fc99d643c18be9ec7e29f220d" } diff --git a/packages/libs/lib-huawei/CHANGELOG.md b/packages/libs/lib-huawei/CHANGELOG.md index def9c537..8e4d3425 100644 --- a/packages/libs/lib-huawei/CHANGELOG.md +++ b/packages/libs/lib-huawei/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26) + +**Note:** Version bump only for package @certd/lib-huawei + ## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22) **Note:** Version bump only for package @certd/lib-huawei diff --git a/packages/libs/lib-huawei/package.json b/packages/libs/lib-huawei/package.json index 81b73987..00281a64 100644 --- a/packages/libs/lib-huawei/package.json +++ b/packages/libs/lib-huawei/package.json @@ -1,7 +1,7 @@ { "name": "@certd/lib-huawei", "private": false, - "version": "1.33.7", + "version": "1.33.8", "main": "./dist/bundle.js", "module": "./dist/bundle.js", "types": "./dist/d/index.d.ts", @@ -23,5 +23,5 @@ "prettier": "^2.8.8", "tslib": "^2.8.1" }, - "gitHead": "a188385817e8dbd270dbdbf7f86a5b812884cf59" + "gitHead": "9b420ad33ff4c36fc99d643c18be9ec7e29f220d" } diff --git a/packages/libs/lib-iframe/CHANGELOG.md b/packages/libs/lib-iframe/CHANGELOG.md index 83672c0c..3b97e6b0 100644 --- a/packages/libs/lib-iframe/CHANGELOG.md +++ b/packages/libs/lib-iframe/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26) + +**Note:** Version bump only for package @certd/lib-iframe + ## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22) **Note:** Version bump only for package @certd/lib-iframe diff --git a/packages/libs/lib-iframe/package.json b/packages/libs/lib-iframe/package.json index a8f0eab7..74bf4b90 100644 --- a/packages/libs/lib-iframe/package.json +++ b/packages/libs/lib-iframe/package.json @@ -1,7 +1,7 @@ { "name": "@certd/lib-iframe", "private": false, - "version": "1.33.7", + "version": "1.33.8", "type": "module", "main": "./dist/index.js", "module": "./dist/index.js", @@ -30,5 +30,5 @@ "tslib": "^2.8.1", "typescript": "^5.4.2" }, - "gitHead": "a188385817e8dbd270dbdbf7f86a5b812884cf59" + "gitHead": "9b420ad33ff4c36fc99d643c18be9ec7e29f220d" } diff --git a/packages/libs/lib-jdcloud/CHANGELOG.md b/packages/libs/lib-jdcloud/CHANGELOG.md index 6f080955..ac338a42 100644 --- a/packages/libs/lib-jdcloud/CHANGELOG.md +++ b/packages/libs/lib-jdcloud/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26) + +**Note:** Version bump only for package @certd/jdcloud + ## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22) **Note:** Version bump only for package @certd/jdcloud diff --git a/packages/libs/lib-jdcloud/package.json b/packages/libs/lib-jdcloud/package.json index 767d1803..671d73ea 100644 --- a/packages/libs/lib-jdcloud/package.json +++ b/packages/libs/lib-jdcloud/package.json @@ -1,6 +1,6 @@ { "name": "@certd/jdcloud", - "version": "1.33.7", + "version": "1.33.8", "description": "jdcloud openApi sdk", "main": "./dist/bundle.js", "module": "./dist/bundle.js", @@ -60,5 +60,5 @@ "fetch" ] }, - "gitHead": "a188385817e8dbd270dbdbf7f86a5b812884cf59" + "gitHead": "9b420ad33ff4c36fc99d643c18be9ec7e29f220d" } diff --git a/packages/libs/lib-k8s/CHANGELOG.md b/packages/libs/lib-k8s/CHANGELOG.md index 5869e69b..2283f1bf 100644 --- a/packages/libs/lib-k8s/CHANGELOG.md +++ b/packages/libs/lib-k8s/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26) + +**Note:** Version bump only for package @certd/lib-k8s + ## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22) **Note:** Version bump only for package @certd/lib-k8s diff --git a/packages/libs/lib-k8s/package.json b/packages/libs/lib-k8s/package.json index 9e241f3b..ca8c4165 100644 --- a/packages/libs/lib-k8s/package.json +++ b/packages/libs/lib-k8s/package.json @@ -1,7 +1,7 @@ { "name": "@certd/lib-k8s", "private": false, - "version": "1.33.7", + "version": "1.33.8", "type": "module", "main": "./dist/index.js", "module": "./dist/index.js", @@ -16,7 +16,7 @@ "preview": "vite preview" }, "dependencies": { - "@certd/basic": "^1.33.7", + "@certd/basic": "^1.33.8", "@kubernetes/client-node": "0.21.0" }, "devDependencies": { @@ -31,5 +31,5 @@ "tslib": "^2.8.1", "typescript": "^5.4.2" }, - "gitHead": "a188385817e8dbd270dbdbf7f86a5b812884cf59" + "gitHead": "9b420ad33ff4c36fc99d643c18be9ec7e29f220d" } diff --git a/packages/libs/lib-server/CHANGELOG.md b/packages/libs/lib-server/CHANGELOG.md index ffb32e5a..6c25cd61 100644 --- a/packages/libs/lib-server/CHANGELOG.md +++ b/packages/libs/lib-server/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26) + +**Note:** Version bump only for package @certd/lib-server + ## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22) **Note:** Version bump only for package @certd/lib-server diff --git a/packages/libs/lib-server/package.json b/packages/libs/lib-server/package.json index 5553473b..3936c668 100644 --- a/packages/libs/lib-server/package.json +++ b/packages/libs/lib-server/package.json @@ -1,6 +1,6 @@ { "name": "@certd/lib-server", - "version": "1.33.7", + "version": "1.33.8", "description": "midway with flyway, sql upgrade way ", "private": false, "type": "module", @@ -27,10 +27,10 @@ ], "license": "AGPL", "dependencies": { - "@certd/acme-client": "^1.33.7", - "@certd/basic": "^1.33.7", - "@certd/pipeline": "^1.33.7", - "@certd/plus-core": "^1.33.7", + "@certd/acme-client": "^1.33.8", + "@certd/basic": "^1.33.8", + "@certd/pipeline": "^1.33.8", + "@certd/plus-core": "^1.33.8", "@midwayjs/cache": "~3.14.0", "@midwayjs/core": "~3.20.3", "@midwayjs/i18n": "~3.20.3", @@ -61,5 +61,5 @@ "typeorm": "^0.3.11", "typescript": "^5.4.2" }, - "gitHead": "a188385817e8dbd270dbdbf7f86a5b812884cf59" + "gitHead": "9b420ad33ff4c36fc99d643c18be9ec7e29f220d" } diff --git a/packages/libs/midway-flyway-js/CHANGELOG.md b/packages/libs/midway-flyway-js/CHANGELOG.md index e06e51a7..753fb24b 100644 --- a/packages/libs/midway-flyway-js/CHANGELOG.md +++ b/packages/libs/midway-flyway-js/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26) + +**Note:** Version bump only for package @certd/midway-flyway-js + ## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22) **Note:** Version bump only for package @certd/midway-flyway-js diff --git a/packages/libs/midway-flyway-js/package.json b/packages/libs/midway-flyway-js/package.json index 6a28ae20..7c52e725 100644 --- a/packages/libs/midway-flyway-js/package.json +++ b/packages/libs/midway-flyway-js/package.json @@ -1,6 +1,6 @@ { "name": "@certd/midway-flyway-js", - "version": "1.33.7", + "version": "1.33.8", "description": "midway with flyway, sql upgrade way ", "private": false, "type": "module", @@ -46,5 +46,5 @@ "typeorm": "^0.3.11", "typescript": "^5.4.2" }, - "gitHead": "a188385817e8dbd270dbdbf7f86a5b812884cf59" + "gitHead": "9b420ad33ff4c36fc99d643c18be9ec7e29f220d" } diff --git a/packages/plugins/plugin-cert/CHANGELOG.md b/packages/plugins/plugin-cert/CHANGELOG.md index d64ba329..372ad8b8 100644 --- a/packages/plugins/plugin-cert/CHANGELOG.md +++ b/packages/plugins/plugin-cert/CHANGELOG.md @@ -3,6 +3,19 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26) + +### Bug Fixes + +* 修复http上传方式无法清除记录文件的bug ([72a7b51](https://github.com/certd/certd/commit/72a7b51d479602b2c54c6c3ac8d8a0dcb9664e73)) + +### Performance Improvements + +* 从域名的soa获取主域名,子域名托管无需额外配置 ([a586a92](https://github.com/certd/certd/commit/a586a92d5e32ea846ac37be52a7ad8c328d89966)) +* 数据库备份支持oss ([308d460](https://github.com/certd/certd/commit/308d4600efe2002f199c33b4594d3071784e58ea)) +* 支持阿里云中文域名申请 ([b3468cf](https://github.com/certd/certd/commit/b3468cf7f28228d7c9cf68de6b5a9bbeb67f2c6d)) +* 支持中文域名 ([162ebfd](https://github.com/certd/certd/commit/162ebfd4e0c25727efb33952d3bbf7420a02e2c3)) + ## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22) **Note:** Version bump only for package @certd/plugin-cert diff --git a/packages/plugins/plugin-cert/package.json b/packages/plugins/plugin-cert/package.json index e8dda165..6ead162e 100644 --- a/packages/plugins/plugin-cert/package.json +++ b/packages/plugins/plugin-cert/package.json @@ -1,7 +1,7 @@ { "name": "@certd/plugin-cert", "private": false, - "version": "1.33.7", + "version": "1.33.8", "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -15,15 +15,16 @@ "preview": "vite preview" }, "dependencies": { - "@certd/acme-client": "^1.33.7", - "@certd/basic": "^1.33.7", - "@certd/pipeline": "^1.33.7", - "@certd/plugin-lib": "^1.33.7", + "@certd/acme-client": "^1.33.8", + "@certd/basic": "^1.33.8", + "@certd/pipeline": "^1.33.8", + "@certd/plugin-lib": "^1.33.8", "@google-cloud/publicca": "^1.3.0", "dayjs": "^1.11.7", "jszip": "^3.10.1", "lodash-es": "^4.17.21", "psl": "^1.9.0", + "punycode": "^2.3.1", "rimraf": "^5.0.5" }, "devDependencies": { @@ -41,5 +42,5 @@ "tslib": "^2.8.1", "typescript": "^5.4.2" }, - "gitHead": "a188385817e8dbd270dbdbf7f86a5b812884cf59" + "gitHead": "9b420ad33ff4c36fc99d643c18be9ec7e29f220d" } diff --git a/packages/plugins/plugin-cert/src/dns-provider/api.ts b/packages/plugins/plugin-cert/src/dns-provider/api.ts index f2781e4b..70d38767 100644 --- a/packages/plugins/plugin-cert/src/dns-provider/api.ts +++ b/packages/plugins/plugin-cert/src/dns-provider/api.ts @@ -35,6 +35,8 @@ export interface IDnsProvider { createRecord(options: CreateRecordOptions): Promise; removeRecord(options: RemoveRecordOptions): Promise; setCtx(ctx: DnsProviderContext): void; + //中文域名是否需要punycode转码,如果返回True,则使用punycode来添加解析记录,否则使用中文域名添加解析记录 + usePunyCode(): boolean; } export interface ISubDomainsGetter { diff --git a/packages/plugins/plugin-cert/src/dns-provider/base.ts b/packages/plugins/plugin-cert/src/dns-provider/base.ts index b1ccdc17..e262c605 100644 --- a/packages/plugins/plugin-cert/src/dns-provider/base.ts +++ b/packages/plugins/plugin-cert/src/dns-provider/base.ts @@ -8,6 +8,10 @@ export abstract class AbstractDnsProvider implements IDnsProvider { http!: HttpClient; logger!: ILogger; + usePunyCode(): boolean { + return false; + } + setCtx(ctx: DnsProviderContext) { this.ctx = ctx; this.logger = ctx.logger; diff --git a/packages/plugins/plugin-cert/src/dns-provider/domain-parser.ts b/packages/plugins/plugin-cert/src/dns-provider/domain-parser.ts index 752795bc..08f48785 100644 --- a/packages/plugins/plugin-cert/src/dns-provider/domain-parser.ts +++ b/packages/plugins/plugin-cert/src/dns-provider/domain-parser.ts @@ -1,6 +1,8 @@ import { IDomainParser, ISubDomainsGetter } from "./api"; //@ts-ignore import psl from "psl"; +import { resolveDomainBySoaRecord } from "@certd/acme-client"; +import { logger, utils } from "@certd/basic"; export class DomainParser implements IDomainParser { subDomainsGetter: ISubDomainsGetter; @@ -17,16 +19,38 @@ export class DomainParser implements IDomainParser { } async parse(fullDomain: string) { - const subDomains = await this.subDomainsGetter.getSubDomains(); - if (subDomains && subDomains.length > 0) { - for (const subDomain of subDomains) { - if (fullDomain.endsWith(subDomain)) { - //找到子域名托管 - return subDomain; - } + logger.info(`查找主域名:${fullDomain}`); + const cacheKey = `domain_parse:${fullDomain}`; + const value = utils.cache.get(cacheKey); + if (value) { + logger.info(`从缓存获取到主域名:${fullDomain}->${value}`); + return value; + } + try { + const mainDomain = await resolveDomainBySoaRecord(fullDomain); + if (mainDomain) { + utils.cache.set(cacheKey, mainDomain, { + ttl: 2 * 60 * 1000, + }); + logger.info(`获取到主域名:${fullDomain}->${mainDomain}`); + return mainDomain; } + } catch (e) { + logger.error("从SOA获取主域名失败", e.message); } - return this.parseDomain(fullDomain); + // const subDomains = await this.subDomainsGetter.getSubDomains(); + // if (subDomains && subDomains.length > 0) { + // for (const subDomain of subDomains) { + // if (fullDomain.endsWith(subDomain)) { + // //找到子域名托管 + // return subDomain; + // } + // } + // } + + const res = this.parseDomain(fullDomain); + logger.info(`从psl获取主域名:${fullDomain}->${res}`); + return res; } } diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/acme.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/acme.ts index 29c96247..f479be75 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/acme.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/acme.ts @@ -6,8 +6,8 @@ import { Challenge } from "@certd/acme-client/types/rfc8555"; import { IContext } from "@certd/pipeline"; import { ILogger, utils } from "@certd/basic"; import { IDnsProvider, IDomainParser } from "../../dns-provider/index.js"; -import { HttpChallengeUploader } from "./uploads/api.js"; - +import punycode from "node:punycode"; +import { IOssClient } from "@certd/plugin-lib"; export type CnameVerifyPlan = { type?: string; domain: string; @@ -18,7 +18,7 @@ export type CnameVerifyPlan = { export type HttpVerifyPlan = { type: string; domain: string; - httpUploader: HttpChallengeUploader; + httpUploader: IOssClient; }; export type DomainVerifyPlan = { @@ -35,7 +35,6 @@ export type DomainsVerifyPlan = { export type Providers = { dnsProvider?: IDnsProvider; domainsVerifyPlan?: DomainsVerifyPlan; - httpUploader?: HttpChallengeUploader; }; export type CertInfo = { @@ -184,7 +183,7 @@ export class AcmeService { return authz.challenges.find((c: any) => c.type === type); }; - const doHttpVerify = async (challenge: any, httpUploader: HttpChallengeUploader) => { + const doHttpVerify = async (challenge: any, httpUploader: IOssClient) => { const keyAuthorization = await keyAuthorizationGetter(challenge); this.logger.info("http校验"); const filePath = `.well-known/acme-challenge/${challenge.token}`; @@ -203,14 +202,16 @@ export class AcmeService { this.logger.info("dns校验"); const keyAuthorization = await keyAuthorizationGetter(challenge); + const mainDomain = dnsProvider.usePunyCode() ? domain : punycode.toUnicode(domain); + fullRecord = dnsProvider.usePunyCode() ? fullRecord : punycode.toUnicode(fullRecord); const recordValue = keyAuthorization; - let hostRecord = fullRecord.replace(`${domain}`, ""); + let hostRecord = fullRecord.replace(`${mainDomain}`, ""); if (hostRecord.endsWith(".")) { hostRecord = hostRecord.substring(0, hostRecord.length - 1); } const recordReq = { - domain, + domain: mainDomain, fullRecord, hostRecord, type: "TXT", @@ -286,7 +287,7 @@ export class AcmeService { * @returns {Promise} */ - async challengeRemoveFn(authz: any, challenge: any, keyAuthorization: string, recordReq: any, recordRes: any, dnsProvider?: IDnsProvider, httpUploader?: HttpChallengeUploader) { + async challengeRemoveFn(authz: any, challenge: any, keyAuthorization: string, recordReq: any, recordRes: any, dnsProvider?: IDnsProvider, httpUploader?: IOssClient) { this.logger.info("执行清理"); /* http-01 */ @@ -321,9 +322,16 @@ export class AcmeService { isTest?: boolean; privateKeyType?: string; }): Promise { - const { email, isTest, domains, csrInfo, dnsProvider, domainsVerifyPlan, httpUploader } = options; + const { email, isTest, csrInfo, dnsProvider, domainsVerifyPlan } = options; const client: acme.Client = await this.getAcmeClient(email, isTest); + let domains = options.domains; + const encodingDomains = []; + for (const domain of domains) { + encodingDomains.push(punycode.toASCII(domain)); + } + domains = encodingDomains; + /* Create CSR */ const { commonName, altNames } = this.buildCommonNameByDomains(domains); let privateKey = null; @@ -361,14 +369,13 @@ export class AcmeService { privateKey ); - if (dnsProvider == null && domainsVerifyPlan == null && httpUploader == null) { - throw new Error("dnsProvider 、 domainsVerifyPlan 、 httpUploader不能都为空"); + if (dnsProvider == null && domainsVerifyPlan == null) { + throw new Error("dnsProvider 、 domainsVerifyPlan不能都为空"); } const providers: Providers = { dnsProvider, domainsVerifyPlan, - httpUploader, }; /* 自动申请证书 */ const crt = await client.auto({ @@ -383,7 +390,7 @@ export class AcmeService { ): Promise<{ recordReq?: any; recordRes?: any; dnsProvider?: any; challenge: Challenge; keyAuthorization: string }> => { return await this.challengeCreateFn(authz, keyAuthorizationGetter, providers); }, - challengeRemoveFn: async (authz: acme.Authorization, challenge: Challenge, keyAuthorization: string, recordReq: any, recordRes: any, dnsProvider: IDnsProvider): Promise => { + challengeRemoveFn: async (authz: acme.Authorization, challenge: Challenge, keyAuthorization: string, recordReq: any, recordRes: any, dnsProvider: IDnsProvider, httpUploader: IOssClient): Promise => { return await this.challengeRemoveFn(authz, challenge, keyAuthorization, recordReq, recordRes, dnsProvider, httpUploader); }, signal: this.options.signal, diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/base-convert.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/base-convert.ts index a73dd2c4..9301e144 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/base-convert.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/base-convert.ts @@ -27,8 +27,7 @@ export abstract class CertApplyBaseConvertPlugin extends AbstractTaskPlugin { "1、支持多个域名打到一个证书上,例如: foo.com,*.foo.com,*.bar.com\n" + "2、子域名被通配符包含的不要填写,例如:www.foo.com已经被*.foo.com包含,不要填写www.foo.com\n" + "3、泛域名只能通配*号那一级(*.foo.com的证书不能用于xxx.yyy.foo.com、不能用于foo.com)\n" + - "4、输入一个,空格之后,再输入下一个\n" + - "5、如果你配置了子域托管解析,请先[设置托管子域名](#/certd/pipeline/subDomain)", + "4、输入一个,空格之后,再输入下一个", }) domains!: string[]; diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts index 3166e08e..3931af9d 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts @@ -9,8 +9,8 @@ import { CertReader } from "./cert-reader.js"; import { CertApplyBasePlugin } from "./base.js"; import { GoogleClient } from "../../libs/google.js"; import { EabAccess } from "../../access"; -import { httpChallengeUploaderFactory } from "./uploads/factory.js"; import { DomainParser } from "../../dns-provider/domain-parser.js"; +import { ossClientFactory } from "@certd/plugin-lib"; export * from "./base.js"; export type { CertInfo }; export * from "./cert-reader.js"; @@ -115,6 +115,7 @@ HTTP文件验证:不支持泛域名,需要配置网站文件上传`, }) dnsProviderType!: string; + // dns解析授权类型,勿删 dnsProviderAccessType!: string; @TaskInput({ @@ -446,7 +447,7 @@ HTTP文件验证:不支持泛域名,需要配置网站文件上传`, rootDir = rootDir + "/"; } this.logger.info("上传方式", httpRecord.httpUploaderType); - const httpUploader = await httpChallengeUploaderFactory.createUploaderByType(httpRecord.httpUploaderType, { + const httpUploader = await ossClientFactory.createOssClientByType(httpRecord.httpUploaderType, { access, rootDir: rootDir, ctx: httpUploaderContext, diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/api.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/api.ts deleted file mode 100644 index c489cc51..00000000 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/api.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { IAccessService } from "@certd/pipeline"; -import { ILogger, utils } from "@certd/basic"; - -export type HttpChallengeUploader = { - upload: (fileName: string, fileContent: Buffer) => Promise; - remove: (fileName: string) => Promise; -}; - -export type HttpChallengeUploadContext = { - accessService: IAccessService; - logger: ILogger; - utils: typeof utils; -}; - -export abstract class BaseHttpChallengeUploader implements HttpChallengeUploader { - rootDir: string; - access: A = null; - logger: ILogger; - utils: typeof utils; - ctx: HttpChallengeUploadContext; - protected constructor(opts: { rootDir: string; access: A }) { - this.rootDir = opts.rootDir; - this.access = opts.access; - } - - async setCtx(ctx: any) { - // set context - this.ctx = ctx; - this.logger = ctx.logger; - this.utils = ctx.utils; - } - - abstract remove(fileName: string): Promise; - abstract upload(fileName: string, fileContent: Buffer): Promise; -} diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/impls/alioss.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/impls/alioss.ts deleted file mode 100644 index bb4f5d7d..00000000 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/impls/alioss.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { BaseHttpChallengeUploader } from "../api.js"; -import { AliossAccess, AliyunAccess } from "@certd/plugin-lib"; -import { AliossClient } from "@certd/plugin-lib"; - -export class AliossHttpChallengeUploader extends BaseHttpChallengeUploader { - async upload(filePath: string, fileContent: Buffer) { - const aliyunAccess = await this.ctx.accessService.getById(this.access.accessId); - const client = new AliossClient({ - access: aliyunAccess, - bucket: this.access.bucket, - region: this.access.region, - }); - - const key = this.rootDir + filePath; - this.logger.info(`开始上传文件: ${key}`); - await client.uploadFile(key, fileContent); - - this.logger.info(`校验文件上传成功: ${filePath}`); - } - - async remove(filePath: string) { - const key = this.rootDir + filePath; - // remove file from alioss - const client = await this.getAliossClient(); - await client.removeFile(key); - this.logger.info(`文件删除成功: ${key}`); - } - - private async getAliossClient() { - const aliyunAccess = await this.ctx.accessService.getById(this.access.accessId); - const client = new AliossClient({ - access: aliyunAccess, - bucket: this.access.bucket, - region: this.access.region, - }); - await client.init(); - return client; - } -} diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/impls/ftp.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/impls/ftp.ts deleted file mode 100644 index 521ad6ac..00000000 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/impls/ftp.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { BaseHttpChallengeUploader } from "../api.js"; -import { FtpAccess, FtpClient } from "@certd/plugin-lib"; -import path from "path"; -import os from "os"; -import fs from "fs"; - -export class FtpHttpChallengeUploader extends BaseHttpChallengeUploader { - async upload(filePath: string, fileContent: Buffer) { - const client = new FtpClient({ - access: this.access, - logger: this.logger, - }); - await client.connect(async (client) => { - const tmpFilePath = path.join(os.tmpdir(), "cert", "http", filePath); - const dir = path.dirname(tmpFilePath); - if (!fs.existsSync(dir)) { - fs.mkdirSync(dir, { recursive: true }); - } - fs.writeFileSync(tmpFilePath, fileContent); - try { - // Write file to temp path - const path = this.rootDir + filePath; - await client.upload(path, tmpFilePath); - } finally { - // Remove temp file - fs.unlinkSync(tmpFilePath); - } - }); - } - - async remove(filePath: string) { - const client = new FtpClient({ - access: this.access, - logger: this.logger, - }); - await client.connect(async (client) => { - const path = this.rootDir + filePath; - await client.client.remove(path); - }); - } -} diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/impls/qiniuoss.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/impls/qiniuoss.ts deleted file mode 100644 index 892d8a6a..00000000 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/impls/qiniuoss.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { BaseHttpChallengeUploader } from "../api.js"; -import { QiniuOssAccess, QiniuClient, QiniuAccess } from "@certd/plugin-lib"; - -export class QiniuOssHttpChallengeUploader extends BaseHttpChallengeUploader { - async upload(filePath: string, fileContent: Buffer) { - const qiniuAccess = await this.ctx.accessService.getById(this.access.accessId); - const client = new QiniuClient({ - access: qiniuAccess, - logger: this.logger, - http: this.ctx.utils.http, - }); - if (this.rootDir.endsWith("/")) { - this.rootDir = this.rootDir.slice(0, -1); - } - await client.uploadFile(this.access.bucket, this.rootDir + filePath, fileContent); - } - - async remove(filePath: string) { - const qiniuAccess = await this.ctx.accessService.getById(this.access.accessId); - const client = new QiniuClient({ - access: qiniuAccess, - logger: this.logger, - http: this.ctx.utils.http, - }); - - if (this.rootDir.endsWith("/")) { - this.rootDir = this.rootDir.slice(0, -1); - } - await client.removeFile(this.access.bucket, this.rootDir + filePath); - } -} diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/impls/sftp.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/impls/sftp.ts deleted file mode 100644 index 3af1e9c0..00000000 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/impls/sftp.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { BaseHttpChallengeUploader } from "../api.js"; -import { SshAccess, SshClient } from "@certd/plugin-lib"; -import path from "path"; -import os from "os"; -import fs from "fs"; -import { SftpAccess } from "@certd/plugin-lib"; - -export class SftpHttpChallengeUploader extends BaseHttpChallengeUploader { - async upload(filePath: string, fileContent: Buffer) { - const tmpFilePath = path.join(os.tmpdir(), "cert", "http", filePath); - - // Write file to temp path - const dir = path.dirname(tmpFilePath); - if (!fs.existsSync(dir)) { - fs.mkdirSync(dir, { recursive: true }); - } - fs.writeFileSync(tmpFilePath, fileContent); - - const access = await this.ctx.accessService.getById(this.access.sshAccess); - const key = this.rootDir + filePath; - try { - const client = new SshClient(this.logger); - await client.uploadFiles({ - connectConf: access, - mkdirs: true, - transports: [ - { - localPath: tmpFilePath, - remotePath: key, - }, - ], - opts: { - mode: this.access?.fileMode ?? undefined, - }, - }); - } finally { - // Remove temp file - fs.unlinkSync(tmpFilePath); - } - } - - async remove(filePath: string) { - const access = await this.ctx.accessService.getById(this.access.sshAccess); - const client = new SshClient(this.logger); - const key = this.rootDir + filePath; - await client.removeFiles({ - connectConf: access, - files: [key], - }); - } -} diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/impls/tencentcos.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/impls/tencentcos.ts deleted file mode 100644 index b18f9931..00000000 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/impls/tencentcos.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { BaseHttpChallengeUploader } from "../api.js"; -import { TencentAccess, TencentCosAccess, TencentCosClient } from "@certd/plugin-lib"; - -export class TencentCosHttpChallengeUploader extends BaseHttpChallengeUploader { - async upload(filePath: string, fileContent: Buffer) { - const access = await this.ctx.accessService.getById(this.access.accessId); - const client = new TencentCosClient({ - access: access, - logger: this.logger, - region: this.access.region, - bucket: this.access.bucket, - }); - const key = this.rootDir + filePath; - await client.uploadFile(key, fileContent); - } - - async remove(filePath: string) { - const access = await this.ctx.accessService.getById(this.access.accessId); - const client = new TencentCosClient({ - access: access, - logger: this.logger, - region: this.access.region, - bucket: this.access.bucket, - }); - const key = this.rootDir + filePath; - await client.removeFile(key); - } -} diff --git a/packages/plugins/plugin-lib/CHANGELOG.md b/packages/plugins/plugin-lib/CHANGELOG.md index f147a37a..72d4cc1b 100644 --- a/packages/plugins/plugin-lib/CHANGELOG.md +++ b/packages/plugins/plugin-lib/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26) + +### Bug Fixes + +* 修复http上传方式无法清除记录文件的bug ([72a7b51](https://github.com/certd/certd/commit/72a7b51d479602b2c54c6c3ac8d8a0dcb9664e73)) + +### Performance Improvements + +* 七牛oss支持删除过期备份 ([b7113bd](https://github.com/certd/certd/commit/b7113bda2378116d6c116dc583f563cce7cf9f00)) +* 数据库备份支持oss ([308d460](https://github.com/certd/certd/commit/308d4600efe2002f199c33b4594d3071784e58ea)) + ## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22) ### Performance Improvements diff --git a/packages/plugins/plugin-lib/package.json b/packages/plugins/plugin-lib/package.json index 8e627bfb..8bf941a5 100644 --- a/packages/plugins/plugin-lib/package.json +++ b/packages/plugins/plugin-lib/package.json @@ -1,7 +1,7 @@ { "name": "@certd/plugin-lib", "private": false, - "version": "1.33.7", + "version": "1.33.8", "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -16,10 +16,11 @@ }, "dependencies": { "@alicloud/pop-core": "^1.7.10", - "@certd/basic": "^1.33.7", - "@certd/pipeline": "^1.33.7", + "@aws-sdk/client-s3": "^3.787.0", + "@certd/basic": "^1.33.8", + "@certd/pipeline": "^1.33.8", "@kubernetes/client-node": "0.21.0", - "ali-oss": "^6.21.0", + "ali-oss": "^6.22.0", "basic-ftp": "^5.0.5", "cos-nodejs-sdk-v5": "^2.14.6", "dayjs": "^1.11.7", @@ -48,5 +49,5 @@ "tslib": "^2.8.1", "typescript": "^5.4.2" }, - "gitHead": "a188385817e8dbd270dbdbf7f86a5b812884cf59" + "gitHead": "9b420ad33ff4c36fc99d643c18be9ec7e29f220d" } diff --git a/packages/plugins/plugin-lib/src/aliyun/lib/oss-client.ts b/packages/plugins/plugin-lib/src/aliyun/lib/oss-client.ts index d5bdddf6..362abc9b 100644 --- a/packages/plugins/plugin-lib/src/aliyun/lib/oss-client.ts +++ b/packages/plugins/plugin-lib/src/aliyun/lib/oss-client.ts @@ -1,4 +1,4 @@ -import { AliyunAccess } from "../access"; +import { AliyunAccess } from "../access/index.js"; export class AliossClient { access: AliyunAccess; @@ -52,7 +52,7 @@ export class AliossClient { } } - async uploadFile(filePath: string, content: Buffer) { + async uploadFile(filePath: string, content: Buffer | string) { await this.init(); return await this.client.put(filePath, content); } @@ -61,4 +61,23 @@ export class AliossClient { await this.init(); return await this.client.delete(filePath); } + + async downloadFile(key: string, savePath: string) { + await this.init(); + return await this.client.get(key, savePath); + } + + async listDir(dirKey: string) { + await this.init(); + const res = await this.client.listV2({ + prefix: dirKey, + // max-keys: 100, + // continuation-token: "token", + // delimiter: "/", + // marker: "marker", + // encoding-type: "url", + }); + + return res.objects; + } } diff --git a/packages/plugins/plugin-lib/src/ftp/client.ts b/packages/plugins/plugin-lib/src/ftp/client.ts index 04d2eee9..4a21c353 100644 --- a/packages/plugins/plugin-lib/src/ftp/client.ts +++ b/packages/plugins/plugin-lib/src/ftp/client.ts @@ -11,7 +11,7 @@ export class FtpClient { this.logger = opts.logger; } - async connect(callback: (client: FtpClient) => Promise) { + async connect(callback: (client: FtpClient) => Promise) { const ftp = await import("basic-ftp"); const Client = ftp.Client; const client = new Client(); @@ -21,7 +21,7 @@ export class FtpClient { this.logger.info("FTP连接成功"); this.client = client; try { - await callback(this); + return await callback(this); } finally { if (client) { client.close(); @@ -44,4 +44,20 @@ export class FtpClient { this.logger.info(`开始删除文件${filePath}`); await this.client.remove(filePath, true); } + + async listDir(dir: string): Promise { + if (!dir) { + return []; + } + if (!dir.endsWith("/")) { + dir = dir + "/"; + } + this.logger.info(`开始列出目录${dir}`); + return await this.client.list(dir); + } + + async download(filePath: string, savePath: string): Promise { + this.logger.info(`开始下载文件${filePath} -> ${savePath}`); + await this.client.downloadTo(savePath, filePath); + } } diff --git a/packages/plugins/plugin-lib/src/index.ts b/packages/plugins/plugin-lib/src/index.ts index 9a10d221..ab1d48c1 100644 --- a/packages/plugins/plugin-lib/src/index.ts +++ b/packages/plugins/plugin-lib/src/index.ts @@ -5,3 +5,5 @@ export * from "./ftp/index.js"; export * from "./tencent/index.js"; export * from "./qiniu/index.js"; export * from "./ctyun/index.js"; +export * from "./oss/index.js"; +export * from "./s3/index.js"; diff --git a/packages/plugins/plugin-lib/src/oss/api.ts b/packages/plugins/plugin-lib/src/oss/api.ts new file mode 100644 index 00000000..8dd46f78 --- /dev/null +++ b/packages/plugins/plugin-lib/src/oss/api.ts @@ -0,0 +1,90 @@ +import { IAccessService } from "@certd/pipeline"; +import { ILogger, utils } from "@certd/basic"; +import dayjs from "dayjs"; + +export type OssClientRemoveByOpts = { + dir?: string; + //删除多少天前的文件 + beforeDays?: number; +}; + +export type OssFileItem = { + //文件全路径 + path: string; + size: number; + //毫秒时间戳 + lastModified: number; +}; + +export type IOssClient = { + upload: (fileName: string, fileContent: Buffer) => Promise; + remove: (fileName: string, opts?: { joinRootDir?: boolean }) => Promise; + + download: (fileName: string, savePath: string) => Promise; + + removeBy: (removeByOpts: OssClientRemoveByOpts) => Promise; + + listDir: (dir: string) => Promise; +}; + +export type OssClientContext = { + accessService: IAccessService; + logger: ILogger; + utils: typeof utils; +}; + +export abstract class BaseOssClient implements IOssClient { + rootDir: string = ""; + access: A = null; + logger: ILogger; + utils: typeof utils; + ctx: OssClientContext; + + protected constructor(opts: { rootDir?: string; access: A }) { + this.rootDir = opts.rootDir || ""; + this.access = opts.access; + } + + join(...strs: string[]) { + let res = ""; + for (const item of strs) { + if (item) { + if (!res) { + res = item; + } else { + res += "/" + item; + } + } + } + res = res.replace(/[\\/]+/g, "/"); + return res; + } + + async setCtx(ctx: any) { + // set context + this.ctx = ctx; + this.logger = ctx.logger; + this.utils = ctx.utils; + await this.init(); + } + + async init() { + // do nothing + } + + abstract remove(fileName: string, opts?: { joinRootDir?: boolean }): Promise; + abstract upload(fileName: string, fileContent: Buffer): Promise; + abstract download(fileName: string, savePath: string): Promise; + abstract listDir(dir: string): Promise; + + async removeBy(removeByOpts: OssClientRemoveByOpts): Promise { + const list = await this.listDir(removeByOpts.dir); + // removeByOpts.beforeDays = 0; + const beforeDate = dayjs().subtract(removeByOpts.beforeDays, "day"); + for (const item of list) { + if (item.lastModified && item.lastModified < beforeDate.valueOf()) { + await this.remove(item.path, { joinRootDir: false }); + } + } + } +} diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/factory.ts b/packages/plugins/plugin-lib/src/oss/factory.ts similarity index 59% rename from packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/factory.ts rename to packages/plugins/plugin-lib/src/oss/factory.ts index 2b09b959..9bd128ed 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/factory.ts +++ b/packages/plugins/plugin-lib/src/oss/factory.ts @@ -1,30 +1,33 @@ -import { HttpChallengeUploadContext } from "./api"; +import { OssClientContext } from "./api"; -export class HttpChallengeUploaderFactory { +export class OssClientFactory { async getClassByType(type: string) { if (type === "alioss") { const module = await import("./impls/alioss.js"); - return module.AliossHttpChallengeUploader; + return module.default; } else if (type === "ssh") { const module = await import("./impls/ssh.js"); - return module.SshHttpChallengeUploader; + return module.default; } else if (type === "sftp") { const module = await import("./impls/sftp.js"); - return module.SftpHttpChallengeUploader; + return module.default; } else if (type === "ftp") { const module = await import("./impls/ftp.js"); - return module.FtpHttpChallengeUploader; + return module.default; } else if (type === "tencentcos") { const module = await import("./impls/tencentcos.js"); - return module.TencentCosHttpChallengeUploader; + return module.default; } else if (type === "qiniuoss") { const module = await import("./impls/qiniuoss.js"); - return module.QiniuOssHttpChallengeUploader; + return module.default; + } else if (type === "s3") { + const module = await import("./impls/s3.js"); + return module.default; } else { throw new Error(`暂不支持此文件上传方式: ${type}`); } } - async createUploaderByType(type: string, opts: { rootDir: string; access: any; ctx: HttpChallengeUploadContext }) { + async createOssClientByType(type: string, opts: { rootDir?: string; access: any; ctx: OssClientContext }) { const cls = await this.getClassByType(type); if (cls) { // @ts-ignore @@ -35,4 +38,4 @@ export class HttpChallengeUploaderFactory { } } -export const httpChallengeUploaderFactory = new HttpChallengeUploaderFactory(); +export const ossClientFactory = new OssClientFactory(); diff --git a/packages/plugins/plugin-lib/src/oss/impls/alioss.ts b/packages/plugins/plugin-lib/src/oss/impls/alioss.ts new file mode 100644 index 00000000..954420b6 --- /dev/null +++ b/packages/plugins/plugin-lib/src/oss/impls/alioss.ts @@ -0,0 +1,57 @@ +import { BaseOssClient, OssFileItem } from "../api.js"; +import { AliossAccess, AliossClient, AliyunAccess } from "../../aliyun/index.js"; +import dayjs from "dayjs"; + +export default class AliOssClientImpl extends BaseOssClient { + client: AliossClient; + join(...strs: string[]) { + const str = super.join(...strs); + if (str.startsWith("/")) { + return str.substring(1); + } + return str; + } + async init() { + const aliyunAccess = await this.ctx.accessService.getById(this.access.accessId); + const client = new AliossClient({ + access: aliyunAccess, + bucket: this.access.bucket, + region: this.access.region, + }); + await client.init(); + this.client = client; + } + async download(filePath: string, savePath: string): Promise { + const key = this.join(this.rootDir, filePath); + await this.client.downloadFile(key, savePath); + } + async listDir(dir: string): Promise { + const dirKey = this.join(this.rootDir, dir) + "/"; + const list = await this.client.listDir(dirKey); + this.logger.info(`列出目录: ${dirKey},文件数:${list.length}`); + return list.map(item => { + return { + path: item.name, + lastModified: dayjs(item.lastModified).valueOf(), + size: item.size, + }; + }); + } + async upload(filePath: string, fileContent: Buffer | string) { + const key = this.join(this.rootDir, filePath); + this.logger.info(`开始上传文件: ${key}`); + await this.client.uploadFile(key, fileContent); + + this.logger.info(`文件上传成功: ${filePath}`); + } + + async remove(filePath: string, opts?: { joinRootDir?: boolean }) { + if (opts?.joinRootDir !== false) { + filePath = this.join(this.rootDir, filePath); + } + const key = filePath; + // remove file from alioss + await this.client.removeFile(key); + this.logger.info(`文件删除成功: ${key}`); + } +} diff --git a/packages/plugins/plugin-lib/src/oss/impls/ftp.ts b/packages/plugins/plugin-lib/src/oss/impls/ftp.ts new file mode 100644 index 00000000..161c277b --- /dev/null +++ b/packages/plugins/plugin-lib/src/oss/impls/ftp.ts @@ -0,0 +1,78 @@ +import { BaseOssClient } from "../api.js"; +import path from "path"; +import os from "os"; +import fs from "fs"; +import { FtpAccess, FtpClient } from "../../ftp/index.js"; + +export default class FtpOssClientImpl extends BaseOssClient { + join(...strs: string[]) { + const str = super.join(...strs); + if (!str.startsWith("/")) { + return "/" + str; + } + return str; + } + + async download(fileName: string, savePath: string) { + const client = this.getFtpClient(); + await client.connect(async client => { + const path = this.join(this.rootDir, fileName); + await client.download(path, savePath); + }); + } + async listDir(dir: string) { + const client = this.getFtpClient(); + return await client.connect(async (client: FtpClient) => { + const path = this.join(this.rootDir, dir); + const res = await client.listDir(path); + return res.map(item => { + return { + path: this.join(path, item.name), + size: item.size, + lastModified: item.modifiedAt.getTime(), + }; + }); + }); + } + async upload(filePath: string, fileContent: Buffer | string) { + const client = this.getFtpClient(); + await client.connect(async client => { + let tmpFilePath = fileContent as string; + if (typeof fileContent !== "string") { + tmpFilePath = path.join(os.tmpdir(), "cert", "oss", filePath); + const dir = path.dirname(tmpFilePath); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } + fs.writeFileSync(tmpFilePath, fileContent); + } + + try { + // Write file to temp path + const path = this.join(this.rootDir, filePath); + await client.upload(tmpFilePath, path); + } finally { + // Remove temp file + fs.unlinkSync(tmpFilePath); + } + }); + } + + private getFtpClient() { + return new FtpClient({ + access: this.access, + logger: this.logger, + }); + } + + async remove(filePath: string, opts?: { joinRootDir?: boolean }) { + if (opts?.joinRootDir !== false) { + filePath = this.join(this.rootDir, filePath); + } + const client = this.getFtpClient(); + await client.connect(async client => { + await client.client.remove(filePath); + this.logger.info(`删除文件成功: ${filePath}`); + }); + } +} diff --git a/packages/plugins/plugin-lib/src/oss/impls/qiniuoss.ts b/packages/plugins/plugin-lib/src/oss/impls/qiniuoss.ts new file mode 100644 index 00000000..06f88f71 --- /dev/null +++ b/packages/plugins/plugin-lib/src/oss/impls/qiniuoss.ts @@ -0,0 +1,50 @@ +import { QiniuAccess, QiniuClient, QiniuOssAccess } from "../../qiniu/index.js"; +import { BaseOssClient, OssFileItem } from "../api.js"; + +export default class QiniuOssClientImpl extends BaseOssClient { + client: QiniuClient; + + join(...strs: string[]) { + const str = super.join(...strs); + if (str.startsWith("/")) { + return str.substring(1); + } + return str; + } + async init() { + const qiniuAccess = await this.ctx.accessService.getById(this.access.accessId); + this.client = new QiniuClient({ + access: qiniuAccess, + logger: this.logger, + http: this.ctx.utils.http, + }); + } + + async download(fileName: string, savePath: string): Promise { + const path = this.join(this.rootDir, fileName); + await this.client.downloadFile(this.access.bucket, path, savePath); + } + async listDir(dir: string): Promise { + const path = this.join(this.rootDir, dir); + const res = await this.client.listDir(this.access.bucket, path); + return res.items.map(item => { + return { + path: item.key, + size: item.fsize, + //ns ,纳秒,去掉低4位 为毫秒 + lastModified: Math.floor(item.putTime / 10000), + }; + }); + } + async upload(filePath: string, fileContent: Buffer | string) { + const path = this.join(this.rootDir, filePath); + await this.client.uploadFile(this.access.bucket, path, fileContent); + } + + async remove(filePath: string, opts?: { joinRootDir?: boolean }) { + if (opts?.joinRootDir !== false) { + filePath = this.join(this.rootDir, filePath); + } + await this.client.removeFile(this.access.bucket, filePath); + } +} diff --git a/packages/plugins/plugin-lib/src/oss/impls/s3.ts b/packages/plugins/plugin-lib/src/oss/impls/s3.ts new file mode 100644 index 00000000..644a01ff --- /dev/null +++ b/packages/plugins/plugin-lib/src/oss/impls/s3.ts @@ -0,0 +1,98 @@ +import { BaseOssClient, OssFileItem } from "../api.js"; +import path from "node:path"; +import { S3Access } from "../../s3/access.js"; +import fs from "fs"; +import dayjs from "dayjs"; + +export default class S3OssClientImpl extends BaseOssClient { + client: any; + join(...strs: string[]) { + const str = super.join(...strs); + if (str.startsWith("/")) { + return str.substring(1); + } + return str; + } + async init() { + // import { S3Client } from "@aws-sdk/client-s3"; + //@ts-ignore + const { S3Client } = await import("@aws-sdk/client-s3"); + this.client = new S3Client({ + forcePathStyle: true, + //@ts-ignore + s3ForcePathStyle: true, + credentials: { + accessKeyId: this.access.accessKeyId, // 默认 MinIO 访问密钥 + secretAccessKey: this.access.secretAccessKey, // 默认 MinIO 秘密密钥 + }, + region: "us-east-1", + endpoint: this.access.endpoint, + }); + } + + async download(filePath: string, savePath: string): Promise { + // @ts-ignore + const { GetObjectCommand } = await import("@aws-sdk/client-s3"); + const key = path.join(this.rootDir, filePath); + const params = { + Bucket: this.access.bucket, // The name of the bucket. For example, 'sample_bucket_101'. + Key: key, // The name of the object. For example, 'sample_upload.txt'. + }; + const res = await this.client.send(new GetObjectCommand({ ...params })); + const fileContent = fs.createWriteStream(savePath); + res.Body.pipe(fileContent); + + this.logger.info(`文件下载成功: ${savePath}`); + } + + async listDir(dir: string): Promise { + // @ts-ignore + const { ListObjectsCommand } = await import("@aws-sdk/client-s3"); + const dirKey = this.join(this.rootDir, dir); + const params = { + Bucket: this.access.bucket, // The name of the bucket. For example, 'sample_bucket_101'. + Prefix: dirKey, // The name of the object. For example, 'sample_upload.txt'. + }; + const res = await this.client.send(new ListObjectsCommand({ ...params })); + return res.Contents.map(item => { + return { + path: item.Key, + size: item.Size, + lastModified: dayjs(item.LastModified).valueOf(), + }; + }); + } + async upload(filePath: string, fileContent: Buffer | string) { + // @ts-ignore + const { PutObjectCommand } = await import("@aws-sdk/client-s3"); + const key = path.join(this.rootDir, filePath); + this.logger.info(`开始上传文件: ${key}`); + const params = { + Bucket: this.access.bucket, // The name of the bucket. For example, 'sample_bucket_101'. + Key: key, // The name of the object. For example, 'sample_upload.txt'. + }; + if (typeof fileContent === "string") { + fileContent = fs.createReadStream(fileContent) as any; + } + await this.client.send(new PutObjectCommand({ Body: fileContent, ...params })); + + this.logger.info(`文件上传成功: ${filePath}`); + } + + async remove(filePath: string, opts?: { joinRootDir?: boolean }) { + if (opts?.joinRootDir !== false) { + filePath = this.join(this.rootDir, filePath); + } + const key = filePath; + // @ts-ignore + const { DeleteObjectCommand } = await import("@aws-sdk/client-s3"); + await this.client.send( + new DeleteObjectCommand({ + Bucket: this.access.bucket, + Key: key, + }) + ); + + this.logger.info(`文件删除成功: ${key}`); + } +} diff --git a/packages/plugins/plugin-lib/src/oss/impls/sftp.ts b/packages/plugins/plugin-lib/src/oss/impls/sftp.ts new file mode 100644 index 00000000..79b80e16 --- /dev/null +++ b/packages/plugins/plugin-lib/src/oss/impls/sftp.ts @@ -0,0 +1,82 @@ +import { BaseOssClient, OssFileItem } from "../api.js"; +import path from "path"; +import os from "os"; +import fs from "fs"; +import { SftpAccess, SshAccess, SshClient } from "../../ssh/index.js"; + +export default class SftpOssClientImpl extends BaseOssClient { + async download(fileName: string, savePath: string): Promise { + const path = this.join(this.rootDir, fileName); + const client = new SshClient(this.logger); + const access = await this.ctx.accessService.getById(this.access.sshAccess); + await client.download({ + connectConf: access, + filePath: path, + savePath, + }); + } + + async listDir(dir: string): Promise { + const path = this.join(this.rootDir, dir); + const client = new SshClient(this.logger); + const access = await this.ctx.accessService.getById(this.access.sshAccess); + const res = await client.listDir({ + connectConf: access, + dir: path, + }); + + return res.map(item => { + return { + path: this.join(path, item.filename), + size: item.size, + lastModified: item.attrs.atime * 1000, + }; + }); + } + async upload(filePath: string, fileContent: Buffer | string) { + let tmpFilePath = fileContent as string; + if (typeof fileContent !== "string") { + tmpFilePath = path.join(os.tmpdir(), "cert", "oss", filePath); + const dir = path.dirname(tmpFilePath); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } + fs.writeFileSync(tmpFilePath, fileContent); + } + + const access = await this.ctx.accessService.getById(this.access.sshAccess); + const key = this.join(this.rootDir, filePath); + try { + const client = new SshClient(this.logger); + await client.uploadFiles({ + connectConf: access, + mkdirs: true, + transports: [ + { + localPath: tmpFilePath, + remotePath: key, + }, + ], + uploadType: "sftp", + opts: { + mode: this.access?.fileMode ?? undefined, + }, + }); + } finally { + // Remove temp file + fs.unlinkSync(tmpFilePath); + } + } + + async remove(filePath: string, opts?: { joinRootDir?: boolean }) { + const access = await this.ctx.accessService.getById(this.access.sshAccess); + const client = new SshClient(this.logger); + if (opts?.joinRootDir !== false) { + filePath = this.join(this.rootDir, filePath); + } + await client.removeFiles({ + connectConf: access, + files: [filePath], + }); + } +} diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/impls/ssh.ts b/packages/plugins/plugin-lib/src/oss/impls/ssh.ts similarity index 55% rename from packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/impls/ssh.ts rename to packages/plugins/plugin-lib/src/oss/impls/ssh.ts index ccedbabb..c2f23981 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/uploads/impls/ssh.ts +++ b/packages/plugins/plugin-lib/src/oss/impls/ssh.ts @@ -1,10 +1,20 @@ -import { BaseHttpChallengeUploader } from "../api.js"; -import { SshAccess, SshClient } from "@certd/plugin-lib"; +import { BaseOssClient, OssClientRemoveByOpts, OssFileItem } from "../api.js"; import path from "path"; import os from "os"; import fs from "fs"; +import { SshAccess, SshClient } from "../../ssh/index.js"; -export class SshHttpChallengeUploader extends BaseHttpChallengeUploader { +//废弃 +export default class SshOssClientImpl extends BaseOssClient { + download(fileName: string, savePath: string): Promise { + throw new Error("Method not implemented."); + } + removeBy(removeByOpts: OssClientRemoveByOpts): Promise { + throw new Error("Method not implemented."); + } + listDir(dir: string): Promise { + throw new Error("Method not implemented."); + } async upload(filePath: string, fileContent: Buffer) { const tmpFilePath = path.join(os.tmpdir(), "cert", "http", filePath); @@ -34,12 +44,14 @@ export class SshHttpChallengeUploader extends BaseHttpChallengeUploader { + client: TencentCosClient; + + join(...strs: string[]) { + const str = super.join(...strs); + if (str.startsWith("/")) { + return str.substring(1); + } + return str; + } + async init() { + const access = await this.ctx.accessService.getById(this.access.accessId); + this.client = new TencentCosClient({ + access: access, + logger: this.logger, + region: this.access.region, + bucket: this.access.bucket, + }); + } + async download(filePath: string, savePath: string): Promise { + const key = this.join(this.rootDir, filePath); + await this.client.downloadFile(key, savePath); + } + + async listDir(dir: string): Promise { + const dirKey = this.join(this.rootDir, dir) + "/"; + // @ts-ignore + const res: any[] = await this.client.listDir(dirKey); + return res.map(item => { + return { + path: item.Key, + size: item.Size, + lastModified: dayjs(item.LastModified).valueOf(), + }; + }); + } + async upload(filePath: string, fileContent: Buffer | string) { + const key = this.join(this.rootDir, filePath); + await this.client.uploadFile(key, fileContent); + this.logger.info(`文件上传成功: ${filePath}`); + } + + async remove(filePath: string, opts?: { joinRootDir?: boolean }) { + if (opts?.joinRootDir !== false) { + filePath = this.join(this.rootDir, filePath); + } + await this.client.removeFile(filePath); + this.logger.info(`文件删除成功: ${filePath}`); + } +} diff --git a/packages/plugins/plugin-lib/src/oss/index.ts b/packages/plugins/plugin-lib/src/oss/index.ts new file mode 100644 index 00000000..b3414622 --- /dev/null +++ b/packages/plugins/plugin-lib/src/oss/index.ts @@ -0,0 +1,2 @@ +export * from "./factory.js"; +export * from "./api.js"; diff --git a/packages/plugins/plugin-lib/src/qiniu/lib/sdk.ts b/packages/plugins/plugin-lib/src/qiniu/lib/sdk.ts index 393838fe..39a22946 100644 --- a/packages/plugins/plugin-lib/src/qiniu/lib/sdk.ts +++ b/packages/plugins/plugin-lib/src/qiniu/lib/sdk.ts @@ -1,5 +1,6 @@ -import { HttpClient, ILogger } from "@certd/basic"; +import { HttpClient, ILogger, utils } from "@certd/basic"; import { QiniuAccess } from "../access.js"; +import fs from "fs"; export type QiniuCertInfo = { key: string; @@ -98,7 +99,7 @@ export class QiniuClient { }); } - async uploadFile(bucket: string, key: string, content: Buffer) { + async uploadFile(bucket: string, key: string, content: Buffer | string) { const sdk = await import("qiniu"); const qiniu = sdk.default; const mac = new qiniu.auth.digest.Mac(this.access.accessKey, this.access.secretKey); @@ -111,8 +112,15 @@ export class QiniuClient { const config = new qiniu.conf.Config(); const formUploader = new qiniu.form_up.FormUploader(config); const putExtra = new qiniu.form_up.PutExtra(); - // 文件上传 - const { data, resp } = await formUploader.put(uploadToken, key, content, putExtra); + let res: any = {}; + if (typeof content === "string") { + const readableStream = fs.createReadStream(content); + res = await formUploader.putStream(uploadToken, key, readableStream, putExtra); + } else { + // 文件上传 + res = await formUploader.put(uploadToken, key, content, putExtra); + } + const { data, resp } = res; if (resp.statusCode === 200) { this.logger.info("文件上传成功:" + key); return data; @@ -123,12 +131,7 @@ export class QiniuClient { } async removeFile(bucket: string, key: string) { - const sdk = await import("qiniu"); - const qiniu = sdk.default; - const mac = new qiniu.auth.digest.Mac(this.access.accessKey, this.access.secretKey); - const config = new qiniu.conf.Config(); - config.useHttpsDomain = true; - const bucketManager = new qiniu.rs.BucketManager(mac, config); + const bucketManager = await this.getBucketManager(); const { resp } = await bucketManager.delete(bucket, key); @@ -139,4 +142,39 @@ export class QiniuClient { throw new Error("删除失败:" + JSON.stringify(resp)); } } + + async downloadFile(bucket: string, path: string, savePath: string) { + const bucketManager = await this.getBucketManager(); + const privateBucketDomain = `http://${bucket}.qiniudn.com`; + const deadline = Math.floor(Date.now() / 1000) + 3600; // 1小时过期 + const privateDownloadUrl = bucketManager.privateDownloadUrl(privateBucketDomain, path, deadline); + + await utils.request.download({ + http: this.http, + logger: this.logger, + config: { + url: privateDownloadUrl, + method: "get", + }, + savePath, + }); + } + + private async getBucketManager() { + const sdk = await import("qiniu"); + const qiniu = sdk.default; + const mac = new qiniu.auth.digest.Mac(this.access.accessKey, this.access.secretKey); + const config = new qiniu.conf.Config(); + config.useHttpsDomain = true; + return new qiniu.rs.BucketManager(mac, config); + } + + async listDir(bucket: string, path: string) { + const bucketManager = await this.getBucketManager(); + const res = await bucketManager.listPrefix(bucket, { + prefix: path, + limit: 1000, + }); + return res.data; + } } diff --git a/packages/plugins/plugin-lib/src/s3/access.ts b/packages/plugins/plugin-lib/src/s3/access.ts new file mode 100644 index 00000000..3db87d38 --- /dev/null +++ b/packages/plugins/plugin-lib/src/s3/access.ts @@ -0,0 +1,87 @@ +import { AccessInput, BaseAccess, IsAccess } from "@certd/pipeline"; + +/** + * 这个注解将注册一个授权配置 + * 在certd的后台管理系统中,用户可以选择添加此类型的授权 + */ +@IsAccess({ + name: "s3", + title: "s3/minio授权", + desc: "S3/minio oss授权", + icon: "mdi:folder-upload-outline", +}) +export class S3Access extends BaseAccess { + @AccessInput({ + title: "endpoint", + component: { + placeholder: "http://xxxxxx:9000", + name: "a-input", + vModel: "value", + }, + helper: "Minio的地址,如果是aws s3 则无需填写", + required: false, + }) + endpoint!: string; + + /** + * const minioClient = new S3Client({ + * endpoint: "http://localhost:9000", + * forcePathStyle: true, + * credentials: { + * accessKeyId: "minioadmin", // 默认 MinIO 访问密钥 + * secretAccessKey: "minioadmin", // 默认 MinIO 秘密密钥 + * }, + * region: "us-east-1", + * }); + */ + + @AccessInput({ + title: "accessKeyId", + component: { + placeholder: "accessKeyId", + }, + helper: "accessKeyId", + required: true, + }) + accessKeyId!: string; + + @AccessInput({ + title: "secretAccessKey", + component: { + placeholder: "secretAccessKey", + component: { + name: "a-input", + vModel: "value", + }, + }, + helper: "secretAccessKey", + encrypt: true, + required: true, + }) + secretAccessKey!: string; + + @AccessInput({ + title: "地区", + value: "us-east-1", + component: { + name: "a-input", + vModel: "value", + }, + helper: "region", + required: true, + }) + region!: string; + + @AccessInput({ + title: "存储桶", + component: { + name: "a-input", + vModel: "value", + }, + helper: "bucket 名称", + required: true, + }) + bucket!: string; +} + +new S3Access(); diff --git a/packages/plugins/plugin-lib/src/s3/index.ts b/packages/plugins/plugin-lib/src/s3/index.ts new file mode 100644 index 00000000..655094d0 --- /dev/null +++ b/packages/plugins/plugin-lib/src/s3/index.ts @@ -0,0 +1 @@ +export * from "./access.js"; diff --git a/packages/plugins/plugin-lib/src/ssh/ssh.ts b/packages/plugins/plugin-lib/src/ssh/ssh.ts index 1648c1e4..cce23731 100644 --- a/packages/plugins/plugin-lib/src/ssh/ssh.ts +++ b/packages/plugins/plugin-lib/src/ssh/ssh.ts @@ -136,6 +136,20 @@ export class AsyncSsh2Client { }); } + async listDir(options: { sftp: any; remotePath: string }) { + const { sftp, remotePath } = options; + return new Promise((resolve, reject) => { + this.logger.info(`listDir:${remotePath}`); + sftp.readdir(remotePath, (err: Error, list: any) => { + if (err) { + reject(err); + return; + } + resolve(list); + }); + }); + } + async unlink(options: { sftp: any; remotePath: string }) { const { sftp, remotePath } = options; return new Promise((resolve, reject) => { @@ -283,6 +297,28 @@ export class AsyncSsh2Client { } return proxy; } + + async download(param: { remotePath: string; savePath: string; sftp: any }) { + return new Promise((resolve, reject) => { + const { remotePath, savePath, sftp } = param; + sftp.fastGet( + remotePath, + savePath, + { + step: (transferred: any, chunk: any, total: any) => { + this.logger.info(`${transferred} / ${total}`); + }, + }, + (err: any) => { + if (err) { + reject(err); + } else { + resolve({}); + } + } + ); + }); + } } export class SshClient { @@ -329,17 +365,17 @@ export class SshClient { } } - if (options.uploadType === "sftp") { - const sftp = await conn.getSftp(); - for (const transport of transports) { - await conn.fastPut({ sftp, ...transport, opts }); - } - } else { + if (options.uploadType === "scp") { //scp for (const transport of transports) { await this.scpUpload({ conn, ...transport, opts }); await new Promise(resolve => setTimeout(resolve, 1000)); } + } else { + const sftp = await conn.getSftp(); + for (const transport of transports) { + await conn.fastPut({ sftp, ...transport, opts }); + } } this.logger.info("文件全部上传成功"); @@ -359,25 +395,29 @@ export class SshClient { if (err) { return reject(err); } - // 准备 SCP 协议头 - const fileStats = fs.statSync(localPath); - const fileName = path.basename(localPath); + try { + // 准备 SCP 协议头 + const fileStats = fs.statSync(localPath); + const fileName = path.basename(localPath); - // SCP 协议格式:C[权限] [文件大小] [文件名]\n - stream.write(`C0644 ${fileStats.size} ${fileName}\n`); + // SCP 协议格式:C[权限] [文件大小] [文件名]\n + stream.write(`C0644 ${fileStats.size} ${fileName}\n`); - // 通过管道传输文件 - fs.createReadStream(localPath) - .on("error", e => { - this.logger.info("read stream error", e); - reject(e); - }) - .pipe(stream) - .on("finish", async () => { - this.logger.info(`上传完成:${localPath} => ${remotePath}`); - resolve(true); - }) - .on("error", reject); + // 通过管道传输文件 + fs.createReadStream(localPath) + .on("error", e => { + this.logger.info("read stream error", e); + reject(e); + }) + .pipe(stream) + .on("finish", async () => { + this.logger.info(`上传完成:${localPath} => ${remotePath}`); + resolve(true); + }) + .on("error", reject); + } catch (e) { + reject(e); + } } ); } catch (e) { @@ -526,4 +566,31 @@ export class SshClient { conn.end(); } } + + async listDir(param: { connectConf: any; dir: string }) { + return await this._call({ + connectConf: param.connectConf, + callable: async (conn: AsyncSsh2Client) => { + const sftp = await conn.getSftp(); + return await conn.listDir({ + sftp, + remotePath: param.dir, + }); + }, + }); + } + + async download(param: { connectConf: any; filePath: string; savePath: string }) { + return await this._call({ + connectConf: param.connectConf, + callable: async (conn: AsyncSsh2Client) => { + const sftp = await conn.getSftp(); + return await conn.download({ + sftp, + remotePath: param.filePath, + savePath: param.savePath, + }); + }, + }); + } } diff --git a/packages/plugins/plugin-lib/src/tencent/lib/cos-client.ts b/packages/plugins/plugin-lib/src/tencent/lib/cos-client.ts index 91bf0b51..cfa72acb 100644 --- a/packages/plugins/plugin-lib/src/tencent/lib/cos-client.ts +++ b/packages/plugins/plugin-lib/src/tencent/lib/cos-client.ts @@ -1,5 +1,6 @@ import { TencentAccess } from "../access.js"; import { ILogger } from "@certd/basic"; +import fs from "fs"; export class TencentCosClient { access: TencentAccess; @@ -23,15 +24,19 @@ export class TencentCosClient { return new sdk.default(clientConfig); } - async uploadFile(key: string, file: Buffer) { + async uploadFile(key: string, file: Buffer | string) { const cos = await this.getCosClient(); return new Promise((resolve, reject) => { + let readableStream = file as any; + if (typeof file === "string") { + readableStream = fs.createReadStream(file); + } cos.putObject( { Bucket: this.bucket /* 必须 */, Region: this.region /* 必须 */, Key: key /* 必须 */, - Body: file, // 上传文件对象 + Body: readableStream, // 上传文件对象 onProgress: function (progressData) { console.log(JSON.stringify(progressData)); }, @@ -66,4 +71,47 @@ export class TencentCosClient { ); }); } + + async downloadFile(key: string, savePath: string) { + const cos = await this.getCosClient(); + const writeStream = fs.createWriteStream(savePath); + return new Promise((resolve, reject) => { + cos.getObject( + { + Bucket: this.bucket, + Region: this.region, + Key: key, + Output: writeStream, + }, + function (err, data) { + if (err) { + reject(err); + return; + } + resolve(data); + } + ); + }); + } + + async listDir(dirKey: string) { + const cos = await this.getCosClient(); + return new Promise((resolve, reject) => { + cos.getBucket( + { + Bucket: this.bucket, + Region: this.region, + Prefix: dirKey, + MaxKeys: 1000, + }, + function (err, data) { + if (err) { + reject(err); + return; + } + resolve(data.Contents); + } + ); + }); + } } diff --git a/packages/ui/certd-client/.env b/packages/ui/certd-client/.env index d4e9e56e..f9fcd907 100644 --- a/packages/ui/certd-client/.env +++ b/packages/ui/certd-client/.env @@ -1,12 +1,12 @@ -VITE_APP_API=/api +VITE_APP_API=api #登录与权限关闭 VITE_APP_PM_ENABLED=true VITE_APP_TITLE=Certd VITE_APP_SLOGAN=让你的证书永不过期 -VITE_APP_COPYRIGHT_YEAR=2021-2024 +VITE_APP_COPYRIGHT_YEAR=2021-2025 VITE_APP_COPYRIGHT_NAME=handsfree.work VITE_APP_COPYRIGHT_URL=https://certd.handsfree.work -VITE_APP_LOGO=/static/images/logo/logo.svg -VITE_APP_LOGIN_LOGO=/static/images/logo/rect-black.svg +VITE_APP_LOGO=static/images/logo/logo.svg +VITE_APP_LOGIN_LOGO=static/images/logo/rect-black.svg VITE_APP_PROJECT_PATH=https://github.com/certd/certd VITE_APP_NAMESPACE=fs \ No newline at end of file diff --git a/packages/ui/certd-client/.env.production b/packages/ui/certd-client/.env.production index dde579e5..0eeba503 100644 --- a/packages/ui/certd-client/.env.production +++ b/packages/ui/certd-client/.env.production @@ -1,3 +1,3 @@ -VITE_APP_API=/api +VITE_APP_API=api #登录与权限开启 VITE_APP_PM_ENABLED=true diff --git a/packages/ui/certd-client/CHANGELOG.md b/packages/ui/certd-client/CHANGELOG.md index 614a96a8..f6ce1a68 100644 --- a/packages/ui/certd-client/CHANGELOG.md +++ b/packages/ui/certd-client/CHANGELOG.md @@ -3,6 +3,19 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26) + +### Bug Fixes + +* 服务器时间获取不准确的bug ([5d10cbf](https://github.com/certd/certd/commit/5d10cbf18daf94a90a7551641a3b13e3c5fec611)) +* 修复复制流水线无效的bug ([3df20a9](https://github.com/certd/certd/commit/3df20a924f32970b052e2588ea20de095f0ea693)) +* 修复token过期后,疯狂打印token过期信息的bug ([50a5fa1](https://github.com/certd/certd/commit/50a5fa15bb240a125bbc91d2ce1ff3c835888a77)) + +### Performance Improvements + +* 数据库备份支持oss ([308d460](https://github.com/certd/certd/commit/308d4600efe2002f199c33b4594d3071784e58ea)) +* 支持反向代理增加contextPath路径 ([0088929](https://github.com/certd/certd/commit/0088929622160cc922995de9a563e8061686ff34)) + ## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22) ### Performance Improvements diff --git a/packages/ui/certd-client/index.html b/packages/ui/certd-client/index.html index 2130a2f4..1740a304 100644 --- a/packages/ui/certd-client/index.html +++ b/packages/ui/certd-client/index.html @@ -2,11 +2,11 @@ - + Loading - - + +
diff --git a/packages/ui/certd-client/package.json b/packages/ui/certd-client/package.json index 2930c792..4c6fc4f3 100644 --- a/packages/ui/certd-client/package.json +++ b/packages/ui/certd-client/package.json @@ -1,6 +1,6 @@ { "name": "@certd/ui-client", - "version": "1.33.7", + "version": "1.33.8", "private": true, "scripts": { "dev": "vite --open", @@ -101,8 +101,8 @@ "zod-defaults": "^0.1.3" }, "devDependencies": { - "@certd/lib-iframe": "^1.33.7", - "@certd/pipeline": "^1.33.7", + "@certd/lib-iframe": "^1.33.8", + "@certd/pipeline": "^1.33.8", "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-node-resolve": "^15.2.3", "@types/chai": "^4.3.12", diff --git a/packages/ui/certd-client/src/api/service.ts b/packages/ui/certd-client/src/api/service.ts index 3fe0d4ca..da8eb16b 100644 --- a/packages/ui/certd-client/src/api/service.ts +++ b/packages/ui/certd-client/src/api/service.ts @@ -120,7 +120,7 @@ function createService() { errorLog(error, error?.response?.config?.showErrorNotify); if (status === 401) { const userStore = useUserStore(); - userStore.logout(); + userStore.logout(true, true); } if (error?.config?.onError) { diff --git a/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-tip.vue b/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-tip.vue index 64fab800..2b58f807 100644 --- a/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-tip.vue +++ b/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/cname-tip.vue @@ -21,6 +21,6 @@ const props = defineProps<{ }>(); const nslookupCmd = computed(() => { - return `nslookup -qa=txt _acme-challenge.${props.record.domain}`; + return `nslookup -q=txt _acme-challenge.${props.record.domain}`; }); diff --git a/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/http-verify-plan.vue b/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/http-verify-plan.vue index 624ee671..f0c0bebd 100644 --- a/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/http-verify-plan.vue +++ b/packages/ui/certd-client/src/components/plugins/cert/domains-verify-plan-editor/http-verify-plan.vue @@ -75,6 +75,7 @@ const uploaderTypeDict = dict({ { label: "阿里云OSS", value: "alioss" }, { label: "腾讯云COS", value: "tencentcos" }, { label: "七牛OSS", value: "qiniuoss" }, + { label: "S3/Minio", value: "s3" }, { label: "SSH(已废弃,请选择SFTP方式)", value: "ssh", disabled: true }, ], }); diff --git a/packages/ui/certd-client/src/router/source/modules/certd.ts b/packages/ui/certd-client/src/router/source/modules/certd.ts index a9c992be..2d6bd6e8 100644 --- a/packages/ui/certd-client/src/router/source/modules/certd.ts +++ b/packages/ui/certd-client/src/router/source/modules/certd.ts @@ -98,17 +98,17 @@ export const certdResources = [ keepAlive: true, }, }, - { - title: "子域名托管设置", - name: "SubDomain", - path: "/certd/pipeline/subDomain", - component: "/certd/pipeline/sub-domain/index.vue", - meta: { - icon: "material-symbols:approval-delegation-outline", - auth: true, - keepAlive: true, - }, - }, + // { + // title: "子域名托管设置", + // name: "SubDomain", + // path: "/certd/pipeline/subDomain", + // component: "/certd/pipeline/sub-domain/index.vue", + // meta: { + // icon: "material-symbols:approval-delegation-outline", + // auth: true, + // keepAlive: true, + // }, + // }, { title: "流水线分组管理", name: "PipelineGroupManager", diff --git a/packages/ui/certd-client/src/store/settings/index.ts b/packages/ui/certd-client/src/store/settings/index.ts index 3222f557..d1e2ec29 100644 --- a/packages/ui/certd-client/src/store/settings/index.ts +++ b/packages/ui/certd-client/src/store/settings/index.ts @@ -161,10 +161,10 @@ export const useSettingStore = defineStore({ //@ts-ignore if (this.isComm) { if (siteInfo.logo) { - siteInfo.logo = `/api/basic/file/download?key=${siteInfo.logo}`; + siteInfo.logo = `api/basic/file/download?key=${siteInfo.logo}`; } if (siteInfo.loginLogo) { - siteInfo.loginLogo = `/api/basic/file/download?key=${siteInfo.loginLogo}`; + siteInfo.loginLogo = `api/basic/file/download?key=${siteInfo.loginLogo}`; } } this.siteInfo = _.merge({}, defaultSiteInfo, siteInfo); diff --git a/packages/ui/certd-client/src/store/user/index.ts b/packages/ui/certd-client/src/store/user/index.ts index 7f12878b..9010cebc 100644 --- a/packages/ui/certd-client/src/store/user/index.ts +++ b/packages/ui/certd-client/src/store/user/index.ts @@ -108,10 +108,12 @@ export const useUserStore = defineStore({ /** * @description: logout */ - async logout(goLogin = true) { + async logout(goLogin = true, from401 = false) { this.resetState(); resetAllStores(); - await UserApi.logout(); //主要是清空cookie + if (!from401) { + await UserApi.logout(); //主要是清空cookie + } goLogin && router.push("/login"); mitter.emit("app.logout"); }, diff --git a/packages/ui/certd-client/src/views/certd/mine/user-profile.vue b/packages/ui/certd-client/src/views/certd/mine/user-profile.vue index dd90050c..72d048bd 100644 --- a/packages/ui/certd-client/src/views/certd/mine/user-profile.vue +++ b/packages/ui/certd-client/src/views/certd/mine/user-profile.vue @@ -7,7 +7,7 @@ {{ userInfo.username }} - + {{ userInfo.username }} diff --git a/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx b/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx index d16b388e..2839a731 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/pipeline/crud.tsx @@ -120,6 +120,7 @@ export default function ({ crudExpose, context: { groupDictRef, selectedRowKeys function onDialogOpen(opt: any) { const searchForm = crudExpose.getSearchValidatedFormData(); opt.initialForm = { + ...opt.initialForm, groupId: searchForm.groupId, }; } diff --git a/packages/ui/certd-client/src/views/framework/home/dashboard/index.vue b/packages/ui/certd-client/src/views/framework/home/dashboard/index.vue index f939db99..a542d407 100644 --- a/packages/ui/certd-client/src/views/framework/home/dashboard/index.vue +++ b/packages/ui/certd-client/src/views/framework/home/dashboard/index.vue @@ -3,7 +3,7 @@
- + {{ userInfo.username }} @@ -182,7 +182,7 @@ const userInfo: ComputedRef = computed(() => { return userStore.getUserInfo; }); const now = computed(() => { - const serverTime = settingStore.app.deltaTime + Date.now(); + const serverTime = Date.now() - settingStore.app.deltaTime; return dayjs(serverTime).format("YYYY-MM-DD HH:mm:ss"); }); diff --git a/packages/ui/certd-client/src/views/framework/login/image-code.vue b/packages/ui/certd-client/src/views/framework/login/image-code.vue index f24a6c96..9ac1dae8 100644 --- a/packages/ui/certd-client/src/views/framework/login/image-code.vue +++ b/packages/ui/certd-client/src/views/framework/login/image-code.vue @@ -28,7 +28,7 @@ function onChange(value: string) { const imageCodeUrl = ref(); function resetImageCode() { const randomStr = nanoid(10); - let url = "/api/basic/code/captcha"; + let url = "api/basic/code/captcha"; imageCodeUrl.value = url + "?randomStr=" + randomStr; emit("update:randomStr", randomStr); } diff --git a/packages/ui/certd-client/src/views/sys/authority/user/crud.tsx b/packages/ui/certd-client/src/views/sys/authority/user/crud.tsx index 5fe4af49..f851731f 100644 --- a/packages/ui/certd-client/src/views/sys/authority/user/crud.tsx +++ b/packages/ui/certd-client/src/views/sys/authority/user/crud.tsx @@ -164,7 +164,7 @@ export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOpti width: "auto", }, buildUrl(key: string) { - return `/api/basic/file/download?&key=` + key; + return `api/basic/file/download?&key=` + key; }, }, }, @@ -190,7 +190,7 @@ export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOpti }, }, buildUrl(key: string) { - return `/api/basic/file/download?&key=` + key; + return `api/basic/file/download?&key=` + key; }, }, }, diff --git a/packages/ui/certd-client/vite.config.ts b/packages/ui/certd-client/vite.config.ts index 2bf69c22..33322f01 100644 --- a/packages/ui/certd-client/vite.config.ts +++ b/packages/ui/certd-client/vite.config.ts @@ -21,9 +21,9 @@ export default ({ command, mode }) => { const env = loadEnv(mode, process.cwd()); const devServerFs: any = {}; const devAlias: any[] = []; - const base = "/"; + const base = "./"; // if (mode.startsWith("dev")) { - // base = "/dev"; + // base = "./"; // } return { base: base, @@ -36,6 +36,7 @@ export default ({ command, mode }) => { data: { title: env.VITE_APP_TITLE, projectPath: env.VITE_APP_PROJECT_PATH, + version: env.VITE_APP_VERSION, }, }, }), diff --git a/packages/ui/certd-server/CHANGELOG.md b/packages/ui/certd-server/CHANGELOG.md index 7c6de581..9b52fcfb 100644 --- a/packages/ui/certd-server/CHANGELOG.md +++ b/packages/ui/certd-server/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.33.8](https://github.com/certd/certd/compare/v1.33.7...v1.33.8) (2025-04-26) + +### Performance Improvements + +* 数据库备份支持oss ([308d460](https://github.com/certd/certd/commit/308d4600efe2002f199c33b4594d3071784e58ea)) +* 支持反向代理增加contextPath路径 ([0088929](https://github.com/certd/certd/commit/0088929622160cc922995de9a563e8061686ff34)) +* 支持中文域名 ([162ebfd](https://github.com/certd/certd/commit/162ebfd4e0c25727efb33952d3bbf7420a02e2c3)) + ## [1.33.7](https://github.com/certd/certd/compare/v1.33.6...v1.33.7) (2025-04-22) ### Performance Improvements diff --git a/packages/ui/certd-server/package.json b/packages/ui/certd-server/package.json index 4b5cf377..d320b0f0 100644 --- a/packages/ui/certd-server/package.json +++ b/packages/ui/certd-server/package.json @@ -1,6 +1,6 @@ { "name": "@certd/ui-server", - "version": "1.33.7", + "version": "1.33.8", "description": "fast-server base midway", "private": true, "type": "module", @@ -38,19 +38,19 @@ "@aws-sdk/client-acm": "^3.699.0", "@aws-sdk/client-cloudfront": "^3.699.0", "@aws-sdk/client-s3": "^3.705.0", - "@certd/acme-client": "^1.33.7", - "@certd/basic": "^1.33.7", - "@certd/commercial-core": "^1.33.7", - "@certd/jdcloud": "^1.33.7", - "@certd/lib-huawei": "^1.33.7", - "@certd/lib-k8s": "^1.33.7", - "@certd/lib-server": "^1.33.7", - "@certd/midway-flyway-js": "^1.33.7", - "@certd/pipeline": "^1.33.7", - "@certd/plugin-cert": "^1.33.7", - "@certd/plugin-lib": "^1.33.7", - "@certd/plugin-plus": "^1.33.7", - "@certd/plus-core": "^1.33.7", + "@certd/acme-client": "^1.33.8", + "@certd/basic": "^1.33.8", + "@certd/commercial-core": "^1.33.8", + "@certd/jdcloud": "^1.33.8", + "@certd/lib-huawei": "^1.33.8", + "@certd/lib-k8s": "^1.33.8", + "@certd/lib-server": "^1.33.8", + "@certd/midway-flyway-js": "^1.33.8", + "@certd/pipeline": "^1.33.8", + "@certd/plugin-cert": "^1.33.8", + "@certd/plugin-lib": "^1.33.8", + "@certd/plugin-plus": "^1.33.8", + "@certd/plus-core": "^1.33.8", "@corsinvest/cv4pve-api-javascript": "^8.3.0", "@huaweicloud/huaweicloud-sdk-cdn": "^3.1.120", "@huaweicloud/huaweicloud-sdk-core": "^3.1.120", diff --git a/packages/ui/certd-server/src/modules/cname/service/common-provider.ts b/packages/ui/certd-server/src/modules/cname/service/common-provider.ts index c4913074..5125d269 100644 --- a/packages/ui/certd-server/src/modules/cname/service/common-provider.ts +++ b/packages/ui/certd-server/src/modules/cname/service/common-provider.ts @@ -1,5 +1,5 @@ -import { CreateRecordOptions, DnsProviderContext, IDnsProvider, RemoveRecordOptions } from '@certd/plugin-cert'; -import { PlusService } from '@certd/lib-server'; +import {CreateRecordOptions, DnsProviderContext, IDnsProvider, RemoveRecordOptions} from '@certd/plugin-cert'; +import {PlusService} from '@certd/lib-server'; export type CommonCnameProvider = { id: number; @@ -24,7 +24,13 @@ export class CommonDnsProvider implements IDnsProvider { this.plusService = opts.plusService; } - async onInstance() {} + usePunyCode(): boolean { + return false + } + + async onInstance() { + } + async createRecord(options: CreateRecordOptions) { if (!this.config.domain.endsWith(options.domain)) { throw new Error('cname服务域名不匹配'); @@ -45,6 +51,7 @@ export class CommonDnsProvider implements IDnsProvider { }); return res; } + async removeRecord(options: RemoveRecordOptions) { const res = await this.plusService.requestWithToken({ url: '/activation/certd/cname/recordRemove', @@ -60,6 +67,7 @@ export class CommonDnsProvider implements IDnsProvider { }); return res; } + setCtx(ctx: DnsProviderContext): void { this.ctx = ctx; } diff --git a/packages/ui/certd-server/src/plugins/plugin-aliyun/dns-provider/aliyun-dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-aliyun/dns-provider/aliyun-dns-provider.ts index 8849cbc7..a3131b57 100644 --- a/packages/ui/certd-server/src/plugins/plugin-aliyun/dns-provider/aliyun-dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-aliyun/dns-provider/aliyun-dns-provider.ts @@ -87,15 +87,13 @@ export class AliyunDnsProvider extends AbstractDnsProvider { // } async createRecord(options: CreateRecordOptions): Promise { - const { fullRecord, value, type, domain } = options; + const { fullRecord,hostRecord, value, type, domain } = options; this.logger.info('添加域名解析:', fullRecord, value, domain); // const domain = await this.matchDomain(fullRecord); - const rr = fullRecord.replace('.' + domain, ''); - const params = { RegionId: 'cn-hangzhou', DomainName: domain, - RR: rr, + RR: hostRecord, Type: type, Value: value, // Line: 'oversea' // 海外 diff --git a/packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-db-backup.ts b/packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-db-backup.ts index 8ccf4515..166100ea 100644 --- a/packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-db-backup.ts +++ b/packages/ui/certd-server/src/plugins/plugin-other/plugins/plugin-db-backup.ts @@ -1,14 +1,15 @@ -import { IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline'; -import fs from 'fs'; -import path from 'path'; -import dayjs from 'dayjs'; -import { AbstractPlusTaskPlugin } from '@certd/plugin-plus'; -import JSZip from 'jszip'; -import * as os from 'node:os'; -import { SshAccess, SshClient } from '@certd/plugin-lib'; +import { IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from "@certd/pipeline"; +import fs from "fs"; +import path from "path"; +import dayjs from "dayjs"; +import { AbstractPlusTaskPlugin } from "@certd/plugin-plus"; +import JSZip from "jszip"; +import * as os from "node:os"; +import { OssClientContext, ossClientFactory, OssClientRemoveByOpts, SshAccess, SshClient } from "@certd/plugin-lib"; const defaultBackupDir = 'certd_backup'; -const defaultFilePrefix = 'db-backup'; +const defaultFilePrefix = 'db_backup'; + @IsTaskPlugin({ name: 'DBBackupPlugin', title: '数据库备份', @@ -30,8 +31,9 @@ export class DBBackupPlugin extends AbstractPlusTaskPlugin { component: { name: 'a-select', options: [ - { label: '本地复制', value: 'local' }, - { label: 'ssh上传', value: 'ssh' }, + {label: '本地复制', value: 'local'}, + {label: 'ssh上传', value: 'ssh'}, + {label: 'oss上传', value: 'oss'}, ], placeholder: '', }, @@ -57,6 +59,53 @@ export class DBBackupPlugin extends AbstractPlusTaskPlugin { }) sshAccessId!: number; + + @TaskInput({ + title: 'OSS类型', + component: { + name: 'a-select', + options: [ + {value: "alioss", label: "阿里云OSS"}, + {value: "s3", label: "MinIO/S3"}, + {value: "qiniuoss", label: "七牛云"}, + {value: "tencentcos", label: "腾讯云COS"}, + {value: "ftp", label: "Ftp"}, + {value: "sftp", label: "Sftp"}, + ] + }, + mergeScript: ` + return { + show:ctx.compute(({form})=>{ + return form.backupMode === 'oss'; + }) + } + `, + required: true, + }) + ossType!: string; + + @TaskInput({ + title: 'OSS授权', + component: { + name: 'access-selector', + }, + mergeScript: ` + return { + show:ctx.compute(({form})=>{ + return form.backupMode === 'oss'; + }), + component:{ + type: ctx.compute(({form})=>{ + return form.ossType; + }), + } + } + `, + required: true, + }) + ossAccessId!: number; + + @TaskInput({ title: '备份保存目录', component: { @@ -104,7 +153,9 @@ export class DBBackupPlugin extends AbstractPlusTaskPlugin { }) retainDays!: number; - async onInstance() {} + async onInstance() { + } + async execute(): Promise { this.logger.info('开始备份数据库'); @@ -114,11 +165,11 @@ export class DBBackupPlugin extends AbstractPlusTaskPlugin { this.logger.error('数据库文件不存在:', dbPath); return; } - const dbTmpFilename = `${this.filePrefix}.${dayjs().format('YYYYMMDD.HHmmss')}.sqlite`; + const dbTmpFilename = `${this.filePrefix}_${dayjs().format('YYYYMMDD_HHmmss')}_sqlite`; const dbZipFilename = `${dbTmpFilename}.zip`; const tempDir = path.resolve(os.tmpdir(), 'certd_backup'); if (!fs.existsSync(tempDir)) { - await fs.promises.mkdir(tempDir, { recursive: true }); + await fs.promises.mkdir(tempDir, {recursive: true}); } const dbTmpPath = path.resolve(tempDir, dbTmpFilename); const dbZipPath = path.resolve(tempDir, dbZipFilename); @@ -129,14 +180,14 @@ export class DBBackupPlugin extends AbstractPlusTaskPlugin { const zip = new JSZip(); const stream = fs.createReadStream(dbTmpPath); // 使用流的方式添加文件内容 - zip.file(dbTmpFilename, stream, { binary: true, compression: 'DEFLATE' }); + zip.file(dbTmpFilename, stream, {binary: true, compression: 'DEFLATE'}); const uploadDir = path.resolve('data', 'upload'); if (this.withUpload && fs.existsSync(uploadDir)) { zip.folder(uploadDir); } - const content = await zip.generateAsync({ type: 'nodebuffer' }); + const content = await zip.generateAsync({type: 'nodebuffer'}); await fs.promises.writeFile(dbZipPath, content); this.logger.info(`数据库文件压缩完成:${dbZipPath}`); @@ -164,7 +215,7 @@ export class DBBackupPlugin extends AbstractPlusTaskPlugin { } const dir = path.dirname(backupPath); if (!fs.existsSync(dir)) { - await fs.promises.mkdir(dir, { recursive: true }); + await fs.promises.mkdir(dir, {recursive: true}); } backupPath = path.resolve(backupPath); await fs.promises.copyFile(dbPath, backupPath); @@ -195,7 +246,7 @@ export class DBBackupPlugin extends AbstractPlusTaskPlugin { this.logger.info('备份目录:', backupPath); await sshClient.uploadFiles({ connectConf: access, - transports: [{ localPath: dbPath, remotePath: backupPath }], + transports: [{localPath: dbPath, remotePath: backupPath}], mkdirs: true, }); this.logger.info('备份文件上传完成'); @@ -221,7 +272,39 @@ export class DBBackupPlugin extends AbstractPlusTaskPlugin { } private async ossBackup(dbPath: string, backupDir: string, backupPath: string) { - // TODO + if (!this.ossAccessId) { + throw new Error('未配置ossAccessId'); + } + const access = await this.getAccess(this.ossAccessId); + const ossType = this.ossType + + const ctx: OssClientContext = { + logger: this.logger, + utils: this.ctx.utils, + accessService:this.accessService + } + + this.logger.info(`开始备份文件到:${ossType}`); + const client = await ossClientFactory.createOssClientByType(ossType, { + access, + ctx, + }) + + await client.upload(backupPath, dbPath); + + if (this.retainDays > 0) { + // 删除过期备份 + this.logger.info('开始删除过期备份文件'); + const removeByOpts: OssClientRemoveByOpts = { + dir: backupDir, + beforeDays: this.retainDays, + }; + await client.removeBy(removeByOpts); + this.logger.info('删除过期备份文件完成'); + }else{ + this.logger.info('已禁止删除过期文件'); + } } } + new DBBackupPlugin(); diff --git a/packages/ui/certd-server/src/plugins/plugin-51dns/client.test.mjs b/packages/ui/certd-server/test/plugins/51dns.test.mjs similarity index 100% rename from packages/ui/certd-server/src/plugins/plugin-51dns/client.test.mjs rename to packages/ui/certd-server/test/plugins/51dns.test.mjs diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4286cb03..b07dea60 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,7 +46,7 @@ importers: packages/core/acme-client: dependencies: '@certd/basic': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../basic '@peculiar/x509': specifier: ^1.11.0 @@ -72,6 +72,9 @@ importers: node-forge: specifier: ^1.3.1 version: 1.3.1 + punycode: + specifier: ^2.3.1 + version: 2.3.1 devDependencies: '@types/node': specifier: ^20.14.10 @@ -204,10 +207,10 @@ importers: packages/core/pipeline: dependencies: '@certd/basic': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../basic '@certd/plus-core': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../pro/plus-core dayjs: specifier: ^1.11.7 @@ -412,7 +415,7 @@ importers: packages/libs/lib-k8s: dependencies: '@certd/basic': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../core/basic '@kubernetes/client-node': specifier: 0.21.0 @@ -452,16 +455,16 @@ importers: packages/libs/lib-server: dependencies: '@certd/acme-client': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../core/acme-client '@certd/basic': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../core/basic '@certd/pipeline': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../core/pipeline '@certd/plus-core': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../pro/plus-core '@midwayjs/cache': specifier: ~3.14.0 @@ -507,7 +510,7 @@ importers: version: 1.15.1 typeorm: specifier: ^0.3.20 - version: 0.3.21(better-sqlite3@11.8.1)(mysql2@3.14.0)(pg@8.13.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2)) + version: 0.3.21(better-sqlite3@11.8.1)(mysql2@3.14.0)(pg@8.13.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2)) devDependencies: '@types/chai': specifier: ^4.3.3 @@ -596,7 +599,7 @@ importers: version: 2.8.1 typeorm: specifier: ^0.3.11 - version: 0.3.21(better-sqlite3@11.8.1)(mysql2@3.14.0)(pg@8.13.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2)) + version: 0.3.21(better-sqlite3@11.8.1)(mysql2@3.14.0)(pg@8.13.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2)) typescript: specifier: ^5.4.2 version: 5.8.2 @@ -604,16 +607,16 @@ importers: packages/plugins/plugin-cert: dependencies: '@certd/acme-client': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../core/acme-client '@certd/basic': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../core/basic '@certd/pipeline': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../core/pipeline '@certd/plugin-lib': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../plugin-lib '@google-cloud/publicca': specifier: ^1.3.0 @@ -630,6 +633,9 @@ importers: psl: specifier: ^1.9.0 version: 1.15.0 + punycode: + specifier: ^2.3.1 + version: 2.3.1 rimraf: specifier: ^5.0.5 version: 5.0.10 @@ -679,17 +685,20 @@ importers: '@alicloud/pop-core': specifier: ^1.7.10 version: 1.8.0 + '@aws-sdk/client-s3': + specifier: ^3.787.0 + version: 3.787.0(aws-crt@1.25.3) '@certd/basic': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../core/basic '@certd/pipeline': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../core/pipeline '@kubernetes/client-node': specifier: 0.21.0 version: 0.21.0 ali-oss: - specifier: ^6.21.0 + specifier: ^6.22.0 version: 6.22.0 basic-ftp: specifier: ^5.0.5 @@ -771,19 +780,19 @@ importers: packages/pro/commercial-core: dependencies: '@certd/basic': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../core/basic '@certd/lib-server': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../libs/lib-server '@certd/pipeline': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../core/pipeline '@certd/plugin-plus': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../plugin-plus '@certd/plus-core': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../plus-core '@midwayjs/core': specifier: ~3.20.3 @@ -805,7 +814,7 @@ importers: version: 1.11.13 typeorm: specifier: ^0.3.20 - version: 0.3.21(better-sqlite3@11.8.1)(mysql2@3.14.0)(pg@8.13.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2)) + version: 0.3.21(better-sqlite3@11.8.1)(mysql2@3.14.0)(pg@8.13.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2)) wechatpay-node-v3: specifier: ^2.2.1 version: 2.2.1 @@ -868,22 +877,22 @@ importers: specifier: ^1.0.2 version: 1.0.2 '@certd/basic': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../core/basic '@certd/lib-k8s': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../libs/lib-k8s '@certd/pipeline': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../core/pipeline '@certd/plugin-cert': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../plugins/plugin-cert '@certd/plugin-lib': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../plugins/plugin-lib '@certd/plus-core': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../plus-core ali-oss: specifier: ^6.21.0 @@ -980,7 +989,7 @@ importers: packages/pro/plus-core: dependencies: '@certd/basic': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../core/basic dayjs: specifier: ^1.11.7 @@ -1087,7 +1096,7 @@ importers: version: 0.0.0-insiders.565cd3e(postcss@8.5.3) '@tailwindcss/typography': specifier: ^0.5.16 - version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2))) + version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2))) '@tanstack/vue-store': specifier: ^0.7.0 version: 0.7.0(vue@3.5.13(typescript@5.8.2)) @@ -1231,7 +1240,7 @@ importers: version: 3.0.2 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2))) + version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2))) theme-colors: specifier: ^0.1.0 version: 0.1.0 @@ -1270,10 +1279,10 @@ importers: version: 0.1.3(zod@3.24.2) devDependencies: '@certd/lib-iframe': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../libs/lib-iframe '@certd/pipeline': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../core/pipeline '@rollup/plugin-commonjs': specifier: ^25.0.7 @@ -1388,13 +1397,13 @@ importers: version: 6.0.4(stylelint@15.11.0(typescript@5.8.2)) tailwindcss: specifier: ^3.4.14 - version: 3.4.17(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2)) + version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2)) terser: specifier: ^5.29.2 version: 5.39.0 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@18.19.80)(typescript@5.8.2) + version: 10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2) tslint: specifier: ^6.1.3 version: 6.1.3(typescript@5.8.2) @@ -1410,6 +1419,9 @@ importers: vite-plugin-compression: specifier: ^0.5.1 version: 0.5.1(vite@5.4.14(@types/node@18.19.80)(less@4.2.2)(terser@5.39.0)) + vite-plugin-dynamic-base: + specifier: ^1.1.0 + version: 1.1.0(vite@5.4.14(@types/node@18.19.80)(less@4.2.2)(terser@5.39.0)) vite-plugin-html: specifier: ^3.2.2 version: 3.2.2(vite@5.4.14(@types/node@18.19.80)(less@4.2.2)(terser@5.39.0)) @@ -1453,43 +1465,43 @@ importers: specifier: ^3.705.0 version: 3.758.0(aws-crt@1.25.3) '@certd/acme-client': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../core/acme-client '@certd/basic': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../core/basic '@certd/commercial-core': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../pro/commercial-core '@certd/jdcloud': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../libs/lib-jdcloud '@certd/lib-huawei': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../libs/lib-huawei '@certd/lib-k8s': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../libs/lib-k8s '@certd/lib-server': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../libs/lib-server '@certd/midway-flyway-js': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../libs/midway-flyway-js '@certd/pipeline': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../core/pipeline '@certd/plugin-cert': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../plugins/plugin-cert '@certd/plugin-lib': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../plugins/plugin-lib '@certd/plugin-plus': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../pro/plugin-plus '@certd/plus-core': - specifier: ^1.33.6 + specifier: ^1.33.7 version: link:../../pro/plus-core '@corsinvest/cv4pve-api-javascript': specifier: ^8.3.0 @@ -1676,7 +1688,7 @@ importers: version: 4.0.1045(encoding@0.1.13) typeorm: specifier: ^0.3.20 - version: 0.3.21(better-sqlite3@11.8.1)(mysql2@3.14.0)(pg@8.13.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2)) + version: 0.3.21(better-sqlite3@11.8.1)(mysql2@3.14.0)(pg@8.13.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2)) uuid: specifier: ^10.0.0 version: 10.0.0 @@ -1920,42 +1932,82 @@ packages: resolution: {integrity: sha512-f8SlhU9/93OC/WEI6xVJf/x/GoQFj9a/xXK6QCtr5fvCjfSLgMVFmKTiIl/tgtDRzxUDc8YS6EGtbHjJ3Y/atg==} engines: {node: '>=18.0.0'} + '@aws-sdk/client-s3@3.787.0': + resolution: {integrity: sha512-eGLCWkN0NlntJ9yPU6OKUggVS4cFvuZJog+cFg1KD5hniLqz7Y0YRtB4uBxW212fK3XCfddgyscEOEeHaTQQTw==} + engines: {node: '>=18.0.0'} + '@aws-sdk/client-sso@3.758.0': resolution: {integrity: sha512-BoGO6IIWrLyLxQG6txJw6RT2urmbtlwfggapNCrNPyYjlXpzTSJhBYjndg7TpDATFd0SXL0zm8y/tXsUXNkdYQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/client-sso@3.787.0': + resolution: {integrity: sha512-L8R+Mh258G0DC73ktpSVrG4TT9i2vmDLecARTDR/4q5sRivdDQSL5bUp3LKcK80Bx+FRw3UETIlX6mYMLL9PJQ==} + engines: {node: '>=18.0.0'} + '@aws-sdk/core@3.758.0': resolution: {integrity: sha512-0RswbdR9jt/XKemaLNuxi2gGr4xGlHyGxkTdhSQzCyUe9A9OPCoLl3rIESRguQEech+oJnbHk/wuiwHqTuP9sg==} engines: {node: '>=18.0.0'} + '@aws-sdk/core@3.775.0': + resolution: {integrity: sha512-8vpW4WihVfz0DX+7WnnLGm3GuQER++b0IwQG35JlQMlgqnc44M//KbJPsIHA0aJUJVwJAEShgfr5dUbY8WUzaA==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-env@3.758.0': resolution: {integrity: sha512-N27eFoRrO6MeUNumtNHDW9WOiwfd59LPXPqDrIa3kWL/s+fOKFHb9xIcF++bAwtcZnAxKkgpDCUP+INNZskE+w==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-env@3.775.0': + resolution: {integrity: sha512-6ESVxwCbGm7WZ17kY1fjmxQud43vzJFoLd4bmlR+idQSWdqlzGDYdcfzpjDKTcivdtNrVYmFvcH1JBUwCRAZhw==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-http@3.758.0': resolution: {integrity: sha512-Xt9/U8qUCiw1hihztWkNeIR+arg6P+yda10OuCHX6kFVx3auTlU7+hCqs3UxqniGU4dguHuftf3mRpi5/GJ33Q==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-http@3.775.0': + resolution: {integrity: sha512-PjDQeDH/J1S0yWV32wCj2k5liRo0ssXMseCBEkCsD3SqsU8o5cU82b0hMX4sAib/RkglCSZqGO0xMiN0/7ndww==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-ini@3.758.0': resolution: {integrity: sha512-cymSKMcP5d+OsgetoIZ5QCe1wnp2Q/tq+uIxVdh9MbfdBBEnl9Ecq6dH6VlYS89sp4QKuxHxkWXVnbXU3Q19Aw==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-ini@3.787.0': + resolution: {integrity: sha512-hc2taRoDlXn2uuNuHWDJljVWYrp3r9JF1a/8XmOAZhVUNY+ImeeStylHXhXXKEA4JOjW+5PdJj0f1UDkVCHJiQ==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-node@3.758.0': resolution: {integrity: sha512-+DaMv63wiq7pJrhIQzZYMn4hSarKiizDoJRvyR7WGhnn0oQ/getX9Z0VNCV3i7lIFoLNTb7WMmQ9k7+z/uD5EQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-node@3.787.0': + resolution: {integrity: sha512-JioVi44B1vDMaK2CdzqimwvJD3uzvzbQhaEWXsGMBcMcNHajXAXf08EF50JG3ZhLrhhUsT1ObXpbTaPINOhh+g==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-process@3.758.0': resolution: {integrity: sha512-AzcY74QTPqcbXWVgjpPZ3HOmxQZYPROIBz2YINF0OQk0MhezDWV/O7Xec+K1+MPGQO3qS6EDrUUlnPLjsqieHA==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-process@3.775.0': + resolution: {integrity: sha512-A6k68H9rQp+2+7P7SGO90Csw6nrUEm0Qfjpn9Etc4EboZhhCLs9b66umUsTsSBHus4FDIe5JQxfCUyt1wgNogg==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-sso@3.758.0': resolution: {integrity: sha512-x0FYJqcOLUCv8GLLFDYMXRAQKGjoM+L0BG4BiHYZRDf24yQWFCAZsCQAYKo6XZYh2qznbsW6f//qpyJ5b0QVKQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-sso@3.787.0': + resolution: {integrity: sha512-fHc08bsvwm4+dEMEQKnQ7c1irEQmmxbgS+Fq41y09pPvPh31nAhoMcjBSTWAaPHvvsRbTYvmP4Mf12ZGr8/nfg==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-web-identity@3.758.0': resolution: {integrity: sha512-XGguXhBqiCXMXRxcfCAVPlMbm3VyJTou79r/3mxWddHWF0XbhaQiBIbUz6vobVTD25YQRbWSmSch7VA8kI5Lrw==} engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-web-identity@3.787.0': + resolution: {integrity: sha512-SobmCwNbk6TfEsF283mZPQEI5vV2j6eY5tOCj8Er4Lzraxu9fBPADV+Bib2A8F6jlB1lMPJzOuDCbEasSt/RIw==} + engines: {node: '>=18.0.0'} + '@aws-sdk/crt-loader@3.758.0': resolution: {integrity: sha512-FnLhsDNK3il4rm6Egv7IEuOf8Oiyte5AVeoYkuqgmkCll58tRZCJXYNG/VE+Tket0s3joueVt7rwvHXnMxG0rg==} engines: {node: '>=18.0.0'} @@ -1964,50 +2016,98 @@ packages: resolution: {integrity: sha512-etC7G18aF7KdZguW27GE/wpbrNmYLVT755EsFc8kXpZj8D6AFKxc7OuveinJmiy0bYXAMspJUWsF6CrGpOw6CQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-bucket-endpoint@3.775.0': + resolution: {integrity: sha512-qogMIpVChDYr4xiUNC19/RDSw/sKoHkAhouS6Skxiy6s27HBhow1L3Z1qVYXuBmOZGSWPU0xiyZCvOyWrv9s+Q==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-expect-continue@3.734.0': resolution: {integrity: sha512-P38/v1l6HjuB2aFUewt7ueAW5IvKkFcv5dalPtbMGRhLeyivBOHwbCyuRKgVs7z7ClTpu9EaViEGki2jEQqEsQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-expect-continue@3.775.0': + resolution: {integrity: sha512-Apd3owkIeUW5dnk3au9np2IdW2N0zc9NjTjHiH+Mx3zqwSrc+m+ANgJVgk9mnQjMzU/vb7VuxJ0eqdEbp5gYsg==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-flexible-checksums@3.758.0': resolution: {integrity: sha512-o8Rk71S08YTKLoSobucjnbj97OCGaXgpEDNKXpXaavUM5xLNoHCLSUPRCiEN86Ivqxg1n17Y2nSRhfbsveOXXA==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-flexible-checksums@3.787.0': + resolution: {integrity: sha512-X71qEwWoixFmwowWzlPoZUR3u1CWJ7iAzU0EzIxqmPhQpQJLFmdL1+SRjqATynDPZQzLs1a5HBtPT++EnZ+Quw==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-host-header@3.734.0': resolution: {integrity: sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-host-header@3.775.0': + resolution: {integrity: sha512-tkSegM0Z6WMXpLB8oPys/d+umYIocvO298mGvcMCncpRl77L9XkvSLJIFzaHes+o7djAgIduYw8wKIMStFss2w==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-location-constraint@3.734.0': resolution: {integrity: sha512-EJEIXwCQhto/cBfHdm3ZOeLxd2NlJD+X2F+ZTOxzokuhBtY0IONfC/91hOo5tWQweerojwshSMHRCKzRv1tlwg==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-location-constraint@3.775.0': + resolution: {integrity: sha512-8TMXEHZXZTFTckQLyBT5aEI8fX11HZcwZseRifvBKKpj0RZDk4F0EEYGxeNSPpUQ7n+PRWyfAEnnZNRdAj/1NQ==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-logger@3.734.0': resolution: {integrity: sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-logger@3.775.0': + resolution: {integrity: sha512-FaxO1xom4MAoUJsldmR92nT1G6uZxTdNYOFYtdHfd6N2wcNaTuxgjIvqzg5y7QIH9kn58XX/dzf1iTjgqUStZw==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-recursion-detection@3.734.0': resolution: {integrity: sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-recursion-detection@3.775.0': + resolution: {integrity: sha512-GLCzC8D0A0YDG5u3F5U03Vb9j5tcOEFhr8oc6PDk0k0vm5VwtZOE6LvK7hcCSoAB4HXyOUM0sQuXrbaAh9OwXA==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-sdk-s3@3.758.0': resolution: {integrity: sha512-6mJ2zyyHPYSV6bAcaFpsdoXZJeQlR1QgBnZZ6juY/+dcYiuyWCdyLUbGzSZSE7GTfx6i+9+QWFeoIMlWKgU63A==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-sdk-s3@3.775.0': + resolution: {integrity: sha512-zsvcu7cWB28JJ60gVvjxPCI7ZU7jWGcpNACPiZGyVtjYXwcxyhXbYEVDSWKsSA6ERpz9XrpLYod8INQWfW3ECg==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-ssec@3.734.0': resolution: {integrity: sha512-d4yd1RrPW/sspEXizq2NSOUivnheac6LPeLSLnaeTbBG9g1KqIqvCzP1TfXEqv2CrWfHEsWtJpX7oyjySSPvDQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-ssec@3.775.0': + resolution: {integrity: sha512-Iw1RHD8vfAWWPzBBIKaojO4GAvQkHOYIpKdAfis/EUSUmSa79QsnXnRqsdcE0mCB0Ylj23yi+ah4/0wh9FsekA==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-user-agent@3.758.0': resolution: {integrity: sha512-iNyehQXtQlj69JCgfaOssgZD4HeYGOwxcaKeG6F+40cwBjTAi0+Ph1yfDwqk2qiBPIRWJ/9l2LodZbxiBqgrwg==} engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-user-agent@3.787.0': + resolution: {integrity: sha512-Lnfj8SmPLYtrDFthNIaNj66zZsBCam+E4XiUDr55DIHTGstH6qZ/q6vg0GfbukxwSmUcGMwSR4Qbn8rb8yd77g==} + engines: {node: '>=18.0.0'} + '@aws-sdk/nested-clients@3.758.0': resolution: {integrity: sha512-YZ5s7PSvyF3Mt2h1EQulCG93uybprNGbBkPmVuy/HMMfbFTt4iL3SbKjxqvOZelm86epFfj7pvK7FliI2WOEcg==} engines: {node: '>=18.0.0'} + '@aws-sdk/nested-clients@3.787.0': + resolution: {integrity: sha512-xk03q1xpKNHgbuo+trEf1dFrI239kuMmjKKsqLEsHlAZbuFq4yRGMlHBrVMnKYOPBhVFDS/VineM991XI52fKg==} + engines: {node: '>=18.0.0'} + '@aws-sdk/region-config-resolver@3.734.0': resolution: {integrity: sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/region-config-resolver@3.775.0': + resolution: {integrity: sha512-40iH3LJjrQS3LKUJAl7Wj0bln7RFPEvUYKFxtP8a+oKFDO0F65F52xZxIJbPn6sHkxWDAnZlGgdjZXM3p2g5wQ==} + engines: {node: '>=18.0.0'} + '@aws-sdk/s3-request-presigner@3.758.0': resolution: {integrity: sha512-dVyItwu/J1InfJBbCPpHRV9jrsBfI7L0RlDGyS3x/xqBwnm5qpvgNZQasQiyqIl+WJB4f5rZRZHgHuwftqINbA==} engines: {node: '>=18.0.0'} @@ -2020,14 +2120,26 @@ packages: resolution: {integrity: sha512-0RPCo8fYJcrenJ6bRtiUbFOSgQ1CX/GpvwtLU2Fam1tS9h2klKK8d74caeV6A1mIUvBU7bhyQ0wMGlwMtn3EYw==} engines: {node: '>=18.0.0'} + '@aws-sdk/signature-v4-multi-region@3.775.0': + resolution: {integrity: sha512-cnGk8GDfTMJ8p7+qSk92QlIk2bmTmFJqhYxcXZ9PysjZtx0xmfCMxnG3Hjy1oU2mt5boPCVSOptqtWixayM17g==} + engines: {node: '>=18.0.0'} + '@aws-sdk/token-providers@3.758.0': resolution: {integrity: sha512-ckptN1tNrIfQUaGWm/ayW1ddG+imbKN7HHhjFdS4VfItsP0QQOB0+Ov+tpgb4MoNR4JaUghMIVStjIeHN2ks1w==} engines: {node: '>=18.0.0'} + '@aws-sdk/token-providers@3.787.0': + resolution: {integrity: sha512-d7/NIqxq308Zg0RPMNrmn0QvzniL4Hx8Qdwzr6YZWLYAbUSvZYS2ppLR3BFWSkV6SsTJUx8BuDaj3P8vttkrog==} + engines: {node: '>=18.0.0'} + '@aws-sdk/types@3.734.0': resolution: {integrity: sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==} engines: {node: '>=18.0.0'} + '@aws-sdk/types@3.775.0': + resolution: {integrity: sha512-ZoGKwa4C9fC9Av6bdfqcW6Ix5ot05F/S4VxWR2nHuMv7hzfmAjTOcUiWT7UR4hM/U0whf84VhDtXN/DWAk52KA==} + engines: {node: '>=18.0.0'} + '@aws-sdk/util-arn-parser@3.723.0': resolution: {integrity: sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w==} engines: {node: '>=18.0.0'} @@ -2036,6 +2148,10 @@ packages: resolution: {integrity: sha512-sN1l559zrixeh5x+pttrnd0A3+r34r0tmPkJ/eaaMaAzXqsmKU/xYre9K3FNnsSS1J1k4PEfk/nHDTVUgFYjnw==} engines: {node: '>=18.0.0'} + '@aws-sdk/util-endpoints@3.787.0': + resolution: {integrity: sha512-fd3zkiOkwnbdbN0Xp9TsP5SWrmv0SpT70YEdbb8wAj2DWQwiCmFszaSs+YCvhoCdmlR3Wl9Spu0pGpSAGKeYvQ==} + engines: {node: '>=18.0.0'} + '@aws-sdk/util-format-url@3.734.0': resolution: {integrity: sha512-TxZMVm8V4aR/QkW9/NhujvYpPZjUYqzLwSge5imKZbWFR806NP7RMwc5ilVuHF/bMOln/cVHkl42kATElWBvNw==} engines: {node: '>=18.0.0'} @@ -2047,6 +2163,9 @@ packages: '@aws-sdk/util-user-agent-browser@3.734.0': resolution: {integrity: sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng==} + '@aws-sdk/util-user-agent-browser@3.775.0': + resolution: {integrity: sha512-txw2wkiJmZKVdDbscK7VBK+u+TJnRtlUjRTLei+elZg2ADhpQxfVAQl436FUeIv6AhB/oRHW6/K/EAGXUSWi0A==} + '@aws-sdk/util-user-agent-node@3.758.0': resolution: {integrity: sha512-A5EZw85V6WhoKMV2hbuFRvb9NPlxEErb4HPO6/SPXYY4QrjprIzScHxikqcWv1w4J3apB1wto9LPU3IMsYtfrw==} engines: {node: '>=18.0.0'} @@ -2056,6 +2175,15 @@ packages: aws-crt: optional: true + '@aws-sdk/util-user-agent-node@3.787.0': + resolution: {integrity: sha512-mG7Lz8ydfG4SF9e8WSXiPQ/Lsn3n8A5B5jtPROidafi06I3ckV2WxyMLdwG14m919NoS6IOfWHyRGSqWIwbVKA==} + engines: {node: '>=18.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + '@aws-sdk/util-utf8-browser@3.259.0': resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} @@ -2063,6 +2191,10 @@ packages: resolution: {integrity: sha512-Zrjxi5qwGEcUsJ0ru7fRtW74WcTS0rbLcehoFB+rN1GRi2hbLcFaYs4PwVA5diLeAJH0gszv3x4Hr/S87MfbKQ==} engines: {node: '>=18.0.0'} + '@aws-sdk/xml-builder@3.775.0': + resolution: {integrity: sha512-b9NGO6FKJeLGYnV7Z1yvcP1TNU4dkD5jNsLWOF1/sygZoASaQhNOlaiJ/1OH331YQ1R1oWk38nBb0frsYkDsOQ==} + engines: {node: '>=18.0.0'} + '@babel/code-frame@7.12.11': resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} @@ -4124,6 +4256,10 @@ packages: resolution: {integrity: sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==} engines: {node: '>=18.0.0'} + '@smithy/abort-controller@4.0.2': + resolution: {integrity: sha512-Sl/78VDtgqKxN2+1qduaVE140XF+Xg+TafkncspwM4jFP/LHr76ZHmIY/y3V1M0mMLNk+Je6IGbzxy23RSToMw==} + engines: {node: '>=18.0.0'} + '@smithy/chunked-blob-reader-native@4.0.0': resolution: {integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==} engines: {node: '>=18.0.0'} @@ -4136,54 +4272,106 @@ packages: resolution: {integrity: sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==} engines: {node: '>=18.0.0'} + '@smithy/config-resolver@4.1.0': + resolution: {integrity: sha512-8smPlwhga22pwl23fM5ew4T9vfLUCeFXlcqNOCD5M5h8VmNPNUE9j6bQSuRXpDSV11L/E/SwEBQuW8hr6+nS1A==} + engines: {node: '>=18.0.0'} + '@smithy/core@3.1.5': resolution: {integrity: sha512-HLclGWPkCsekQgsyzxLhCQLa8THWXtB5PxyYN+2O6nkyLt550KQKTlbV2D1/j5dNIQapAZM1+qFnpBFxZQkgCA==} engines: {node: '>=18.0.0'} + '@smithy/core@3.2.0': + resolution: {integrity: sha512-k17bgQhVZ7YmUvA8at4af1TDpl0NDMBuBKJl8Yg0nrefwmValU+CnA5l/AriVdQNthU/33H3nK71HrLgqOPr1Q==} + engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@4.0.1': resolution: {integrity: sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg==} engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@4.0.2': + resolution: {integrity: sha512-32lVig6jCaWBHnY+OEQ6e6Vnt5vDHaLiydGrwYMW9tPqO688hPGTYRamYJ1EptxEC2rAwJrHWmPoKRBl4iTa8w==} + engines: {node: '>=18.0.0'} + '@smithy/eventstream-codec@4.0.1': resolution: {integrity: sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A==} engines: {node: '>=18.0.0'} + '@smithy/eventstream-codec@4.0.2': + resolution: {integrity: sha512-p+f2kLSK7ZrXVfskU/f5dzksKTewZk8pJLPvER3aFHPt76C2MxD9vNatSfLzzQSQB4FNO96RK4PSXfhD1TTeMQ==} + engines: {node: '>=18.0.0'} + '@smithy/eventstream-serde-browser@4.0.1': resolution: {integrity: sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA==} engines: {node: '>=18.0.0'} + '@smithy/eventstream-serde-browser@4.0.2': + resolution: {integrity: sha512-CepZCDs2xgVUtH7ZZ7oDdZFH8e6Y2zOv8iiX6RhndH69nlojCALSKK+OXwZUgOtUZEUaZ5e1hULVCHYbCn7pug==} + engines: {node: '>=18.0.0'} + '@smithy/eventstream-serde-config-resolver@4.0.1': resolution: {integrity: sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA==} engines: {node: '>=18.0.0'} + '@smithy/eventstream-serde-config-resolver@4.1.0': + resolution: {integrity: sha512-1PI+WPZ5TWXrfj3CIoKyUycYynYJgZjuQo8U+sphneOtjsgrttYybdqESFReQrdWJ+LKt6NEdbYzmmfDBmjX2A==} + engines: {node: '>=18.0.0'} + '@smithy/eventstream-serde-node@4.0.1': resolution: {integrity: sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q==} engines: {node: '>=18.0.0'} + '@smithy/eventstream-serde-node@4.0.2': + resolution: {integrity: sha512-C5bJ/C6x9ENPMx2cFOirspnF9ZsBVnBMtP6BdPl/qYSuUawdGQ34Lq0dMcf42QTjUZgWGbUIZnz6+zLxJlb9aw==} + engines: {node: '>=18.0.0'} + '@smithy/eventstream-serde-universal@4.0.1': resolution: {integrity: sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA==} engines: {node: '>=18.0.0'} + '@smithy/eventstream-serde-universal@4.0.2': + resolution: {integrity: sha512-St8h9JqzvnbB52FtckiHPN4U/cnXcarMniXRXTKn0r4b4XesZOGiAyUdj1aXbqqn1icSqBlzzUsCl6nPB018ng==} + engines: {node: '>=18.0.0'} + '@smithy/fetch-http-handler@5.0.1': resolution: {integrity: sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA==} engines: {node: '>=18.0.0'} + '@smithy/fetch-http-handler@5.0.2': + resolution: {integrity: sha512-+9Dz8sakS9pe7f2cBocpJXdeVjMopUDLgZs1yWeu7h++WqSbjUYv/JAJwKwXw1HV6gq1jyWjxuyn24E2GhoEcQ==} + engines: {node: '>=18.0.0'} + '@smithy/hash-blob-browser@4.0.1': resolution: {integrity: sha512-rkFIrQOKZGS6i1D3gKJ8skJ0RlXqDvb1IyAphksaFOMzkn3v3I1eJ8m7OkLj0jf1McP63rcCEoLlkAn/HjcTRw==} engines: {node: '>=18.0.0'} + '@smithy/hash-blob-browser@4.0.2': + resolution: {integrity: sha512-3g188Z3DyhtzfBRxpZjU8R9PpOQuYsbNnyStc/ZVS+9nVX1f6XeNOa9IrAh35HwwIZg+XWk8bFVtNINVscBP+g==} + engines: {node: '>=18.0.0'} + '@smithy/hash-node@4.0.1': resolution: {integrity: sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w==} engines: {node: '>=18.0.0'} + '@smithy/hash-node@4.0.2': + resolution: {integrity: sha512-VnTpYPnRUE7yVhWozFdlxcYknv9UN7CeOqSrMH+V877v4oqtVYuoqhIhtSjmGPvYrYnAkaM61sLMKHvxL138yg==} + engines: {node: '>=18.0.0'} + '@smithy/hash-stream-node@4.0.1': resolution: {integrity: sha512-U1rAE1fxmReCIr6D2o/4ROqAQX+GffZpyMt3d7njtGDr2pUNmAKRWa49gsNVhCh2vVAuf3wXzWwNr2YN8PAXIw==} engines: {node: '>=18.0.0'} + '@smithy/hash-stream-node@4.0.2': + resolution: {integrity: sha512-POWDuTznzbIwlEXEvvXoPMS10y0WKXK790soe57tFRfvf4zBHyzE529HpZMqmDdwG9MfFflnyzndUQ8j78ZdSg==} + engines: {node: '>=18.0.0'} + '@smithy/invalid-dependency@4.0.1': resolution: {integrity: sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ==} engines: {node: '>=18.0.0'} + '@smithy/invalid-dependency@4.0.2': + resolution: {integrity: sha512-GatB4+2DTpgWPday+mnUkoumP54u/MDM/5u44KF9hIu8jF0uafZtQLcdfIKkIcUNuF/fBojpLEHZS/56JqPeXQ==} + engines: {node: '>=18.0.0'} + '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} @@ -4196,74 +4384,146 @@ packages: resolution: {integrity: sha512-HLZ647L27APi6zXkZlzSFZIjpo8po45YiyjMGJZM3gyDY8n7dPGdmxIIljLm4gPt/7rRvutLTTkYJpZVfG5r+A==} engines: {node: '>=18.0.0'} + '@smithy/md5-js@4.0.2': + resolution: {integrity: sha512-Hc0R8EiuVunUewCse2syVgA2AfSRco3LyAv07B/zCOMa+jpXI9ll+Q21Nc6FAlYPcpNcAXqBzMhNs1CD/pP2bA==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-content-length@4.0.1': resolution: {integrity: sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==} engines: {node: '>=18.0.0'} + '@smithy/middleware-content-length@4.0.2': + resolution: {integrity: sha512-hAfEXm1zU+ELvucxqQ7I8SszwQ4znWMbNv6PLMndN83JJN41EPuS93AIyh2N+gJ6x8QFhzSO6b7q2e6oClDI8A==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-endpoint@4.0.6': resolution: {integrity: sha512-ftpmkTHIFqgaFugcjzLZv3kzPEFsBFSnq1JsIkr2mwFzCraZVhQk2gqN51OOeRxqhbPTkRFj39Qd2V91E/mQxg==} engines: {node: '>=18.0.0'} + '@smithy/middleware-endpoint@4.1.0': + resolution: {integrity: sha512-xhLimgNCbCzsUppRTGXWkZywksuTThxaIB0HwbpsVLY5sceac4e1TZ/WKYqufQLaUy+gUSJGNdwD2jo3cXL0iA==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-retry@4.0.7': resolution: {integrity: sha512-58j9XbUPLkqAcV1kHzVX/kAR16GT+j7DUZJqwzsxh1jtz7G82caZiGyyFgUvogVfNTg3TeAOIJepGc8TXF4AVQ==} engines: {node: '>=18.0.0'} + '@smithy/middleware-retry@4.1.0': + resolution: {integrity: sha512-2zAagd1s6hAaI/ap6SXi5T3dDwBOczOMCSkkYzktqN1+tzbk1GAsHNAdo/1uzxz3Ky02jvZQwbi/vmDA6z4Oyg==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-serde@4.0.2': resolution: {integrity: sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ==} engines: {node: '>=18.0.0'} + '@smithy/middleware-serde@4.0.3': + resolution: {integrity: sha512-rfgDVrgLEVMmMn0BI8O+8OVr6vXzjV7HZj57l0QxslhzbvVfikZbVfBVthjLHqib4BW44QhcIgJpvebHlRaC9A==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-stack@4.0.1': resolution: {integrity: sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA==} engines: {node: '>=18.0.0'} + '@smithy/middleware-stack@4.0.2': + resolution: {integrity: sha512-eSPVcuJJGVYrFYu2hEq8g8WWdJav3sdrI4o2c6z/rjnYDd3xH9j9E7deZQCzFn4QvGPouLngH3dQ+QVTxv5bOQ==} + engines: {node: '>=18.0.0'} + '@smithy/node-config-provider@4.0.1': resolution: {integrity: sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ==} engines: {node: '>=18.0.0'} + '@smithy/node-config-provider@4.0.2': + resolution: {integrity: sha512-WgCkILRZfJwJ4Da92a6t3ozN/zcvYyJGUTmfGbgS/FkCcoCjl7G4FJaCDN1ySdvLvemnQeo25FdkyMSTSwulsw==} + engines: {node: '>=18.0.0'} + '@smithy/node-http-handler@4.0.3': resolution: {integrity: sha512-dYCLeINNbYdvmMLtW0VdhW1biXt+PPCGazzT5ZjKw46mOtdgToQEwjqZSS9/EN8+tNs/RO0cEWG044+YZs97aA==} engines: {node: '>=18.0.0'} + '@smithy/node-http-handler@4.0.4': + resolution: {integrity: sha512-/mdqabuAT3o/ihBGjL94PUbTSPSRJ0eeVTdgADzow0wRJ0rN4A27EOrtlK56MYiO1fDvlO3jVTCxQtQmK9dZ1g==} + engines: {node: '>=18.0.0'} + '@smithy/property-provider@4.0.1': resolution: {integrity: sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ==} engines: {node: '>=18.0.0'} + '@smithy/property-provider@4.0.2': + resolution: {integrity: sha512-wNRoQC1uISOuNc2s4hkOYwYllmiyrvVXWMtq+TysNRVQaHm4yoafYQyjN/goYZS+QbYlPIbb/QRjaUZMuzwQ7A==} + engines: {node: '>=18.0.0'} + '@smithy/protocol-http@5.0.1': resolution: {integrity: sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==} engines: {node: '>=18.0.0'} + '@smithy/protocol-http@5.1.0': + resolution: {integrity: sha512-KxAOL1nUNw2JTYrtviRRjEnykIDhxc84qMBzxvu1MUfQfHTuBlCG7PA6EdVwqpJjH7glw7FqQoFxUJSyBQgu7g==} + engines: {node: '>=18.0.0'} + '@smithy/querystring-builder@4.0.1': resolution: {integrity: sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==} engines: {node: '>=18.0.0'} + '@smithy/querystring-builder@4.0.2': + resolution: {integrity: sha512-NTOs0FwHw1vimmQM4ebh+wFQvOwkEf/kQL6bSM1Lock+Bv4I89B3hGYoUEPkmvYPkDKyp5UdXJYu+PoTQ3T31Q==} + engines: {node: '>=18.0.0'} + '@smithy/querystring-parser@4.0.1': resolution: {integrity: sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw==} engines: {node: '>=18.0.0'} + '@smithy/querystring-parser@4.0.2': + resolution: {integrity: sha512-v6w8wnmZcVXjfVLjxw8qF7OwESD9wnpjp0Dqry/Pod0/5vcEA3qxCr+BhbOHlxS8O+29eLpT3aagxXGwIoEk7Q==} + engines: {node: '>=18.0.0'} + '@smithy/service-error-classification@4.0.1': resolution: {integrity: sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA==} engines: {node: '>=18.0.0'} + '@smithy/service-error-classification@4.0.2': + resolution: {integrity: sha512-LA86xeFpTKn270Hbkixqs5n73S+LVM0/VZco8dqd+JT75Dyx3Lcw/MraL7ybjmz786+160K8rPOmhsq0SocoJQ==} + engines: {node: '>=18.0.0'} + '@smithy/shared-ini-file-loader@4.0.1': resolution: {integrity: sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw==} engines: {node: '>=18.0.0'} + '@smithy/shared-ini-file-loader@4.0.2': + resolution: {integrity: sha512-J9/gTWBGVuFZ01oVA6vdb4DAjf1XbDhK6sLsu3OS9qmLrS6KB5ygpeHiM3miIbj1qgSJ96GYszXFWv6ErJ8QEw==} + engines: {node: '>=18.0.0'} + '@smithy/signature-v4@5.0.1': resolution: {integrity: sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==} engines: {node: '>=18.0.0'} + '@smithy/signature-v4@5.1.0': + resolution: {integrity: sha512-4t5WX60sL3zGJF/CtZsUQTs3UrZEDO2P7pEaElrekbLqkWPYkgqNW1oeiNYC6xXifBnT9dVBOnNQRvOE9riU9w==} + engines: {node: '>=18.0.0'} + '@smithy/smithy-client@4.1.6': resolution: {integrity: sha512-UYDolNg6h2O0L+cJjtgSyKKvEKCOa/8FHYJnBobyeoeWDmNpXjwOAtw16ezyeu1ETuuLEOZbrynK0ZY1Lx9Jbw==} engines: {node: '>=18.0.0'} + '@smithy/smithy-client@4.2.0': + resolution: {integrity: sha512-Qs65/w30pWV7LSFAez9DKy0Koaoh3iHhpcpCCJ4waj/iqwsuSzJna2+vYwq46yBaqO5ZbP9TjUsATUNxrKeBdw==} + engines: {node: '>=18.0.0'} + '@smithy/types@4.1.0': resolution: {integrity: sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==} engines: {node: '>=18.0.0'} + '@smithy/types@4.2.0': + resolution: {integrity: sha512-7eMk09zQKCO+E/ivsjQv+fDlOupcFUCSC/L2YUPgwhvowVGWbPQHjEFcmjt7QQ4ra5lyowS92SV53Zc6XD4+fg==} + engines: {node: '>=18.0.0'} + '@smithy/url-parser@4.0.1': resolution: {integrity: sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g==} engines: {node: '>=18.0.0'} + '@smithy/url-parser@4.0.2': + resolution: {integrity: sha512-Bm8n3j2ScqnT+kJaClSVCMeiSenK6jVAzZCNewsYWuZtnBehEz4r2qP0riZySZVfzB+03XZHJeqfmJDkeeSLiQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-base64@4.0.0': resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} engines: {node: '>=18.0.0'} @@ -4292,14 +4552,26 @@ packages: resolution: {integrity: sha512-CZgDDrYHLv0RUElOsmZtAnp1pIjwDVCSuZWOPhIOBvG36RDfX1Q9+6lS61xBf+qqvHoqRjHxgINeQz47cYFC2Q==} engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-browser@4.0.8': + resolution: {integrity: sha512-ZTypzBra+lI/LfTYZeop9UjoJhhGRTg3pxrNpfSTQLd3AJ37r2z4AXTKpq1rFXiiUIJsYyFgNJdjWRGP/cbBaQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-node@4.0.7': resolution: {integrity: sha512-79fQW3hnfCdrfIi1soPbK3zmooRFnLpSx3Vxi6nUlqaaQeC5dm8plt4OTNDNqEEEDkvKghZSaoti684dQFVrGQ==} engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-node@4.0.8': + resolution: {integrity: sha512-Rgk0Jc/UDfRTzVthye/k2dDsz5Xxs9LZaKCNPgJTRyoyBoeiNCnHsYGOyu1PKN+sDyPnJzMOz22JbwxzBp9NNA==} + engines: {node: '>=18.0.0'} + '@smithy/util-endpoints@3.0.1': resolution: {integrity: sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA==} engines: {node: '>=18.0.0'} + '@smithy/util-endpoints@3.0.2': + resolution: {integrity: sha512-6QSutU5ZyrpNbnd51zRTL7goojlcnuOB55+F9VBD+j8JpRY50IGamsjlycrmpn8PQkmJucFW8A0LSfXj7jjtLQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-hex-encoding@4.0.0': resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} engines: {node: '>=18.0.0'} @@ -4308,14 +4580,26 @@ packages: resolution: {integrity: sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA==} engines: {node: '>=18.0.0'} + '@smithy/util-middleware@4.0.2': + resolution: {integrity: sha512-6GDamTGLuBQVAEuQ4yDQ+ti/YINf/MEmIegrEeg7DdB/sld8BX1lqt9RRuIcABOhAGTA50bRbPzErez7SlDtDQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-retry@4.0.1': resolution: {integrity: sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw==} engines: {node: '>=18.0.0'} + '@smithy/util-retry@4.0.2': + resolution: {integrity: sha512-Qryc+QG+7BCpvjloFLQrmlSd0RsVRHejRXd78jNO3+oREueCjwG1CCEH1vduw/ZkM1U9TztwIKVIi3+8MJScGg==} + engines: {node: '>=18.0.0'} + '@smithy/util-stream@4.1.2': resolution: {integrity: sha512-44PKEqQ303d3rlQuiDpcCcu//hV8sn+u2JBo84dWCE0rvgeiVl0IlLMagbU++o0jCWhYCsHaAt9wZuZqNe05Hw==} engines: {node: '>=18.0.0'} + '@smithy/util-stream@4.2.0': + resolution: {integrity: sha512-Vj1TtwWnuWqdgQI6YTUF5hQ/0jmFiOYsc51CSMgj7QfyO+RF4EnT2HNjoviNlOOmgzgvf3f5yno+EiC4vrnaWQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-uri-escape@4.0.0': resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} engines: {node: '>=18.0.0'} @@ -4332,6 +4616,10 @@ packages: resolution: {integrity: sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ==} engines: {node: '>=18.0.0'} + '@smithy/util-waiter@4.0.3': + resolution: {integrity: sha512-JtaY3FxmD+te+KSI2FJuEcfNC9T/DGGVf551babM7fAaXhjJUt7oSYurH1Devxd2+BOSUACCgt3buinx4UnmEA==} + engines: {node: '>=18.0.0'} + '@soerenmartius/vue3-clipboard@0.1.2': resolution: {integrity: sha512-a5er6cFGcFIQ/3qg6kWvU0yFqIz9iWoQGEVs9azjevyRyMAKvj1w3JuLH9y6+u0WhMNby3kn7nuR8nktSnDesg==} @@ -4341,9 +4629,84 @@ packages: '@sqltools/formatter@1.2.5': resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} + '@swc/core-darwin-arm64@1.11.22': + resolution: {integrity: sha512-upSiFQfo1TE2QM3+KpBcp5SrOdKKjoc+oUoD1mmBDU2Wv4Bjjv16Z2I5ADvIqMV+b87AhYW+4Qu6iVrQD7j96Q==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.11.22': + resolution: {integrity: sha512-8PEuF/gxIMJVK21DjuCOtzdqstn2DqnxVhpAYfXEtm3WmMqLIOIZBypF/xafAozyaHws4aB/5xmz8/7rPsjavw==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.11.22': + resolution: {integrity: sha512-NIPTXvqtn9e7oQHgdaxM9Z/anHoXC3Fg4ZAgw5rSGa1OlnKKupt5sdfJamNggSi+eAtyoFcyfkgqHnfe2u63HA==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.11.22': + resolution: {integrity: sha512-xZ+bgS60c5r8kAeYsLNjJJhhQNkXdidQ277pUabSlu5GjR0CkQUPQ+L9hFeHf8DITEqpPBPRiAiiJsWq5eqMBg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.11.22': + resolution: {integrity: sha512-JhrP/q5VqQl2eJR0xKYIkKTPjgf8CRsAmRnjJA2PtZhfQ543YbYvUqxyXSRyBOxdyX8JwzuAxIPEAlKlT7PPuQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.11.22': + resolution: {integrity: sha512-htmAVL+U01gk9GyziVUP0UWYaUQBgrsiP7Ytf6uDffrySyn/FclUS3MDPocNydqYsOpj3OpNKPxkaHK+F+X5fg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.11.22': + resolution: {integrity: sha512-PL0VHbduWPX+ANoyOzr58jBiL2VnD0xGSFwPy7NRZ1Pr6SNWm4jw3x2u6RjLArGhS5EcWp64BSk9ZxqmTV3FEg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.11.22': + resolution: {integrity: sha512-moJvFhhTVGoMeEThtdF7hQog80Q00CS06v5uB+32VRuv+I31+4WPRyGlTWHO+oY4rReNcXut/mlDHPH7p0LdFg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.11.22': + resolution: {integrity: sha512-/jnsPJJz89F1aKHIb5ScHkwyzBciz2AjEq2m9tDvQdIdVufdJ4SpEDEN9FqsRNRLcBHjtbLs6bnboA+B+pRFXw==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.11.22': + resolution: {integrity: sha512-lc93Y8Mku7LCFGqIxJ91coXZp2HeoDcFZSHCL90Wttg5xhk5xVM9uUCP+OdQsSsEixLF34h5DbT9ObzP8rAdRw==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.11.22': + resolution: {integrity: sha512-mjPYbqq8XjwqSE0hEPT9CzaJDyxql97LgK4iyvYlwVSQhdN1uK0DBG4eP9PxYzCS2MUGAXB34WFLegdUj5HGpg==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@swc/types@0.1.21': + resolution: {integrity: sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==} + '@szmarczak/http-timer@1.1.2': resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} engines: {node: '>=6'} @@ -12652,6 +13015,11 @@ packages: peerDependencies: vite: '>=2.0.0' + vite-plugin-dynamic-base@1.1.0: + resolution: {integrity: sha512-/hIOTuzedlPRiUTCIY1cJx7UDDUF0brxWIifE7xG1czCJy0Aw6k3QPbHVjPCs30YuU+WAgrX4ACOySLIp2NHkw==} + peerDependencies: + vite: '>= 2.9.5' + vite-plugin-html@3.2.2: resolution: {integrity: sha512-vb9C9kcdzcIo/Oc3CLZVS03dL5pDlOFuhGlZYDCJ840BhWl/0nGeZWf3Qy7NlOayscY4Cm/QRgULCQkEZige5Q==} peerDependencies: @@ -13476,20 +13844,20 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.775.0 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.775.0 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.775.0 '@aws-sdk/util-locate-window': 3.723.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -13499,7 +13867,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.775.0 '@aws-sdk/util-locate-window': 3.723.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -13507,7 +13875,7 @@ snapshots: '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.775.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -13516,7 +13884,7 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.775.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -13673,6 +14041,67 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/client-s3@3.787.0(aws-crt@1.25.3)': + dependencies: + '@aws-crypto/sha1-browser': 5.2.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.775.0 + '@aws-sdk/credential-provider-node': 3.787.0(aws-crt@1.25.3) + '@aws-sdk/middleware-bucket-endpoint': 3.775.0 + '@aws-sdk/middleware-expect-continue': 3.775.0 + '@aws-sdk/middleware-flexible-checksums': 3.787.0 + '@aws-sdk/middleware-host-header': 3.775.0 + '@aws-sdk/middleware-location-constraint': 3.775.0 + '@aws-sdk/middleware-logger': 3.775.0 + '@aws-sdk/middleware-recursion-detection': 3.775.0 + '@aws-sdk/middleware-sdk-s3': 3.775.0 + '@aws-sdk/middleware-ssec': 3.775.0 + '@aws-sdk/middleware-user-agent': 3.787.0 + '@aws-sdk/region-config-resolver': 3.775.0 + '@aws-sdk/signature-v4-multi-region': 3.775.0 + '@aws-sdk/types': 3.775.0 + '@aws-sdk/util-endpoints': 3.787.0 + '@aws-sdk/util-user-agent-browser': 3.775.0 + '@aws-sdk/util-user-agent-node': 3.787.0(aws-crt@1.25.3) + '@aws-sdk/xml-builder': 3.775.0 + '@smithy/config-resolver': 4.1.0 + '@smithy/core': 3.2.0 + '@smithy/eventstream-serde-browser': 4.0.2 + '@smithy/eventstream-serde-config-resolver': 4.1.0 + '@smithy/eventstream-serde-node': 4.0.2 + '@smithy/fetch-http-handler': 5.0.2 + '@smithy/hash-blob-browser': 4.0.2 + '@smithy/hash-node': 4.0.2 + '@smithy/hash-stream-node': 4.0.2 + '@smithy/invalid-dependency': 4.0.2 + '@smithy/md5-js': 4.0.2 + '@smithy/middleware-content-length': 4.0.2 + '@smithy/middleware-endpoint': 4.1.0 + '@smithy/middleware-retry': 4.1.0 + '@smithy/middleware-serde': 4.0.3 + '@smithy/middleware-stack': 4.0.2 + '@smithy/node-config-provider': 4.0.2 + '@smithy/node-http-handler': 4.0.4 + '@smithy/protocol-http': 5.1.0 + '@smithy/smithy-client': 4.2.0 + '@smithy/types': 4.2.0 + '@smithy/url-parser': 4.0.2 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.8 + '@smithy/util-defaults-mode-node': 4.0.8 + '@smithy/util-endpoints': 3.0.2 + '@smithy/util-middleware': 4.0.2 + '@smithy/util-retry': 4.0.2 + '@smithy/util-stream': 4.2.0 + '@smithy/util-utf8': 4.0.0 + '@smithy/util-waiter': 4.0.3 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/client-sso@3.758.0(aws-crt@1.25.3)': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -13716,6 +14145,49 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/client-sso@3.787.0(aws-crt@1.25.3)': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.775.0 + '@aws-sdk/middleware-host-header': 3.775.0 + '@aws-sdk/middleware-logger': 3.775.0 + '@aws-sdk/middleware-recursion-detection': 3.775.0 + '@aws-sdk/middleware-user-agent': 3.787.0 + '@aws-sdk/region-config-resolver': 3.775.0 + '@aws-sdk/types': 3.775.0 + '@aws-sdk/util-endpoints': 3.787.0 + '@aws-sdk/util-user-agent-browser': 3.775.0 + '@aws-sdk/util-user-agent-node': 3.787.0(aws-crt@1.25.3) + '@smithy/config-resolver': 4.1.0 + '@smithy/core': 3.2.0 + '@smithy/fetch-http-handler': 5.0.2 + '@smithy/hash-node': 4.0.2 + '@smithy/invalid-dependency': 4.0.2 + '@smithy/middleware-content-length': 4.0.2 + '@smithy/middleware-endpoint': 4.1.0 + '@smithy/middleware-retry': 4.1.0 + '@smithy/middleware-serde': 4.0.3 + '@smithy/middleware-stack': 4.0.2 + '@smithy/node-config-provider': 4.0.2 + '@smithy/node-http-handler': 4.0.4 + '@smithy/protocol-http': 5.1.0 + '@smithy/smithy-client': 4.2.0 + '@smithy/types': 4.2.0 + '@smithy/url-parser': 4.0.2 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.8 + '@smithy/util-defaults-mode-node': 4.0.8 + '@smithy/util-endpoints': 3.0.2 + '@smithy/util-middleware': 4.0.2 + '@smithy/util-retry': 4.0.2 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/core@3.758.0': dependencies: '@aws-sdk/types': 3.734.0 @@ -13730,6 +14202,20 @@ snapshots: fast-xml-parser: 4.4.1 tslib: 2.8.1 + '@aws-sdk/core@3.775.0': + dependencies: + '@aws-sdk/types': 3.775.0 + '@smithy/core': 3.2.0 + '@smithy/node-config-provider': 4.0.2 + '@smithy/property-provider': 4.0.2 + '@smithy/protocol-http': 5.1.0 + '@smithy/signature-v4': 5.1.0 + '@smithy/smithy-client': 4.2.0 + '@smithy/types': 4.2.0 + '@smithy/util-middleware': 4.0.2 + fast-xml-parser: 4.4.1 + tslib: 2.8.1 + '@aws-sdk/credential-provider-env@3.758.0': dependencies: '@aws-sdk/core': 3.758.0 @@ -13738,6 +14224,14 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@aws-sdk/credential-provider-env@3.775.0': + dependencies: + '@aws-sdk/core': 3.775.0 + '@aws-sdk/types': 3.775.0 + '@smithy/property-provider': 4.0.2 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@aws-sdk/credential-provider-http@3.758.0': dependencies: '@aws-sdk/core': 3.758.0 @@ -13751,6 +14245,19 @@ snapshots: '@smithy/util-stream': 4.1.2 tslib: 2.8.1 + '@aws-sdk/credential-provider-http@3.775.0': + dependencies: + '@aws-sdk/core': 3.775.0 + '@aws-sdk/types': 3.775.0 + '@smithy/fetch-http-handler': 5.0.2 + '@smithy/node-http-handler': 4.0.4 + '@smithy/property-provider': 4.0.2 + '@smithy/protocol-http': 5.1.0 + '@smithy/smithy-client': 4.2.0 + '@smithy/types': 4.2.0 + '@smithy/util-stream': 4.2.0 + tslib: 2.8.1 + '@aws-sdk/credential-provider-ini@3.758.0(aws-crt@1.25.3)': dependencies: '@aws-sdk/core': 3.758.0 @@ -13769,6 +14276,24 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-ini@3.787.0(aws-crt@1.25.3)': + dependencies: + '@aws-sdk/core': 3.775.0 + '@aws-sdk/credential-provider-env': 3.775.0 + '@aws-sdk/credential-provider-http': 3.775.0 + '@aws-sdk/credential-provider-process': 3.775.0 + '@aws-sdk/credential-provider-sso': 3.787.0(aws-crt@1.25.3) + '@aws-sdk/credential-provider-web-identity': 3.787.0(aws-crt@1.25.3) + '@aws-sdk/nested-clients': 3.787.0(aws-crt@1.25.3) + '@aws-sdk/types': 3.775.0 + '@smithy/credential-provider-imds': 4.0.2 + '@smithy/property-provider': 4.0.2 + '@smithy/shared-ini-file-loader': 4.0.2 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-node@3.758.0(aws-crt@1.25.3)': dependencies: '@aws-sdk/credential-provider-env': 3.758.0 @@ -13786,6 +14311,23 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-node@3.787.0(aws-crt@1.25.3)': + dependencies: + '@aws-sdk/credential-provider-env': 3.775.0 + '@aws-sdk/credential-provider-http': 3.775.0 + '@aws-sdk/credential-provider-ini': 3.787.0(aws-crt@1.25.3) + '@aws-sdk/credential-provider-process': 3.775.0 + '@aws-sdk/credential-provider-sso': 3.787.0(aws-crt@1.25.3) + '@aws-sdk/credential-provider-web-identity': 3.787.0(aws-crt@1.25.3) + '@aws-sdk/types': 3.775.0 + '@smithy/credential-provider-imds': 4.0.2 + '@smithy/property-provider': 4.0.2 + '@smithy/shared-ini-file-loader': 4.0.2 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-process@3.758.0': dependencies: '@aws-sdk/core': 3.758.0 @@ -13795,6 +14337,15 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@aws-sdk/credential-provider-process@3.775.0': + dependencies: + '@aws-sdk/core': 3.775.0 + '@aws-sdk/types': 3.775.0 + '@smithy/property-provider': 4.0.2 + '@smithy/shared-ini-file-loader': 4.0.2 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@aws-sdk/credential-provider-sso@3.758.0(aws-crt@1.25.3)': dependencies: '@aws-sdk/client-sso': 3.758.0(aws-crt@1.25.3) @@ -13808,6 +14359,19 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-sso@3.787.0(aws-crt@1.25.3)': + dependencies: + '@aws-sdk/client-sso': 3.787.0(aws-crt@1.25.3) + '@aws-sdk/core': 3.775.0 + '@aws-sdk/token-providers': 3.787.0(aws-crt@1.25.3) + '@aws-sdk/types': 3.775.0 + '@smithy/property-provider': 4.0.2 + '@smithy/shared-ini-file-loader': 4.0.2 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/credential-provider-web-identity@3.758.0(aws-crt@1.25.3)': dependencies: '@aws-sdk/core': 3.758.0 @@ -13819,6 +14383,17 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-web-identity@3.787.0(aws-crt@1.25.3)': + dependencies: + '@aws-sdk/core': 3.775.0 + '@aws-sdk/nested-clients': 3.787.0(aws-crt@1.25.3) + '@aws-sdk/types': 3.775.0 + '@smithy/property-provider': 4.0.2 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/crt-loader@3.758.0': dependencies: '@aws-sdk/util-user-agent-node': 3.758.0(aws-crt@1.25.3) @@ -13840,6 +14415,16 @@ snapshots: '@smithy/util-config-provider': 4.0.0 tslib: 2.8.1 + '@aws-sdk/middleware-bucket-endpoint@3.775.0': + dependencies: + '@aws-sdk/types': 3.775.0 + '@aws-sdk/util-arn-parser': 3.723.0 + '@smithy/node-config-provider': 4.0.2 + '@smithy/protocol-http': 5.1.0 + '@smithy/types': 4.2.0 + '@smithy/util-config-provider': 4.0.0 + tslib: 2.8.1 + '@aws-sdk/middleware-expect-continue@3.734.0': dependencies: '@aws-sdk/types': 3.734.0 @@ -13847,6 +14432,13 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@aws-sdk/middleware-expect-continue@3.775.0': + dependencies: + '@aws-sdk/types': 3.775.0 + '@smithy/protocol-http': 5.1.0 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@aws-sdk/middleware-flexible-checksums@3.758.0': dependencies: '@aws-crypto/crc32': 5.2.0 @@ -13863,6 +14455,22 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 + '@aws-sdk/middleware-flexible-checksums@3.787.0': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/core': 3.775.0 + '@aws-sdk/types': 3.775.0 + '@smithy/is-array-buffer': 4.0.0 + '@smithy/node-config-provider': 4.0.2 + '@smithy/protocol-http': 5.1.0 + '@smithy/types': 4.2.0 + '@smithy/util-middleware': 4.0.2 + '@smithy/util-stream': 4.2.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@aws-sdk/middleware-host-header@3.734.0': dependencies: '@aws-sdk/types': 3.734.0 @@ -13870,18 +14478,37 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@aws-sdk/middleware-host-header@3.775.0': + dependencies: + '@aws-sdk/types': 3.775.0 + '@smithy/protocol-http': 5.1.0 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@aws-sdk/middleware-location-constraint@3.734.0': dependencies: '@aws-sdk/types': 3.734.0 '@smithy/types': 4.1.0 tslib: 2.8.1 + '@aws-sdk/middleware-location-constraint@3.775.0': + dependencies: + '@aws-sdk/types': 3.775.0 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@aws-sdk/middleware-logger@3.734.0': dependencies: '@aws-sdk/types': 3.734.0 '@smithy/types': 4.1.0 tslib: 2.8.1 + '@aws-sdk/middleware-logger@3.775.0': + dependencies: + '@aws-sdk/types': 3.775.0 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@aws-sdk/middleware-recursion-detection@3.734.0': dependencies: '@aws-sdk/types': 3.734.0 @@ -13889,6 +14516,13 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@aws-sdk/middleware-recursion-detection@3.775.0': + dependencies: + '@aws-sdk/types': 3.775.0 + '@smithy/protocol-http': 5.1.0 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@aws-sdk/middleware-sdk-s3@3.758.0': dependencies: '@aws-sdk/core': 3.758.0 @@ -13906,12 +14540,35 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 + '@aws-sdk/middleware-sdk-s3@3.775.0': + dependencies: + '@aws-sdk/core': 3.775.0 + '@aws-sdk/types': 3.775.0 + '@aws-sdk/util-arn-parser': 3.723.0 + '@smithy/core': 3.2.0 + '@smithy/node-config-provider': 4.0.2 + '@smithy/protocol-http': 5.1.0 + '@smithy/signature-v4': 5.1.0 + '@smithy/smithy-client': 4.2.0 + '@smithy/types': 4.2.0 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.2 + '@smithy/util-stream': 4.2.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@aws-sdk/middleware-ssec@3.734.0': dependencies: '@aws-sdk/types': 3.734.0 '@smithy/types': 4.1.0 tslib: 2.8.1 + '@aws-sdk/middleware-ssec@3.775.0': + dependencies: + '@aws-sdk/types': 3.775.0 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@aws-sdk/middleware-user-agent@3.758.0': dependencies: '@aws-sdk/core': 3.758.0 @@ -13922,6 +14579,16 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@aws-sdk/middleware-user-agent@3.787.0': + dependencies: + '@aws-sdk/core': 3.775.0 + '@aws-sdk/types': 3.775.0 + '@aws-sdk/util-endpoints': 3.787.0 + '@smithy/core': 3.2.0 + '@smithy/protocol-http': 5.1.0 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@aws-sdk/nested-clients@3.758.0(aws-crt@1.25.3)': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -13965,6 +14632,49 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/nested-clients@3.787.0(aws-crt@1.25.3)': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.775.0 + '@aws-sdk/middleware-host-header': 3.775.0 + '@aws-sdk/middleware-logger': 3.775.0 + '@aws-sdk/middleware-recursion-detection': 3.775.0 + '@aws-sdk/middleware-user-agent': 3.787.0 + '@aws-sdk/region-config-resolver': 3.775.0 + '@aws-sdk/types': 3.775.0 + '@aws-sdk/util-endpoints': 3.787.0 + '@aws-sdk/util-user-agent-browser': 3.775.0 + '@aws-sdk/util-user-agent-node': 3.787.0(aws-crt@1.25.3) + '@smithy/config-resolver': 4.1.0 + '@smithy/core': 3.2.0 + '@smithy/fetch-http-handler': 5.0.2 + '@smithy/hash-node': 4.0.2 + '@smithy/invalid-dependency': 4.0.2 + '@smithy/middleware-content-length': 4.0.2 + '@smithy/middleware-endpoint': 4.1.0 + '@smithy/middleware-retry': 4.1.0 + '@smithy/middleware-serde': 4.0.3 + '@smithy/middleware-stack': 4.0.2 + '@smithy/node-config-provider': 4.0.2 + '@smithy/node-http-handler': 4.0.4 + '@smithy/protocol-http': 5.1.0 + '@smithy/smithy-client': 4.2.0 + '@smithy/types': 4.2.0 + '@smithy/url-parser': 4.0.2 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.8 + '@smithy/util-defaults-mode-node': 4.0.8 + '@smithy/util-endpoints': 3.0.2 + '@smithy/util-middleware': 4.0.2 + '@smithy/util-retry': 4.0.2 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/region-config-resolver@3.734.0': dependencies: '@aws-sdk/types': 3.734.0 @@ -13974,6 +14684,15 @@ snapshots: '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 + '@aws-sdk/region-config-resolver@3.775.0': + dependencies: + '@aws-sdk/types': 3.775.0 + '@smithy/node-config-provider': 4.0.2 + '@smithy/types': 4.2.0 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.2 + tslib: 2.8.1 + '@aws-sdk/s3-request-presigner@3.758.0': dependencies: '@aws-sdk/signature-v4-multi-region': 3.758.0 @@ -14010,6 +14729,15 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@aws-sdk/signature-v4-multi-region@3.775.0': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.775.0 + '@aws-sdk/types': 3.775.0 + '@smithy/protocol-http': 5.1.0 + '@smithy/signature-v4': 5.1.0 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@aws-sdk/token-providers@3.758.0(aws-crt@1.25.3)': dependencies: '@aws-sdk/nested-clients': 3.758.0(aws-crt@1.25.3) @@ -14021,11 +14749,27 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/token-providers@3.787.0(aws-crt@1.25.3)': + dependencies: + '@aws-sdk/nested-clients': 3.787.0(aws-crt@1.25.3) + '@aws-sdk/types': 3.775.0 + '@smithy/property-provider': 4.0.2 + '@smithy/shared-ini-file-loader': 4.0.2 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/types@3.734.0': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@aws-sdk/types@3.775.0': + dependencies: + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@aws-sdk/util-arn-parser@3.723.0': dependencies: tslib: 2.8.1 @@ -14037,6 +14781,13 @@ snapshots: '@smithy/util-endpoints': 3.0.1 tslib: 2.8.1 + '@aws-sdk/util-endpoints@3.787.0': + dependencies: + '@aws-sdk/types': 3.775.0 + '@smithy/types': 4.2.0 + '@smithy/util-endpoints': 3.0.2 + tslib: 2.8.1 + '@aws-sdk/util-format-url@3.734.0': dependencies: '@aws-sdk/types': 3.734.0 @@ -14055,6 +14806,13 @@ snapshots: bowser: 2.11.0 tslib: 2.8.1 + '@aws-sdk/util-user-agent-browser@3.775.0': + dependencies: + '@aws-sdk/types': 3.775.0 + '@smithy/types': 4.2.0 + bowser: 2.11.0 + tslib: 2.8.1 + '@aws-sdk/util-user-agent-node@3.758.0(aws-crt@1.25.3)': dependencies: '@aws-sdk/middleware-user-agent': 3.758.0 @@ -14065,6 +14823,16 @@ snapshots: optionalDependencies: aws-crt: 1.25.3 + '@aws-sdk/util-user-agent-node@3.787.0(aws-crt@1.25.3)': + dependencies: + '@aws-sdk/middleware-user-agent': 3.787.0 + '@aws-sdk/types': 3.775.0 + '@smithy/node-config-provider': 4.0.2 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + optionalDependencies: + aws-crt: 1.25.3 + '@aws-sdk/util-utf8-browser@3.259.0': dependencies: tslib: 2.8.1 @@ -14074,6 +14842,11 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@aws-sdk/xml-builder@3.775.0': + dependencies: + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@babel/code-frame@7.12.11': dependencies: '@babel/highlight': 7.25.9 @@ -16643,6 +17416,11 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/abort-controller@4.0.2': + dependencies: + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/chunked-blob-reader-native@4.0.0': dependencies: '@smithy/util-base64': 4.0.0 @@ -16660,6 +17438,14 @@ snapshots: '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 + '@smithy/config-resolver@4.1.0': + dependencies: + '@smithy/node-config-provider': 4.0.2 + '@smithy/types': 4.2.0 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.2 + tslib: 2.8.1 + '@smithy/core@3.1.5': dependencies: '@smithy/middleware-serde': 4.0.2 @@ -16671,6 +17457,17 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 + '@smithy/core@3.2.0': + dependencies: + '@smithy/middleware-serde': 4.0.3 + '@smithy/protocol-http': 5.1.0 + '@smithy/types': 4.2.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-middleware': 4.0.2 + '@smithy/util-stream': 4.2.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@smithy/credential-provider-imds@4.0.1': dependencies: '@smithy/node-config-provider': 4.0.1 @@ -16679,6 +17476,14 @@ snapshots: '@smithy/url-parser': 4.0.1 tslib: 2.8.1 + '@smithy/credential-provider-imds@4.0.2': + dependencies: + '@smithy/node-config-provider': 4.0.2 + '@smithy/property-provider': 4.0.2 + '@smithy/types': 4.2.0 + '@smithy/url-parser': 4.0.2 + tslib: 2.8.1 + '@smithy/eventstream-codec@4.0.1': dependencies: '@aws-crypto/crc32': 5.2.0 @@ -16686,29 +17491,59 @@ snapshots: '@smithy/util-hex-encoding': 4.0.0 tslib: 2.8.1 + '@smithy/eventstream-codec@4.0.2': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.2.0 + '@smithy/util-hex-encoding': 4.0.0 + tslib: 2.8.1 + '@smithy/eventstream-serde-browser@4.0.1': dependencies: '@smithy/eventstream-serde-universal': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/eventstream-serde-browser@4.0.2': + dependencies: + '@smithy/eventstream-serde-universal': 4.0.2 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/eventstream-serde-config-resolver@4.0.1': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/eventstream-serde-config-resolver@4.1.0': + dependencies: + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/eventstream-serde-node@4.0.1': dependencies: '@smithy/eventstream-serde-universal': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/eventstream-serde-node@4.0.2': + dependencies: + '@smithy/eventstream-serde-universal': 4.0.2 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/eventstream-serde-universal@4.0.1': dependencies: '@smithy/eventstream-codec': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/eventstream-serde-universal@4.0.2': + dependencies: + '@smithy/eventstream-codec': 4.0.2 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/fetch-http-handler@5.0.1': dependencies: '@smithy/protocol-http': 5.0.1 @@ -16717,6 +17552,14 @@ snapshots: '@smithy/util-base64': 4.0.0 tslib: 2.8.1 + '@smithy/fetch-http-handler@5.0.2': + dependencies: + '@smithy/protocol-http': 5.1.0 + '@smithy/querystring-builder': 4.0.2 + '@smithy/types': 4.2.0 + '@smithy/util-base64': 4.0.0 + tslib: 2.8.1 + '@smithy/hash-blob-browser@4.0.1': dependencies: '@smithy/chunked-blob-reader': 5.0.0 @@ -16724,6 +17567,13 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/hash-blob-browser@4.0.2': + dependencies: + '@smithy/chunked-blob-reader': 5.0.0 + '@smithy/chunked-blob-reader-native': 4.0.0 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/hash-node@4.0.1': dependencies: '@smithy/types': 4.1.0 @@ -16731,17 +17581,35 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 + '@smithy/hash-node@4.0.2': + dependencies: + '@smithy/types': 4.2.0 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@smithy/hash-stream-node@4.0.1': dependencies: '@smithy/types': 4.1.0 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 + '@smithy/hash-stream-node@4.0.2': + dependencies: + '@smithy/types': 4.2.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@smithy/invalid-dependency@4.0.1': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/invalid-dependency@4.0.2': + dependencies: + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 @@ -16756,12 +17624,24 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 + '@smithy/md5-js@4.0.2': + dependencies: + '@smithy/types': 4.2.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@smithy/middleware-content-length@4.0.1': dependencies: '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/middleware-content-length@4.0.2': + dependencies: + '@smithy/protocol-http': 5.1.0 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/middleware-endpoint@4.0.6': dependencies: '@smithy/core': 3.1.5 @@ -16773,6 +17653,17 @@ snapshots: '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 + '@smithy/middleware-endpoint@4.1.0': + dependencies: + '@smithy/core': 3.2.0 + '@smithy/middleware-serde': 4.0.3 + '@smithy/node-config-provider': 4.0.2 + '@smithy/shared-ini-file-loader': 4.0.2 + '@smithy/types': 4.2.0 + '@smithy/url-parser': 4.0.2 + '@smithy/util-middleware': 4.0.2 + tslib: 2.8.1 + '@smithy/middleware-retry@4.0.7': dependencies: '@smithy/node-config-provider': 4.0.1 @@ -16785,16 +17676,38 @@ snapshots: tslib: 2.8.1 uuid: 9.0.1 + '@smithy/middleware-retry@4.1.0': + dependencies: + '@smithy/node-config-provider': 4.0.2 + '@smithy/protocol-http': 5.1.0 + '@smithy/service-error-classification': 4.0.2 + '@smithy/smithy-client': 4.2.0 + '@smithy/types': 4.2.0 + '@smithy/util-middleware': 4.0.2 + '@smithy/util-retry': 4.0.2 + tslib: 2.8.1 + uuid: 9.0.1 + '@smithy/middleware-serde@4.0.2': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/middleware-serde@4.0.3': + dependencies: + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/middleware-stack@4.0.1': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/middleware-stack@4.0.2': + dependencies: + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/node-config-provider@4.0.1': dependencies: '@smithy/property-provider': 4.0.1 @@ -16802,6 +17715,13 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/node-config-provider@4.0.2': + dependencies: + '@smithy/property-provider': 4.0.2 + '@smithy/shared-ini-file-loader': 4.0.2 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/node-http-handler@4.0.3': dependencies: '@smithy/abort-controller': 4.0.1 @@ -16810,36 +17730,74 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/node-http-handler@4.0.4': + dependencies: + '@smithy/abort-controller': 4.0.2 + '@smithy/protocol-http': 5.1.0 + '@smithy/querystring-builder': 4.0.2 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/property-provider@4.0.1': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/property-provider@4.0.2': + dependencies: + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/protocol-http@5.0.1': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/protocol-http@5.1.0': + dependencies: + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/querystring-builder@4.0.1': dependencies: '@smithy/types': 4.1.0 '@smithy/util-uri-escape': 4.0.0 tslib: 2.8.1 + '@smithy/querystring-builder@4.0.2': + dependencies: + '@smithy/types': 4.2.0 + '@smithy/util-uri-escape': 4.0.0 + tslib: 2.8.1 + '@smithy/querystring-parser@4.0.1': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/querystring-parser@4.0.2': + dependencies: + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/service-error-classification@4.0.1': dependencies: '@smithy/types': 4.1.0 + '@smithy/service-error-classification@4.0.2': + dependencies: + '@smithy/types': 4.2.0 + '@smithy/shared-ini-file-loader@4.0.1': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/shared-ini-file-loader@4.0.2': + dependencies: + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/signature-v4@5.0.1': dependencies: '@smithy/is-array-buffer': 4.0.0 @@ -16851,6 +17809,17 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 + '@smithy/signature-v4@5.1.0': + dependencies: + '@smithy/is-array-buffer': 4.0.0 + '@smithy/protocol-http': 5.1.0 + '@smithy/types': 4.2.0 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-middleware': 4.0.2 + '@smithy/util-uri-escape': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@smithy/smithy-client@4.1.6': dependencies: '@smithy/core': 3.1.5 @@ -16861,16 +17830,36 @@ snapshots: '@smithy/util-stream': 4.1.2 tslib: 2.8.1 + '@smithy/smithy-client@4.2.0': + dependencies: + '@smithy/core': 3.2.0 + '@smithy/middleware-endpoint': 4.1.0 + '@smithy/middleware-stack': 4.0.2 + '@smithy/protocol-http': 5.1.0 + '@smithy/types': 4.2.0 + '@smithy/util-stream': 4.2.0 + tslib: 2.8.1 + '@smithy/types@4.1.0': dependencies: tslib: 2.8.1 + '@smithy/types@4.2.0': + dependencies: + tslib: 2.8.1 + '@smithy/url-parser@4.0.1': dependencies: '@smithy/querystring-parser': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/url-parser@4.0.2': + dependencies: + '@smithy/querystring-parser': 4.0.2 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/util-base64@4.0.0': dependencies: '@smithy/util-buffer-from': 4.0.0 @@ -16907,6 +17896,14 @@ snapshots: bowser: 2.11.0 tslib: 2.8.1 + '@smithy/util-defaults-mode-browser@4.0.8': + dependencies: + '@smithy/property-provider': 4.0.2 + '@smithy/smithy-client': 4.2.0 + '@smithy/types': 4.2.0 + bowser: 2.11.0 + tslib: 2.8.1 + '@smithy/util-defaults-mode-node@4.0.7': dependencies: '@smithy/config-resolver': 4.0.1 @@ -16917,12 +17914,28 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/util-defaults-mode-node@4.0.8': + dependencies: + '@smithy/config-resolver': 4.1.0 + '@smithy/credential-provider-imds': 4.0.2 + '@smithy/node-config-provider': 4.0.2 + '@smithy/property-provider': 4.0.2 + '@smithy/smithy-client': 4.2.0 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/util-endpoints@3.0.1': dependencies: '@smithy/node-config-provider': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/util-endpoints@3.0.2': + dependencies: + '@smithy/node-config-provider': 4.0.2 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/util-hex-encoding@4.0.0': dependencies: tslib: 2.8.1 @@ -16932,12 +17945,23 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/util-middleware@4.0.2': + dependencies: + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/util-retry@4.0.1': dependencies: '@smithy/service-error-classification': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/util-retry@4.0.2': + dependencies: + '@smithy/service-error-classification': 4.0.2 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@smithy/util-stream@4.1.2': dependencies: '@smithy/fetch-http-handler': 5.0.1 @@ -16949,6 +17973,17 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 + '@smithy/util-stream@4.2.0': + dependencies: + '@smithy/fetch-http-handler': 5.0.2 + '@smithy/node-http-handler': 4.0.4 + '@smithy/types': 4.2.0 + '@smithy/util-base64': 4.0.0 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@smithy/util-uri-escape@4.0.0': dependencies: tslib: 2.8.1 @@ -16969,6 +18004,12 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 + '@smithy/util-waiter@4.0.3': + dependencies: + '@smithy/abort-controller': 4.0.2 + '@smithy/types': 4.2.0 + tslib: 2.8.1 + '@soerenmartius/vue3-clipboard@0.1.2': dependencies: clipboard: 2.0.11 @@ -16977,10 +18018,62 @@ snapshots: '@sqltools/formatter@1.2.5': {} + '@swc/core-darwin-arm64@1.11.22': + optional: true + + '@swc/core-darwin-x64@1.11.22': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.11.22': + optional: true + + '@swc/core-linux-arm64-gnu@1.11.22': + optional: true + + '@swc/core-linux-arm64-musl@1.11.22': + optional: true + + '@swc/core-linux-x64-gnu@1.11.22': + optional: true + + '@swc/core-linux-x64-musl@1.11.22': + optional: true + + '@swc/core-win32-arm64-msvc@1.11.22': + optional: true + + '@swc/core-win32-ia32-msvc@1.11.22': + optional: true + + '@swc/core-win32-x64-msvc@1.11.22': + optional: true + + '@swc/core@1.11.22': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.21 + optionalDependencies: + '@swc/core-darwin-arm64': 1.11.22 + '@swc/core-darwin-x64': 1.11.22 + '@swc/core-linux-arm-gnueabihf': 1.11.22 + '@swc/core-linux-arm64-gnu': 1.11.22 + '@swc/core-linux-arm64-musl': 1.11.22 + '@swc/core-linux-x64-gnu': 1.11.22 + '@swc/core-linux-x64-musl': 1.11.22 + '@swc/core-win32-arm64-msvc': 1.11.22 + '@swc/core-win32-ia32-msvc': 1.11.22 + '@swc/core-win32-x64-msvc': 1.11.22 + + '@swc/counter@0.1.3': {} + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 + '@swc/types@0.1.21': + dependencies: + '@swc/counter': 0.1.3 + '@szmarczak/http-timer@1.1.2': dependencies: defer-to-connect: 1.1.3 @@ -16990,13 +18083,13 @@ snapshots: postcss: 8.5.3 postcss-nested: 5.0.6(postcss@8.5.3) - '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2)))': + '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2)) '@tanstack/store@0.7.0': {} @@ -20676,13 +21769,13 @@ snapshots: resolve: 1.22.10 semver: 6.3.1 - eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.10.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.8.8): + eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.10.0(eslint@8.57.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@7.32.0) + eslint-config-prettier: 8.10.0(eslint@8.57.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: @@ -23396,7 +24489,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@7.32.0))(eslint@7.32.0)(prettier@2.8.8) + eslint-plugin-prettier: 3.4.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@7.32.0)(prettier@2.8.8) execa: 5.1.1 inquirer: 7.3.3 json5: 2.2.3 @@ -24338,13 +25431,13 @@ snapshots: '@csstools/utilities': 2.0.0(postcss@8.5.3) postcss: 8.5.3 - postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2)): + postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2)): dependencies: lilconfig: 3.1.3 yaml: 2.7.0 optionalDependencies: postcss: 8.5.3 - ts-node: 10.9.2(@types/node@18.19.80)(typescript@5.8.2) + ts-node: 10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2) postcss-logical@8.1.0(postcss@8.5.3): dependencies: @@ -26103,11 +27196,11 @@ snapshots: tailwind-merge@3.0.2: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2))): dependencies: - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2)) - tailwindcss@3.4.17(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2)): + tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -26126,7 +27219,7 @@ snapshots: postcss: 8.5.3 postcss-import: 15.1.0(postcss@8.5.3) postcss-js: 4.0.1(postcss@8.5.3) - postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2)) + postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2)) postcss-nested: 6.2.0(postcss@8.5.3) postcss-selector-parser: 6.1.2 resolve: 1.22.10 @@ -26338,7 +27431,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2): + ts-node@10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -26355,6 +27448,8 @@ snapshots: typescript: 5.8.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.11.22 tsc-alias@1.8.11: dependencies: @@ -26522,7 +27617,7 @@ snapshots: typedarray@0.0.6: {} - typeorm@0.3.21(better-sqlite3@11.8.1)(mysql2@3.14.0)(pg@8.13.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2)): + typeorm@0.3.21(better-sqlite3@11.8.1)(mysql2@3.14.0)(pg@8.13.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2)): dependencies: '@sqltools/formatter': 1.2.5 ansis: 3.17.0 @@ -26542,7 +27637,7 @@ snapshots: better-sqlite3: 11.8.1 mysql2: 3.14.0 pg: 8.13.3 - ts-node: 10.9.2(@types/node@18.19.80)(typescript@5.8.2) + ts-node: 10.9.2(@swc/core@1.11.22)(@types/node@18.19.80)(typescript@5.8.2) transitivePeerDependencies: - supports-color @@ -26893,6 +27988,14 @@ snapshots: transitivePeerDependencies: - supports-color + vite-plugin-dynamic-base@1.1.0(vite@5.4.14(@types/node@18.19.80)(less@4.2.2)(terser@5.39.0)): + dependencies: + '@swc/core': 1.11.22 + node-html-parser: 5.4.2 + vite: 5.4.14(@types/node@18.19.80)(less@4.2.2)(terser@5.39.0) + transitivePeerDependencies: + - '@swc/helpers' + vite-plugin-html@3.2.2(vite@5.4.14(@types/node@18.19.80)(less@4.2.2)(terser@5.39.0)): dependencies: '@rollup/pluginutils': 4.2.1