diff --git a/packages/core/acme-client/package.json b/packages/core/acme-client/package.json index 0318a365..94a56248 100644 --- a/packages/core/acme-client/package.json +++ b/packages/core/acme-client/package.json @@ -34,7 +34,7 @@ "mocha": "^10.6.0", "nock": "^13.5.4", "tsd": "^0.31.1", - "typescript": "^4.8.4", + "typescript": "^5.4.2", "uuid": "^8.3.2" }, "scripts": { diff --git a/packages/core/pipeline/package.json b/packages/core/pipeline/package.json index 4960c70f..08a8393c 100644 --- a/packages/core/pipeline/package.json +++ b/packages/core/pipeline/package.json @@ -21,6 +21,7 @@ "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.5", "lodash-es": "^4.17.21", + "lru-cache": "^10.0.0", "node-forge": "^1.3.1", "nodemailer": "^6.9.3", "proxy-agent": "^6.4.0", @@ -58,7 +59,7 @@ "ts-node": "^10.9.1", "tsc-esm-fix": "^3.0.0", "tslib": "^2.5.2", - "typescript": "^5.0.4", + "typescript": "^5.4.2", "vite": "^4.3.8", "vue-tsc": "^1.6.5" }, diff --git a/packages/core/pipeline/src/core/handler.ts b/packages/core/pipeline/src/core/handler.ts index 8180a627..bd2b39b2 100644 --- a/packages/core/pipeline/src/core/handler.ts +++ b/packages/core/pipeline/src/core/handler.ts @@ -1,21 +1,28 @@ import _ from "lodash-es"; -import { HttpClient, ILogger } from "../utils"; +import { HttpClient, ILogger, utils } from "../utils"; -export type PluginRequest = { - type: "plugin" | "access"; +export type PluginRequestHandleReq = { typeName: string; action: string; - input: any; + input: T; data: any; }; -export type RequestHandleContext = { +export type AccessRequestHandleReqInput = { + id?: number; + title?: string; + access: T; +}; +export type AccessRequestHandleReq = PluginRequestHandleReq>; + +export type AccessRequestHandleContext = { http: HttpClient; logger: ILogger; + utils: typeof utils; }; -export class RequestHandler { - async onRequest(req: PluginRequest, ctx: RequestHandleContext) { +export class AccessRequestHandler { + async onRequest(req: AccessRequestHandleReq, ctx: AccessRequestHandleContext) { if (!req.action) { throw new Error("action is required"); } @@ -31,3 +38,4 @@ export class RequestHandler { throw new Error(`action ${req.action} not found`); } } + diff --git a/packages/core/pipeline/src/plugin/api.ts b/packages/core/pipeline/src/plugin/api.ts index 4daac8f2..4c244009 100644 --- a/packages/core/pipeline/src/plugin/api.ts +++ b/packages/core/pipeline/src/plugin/api.ts @@ -4,11 +4,12 @@ import { FileStore } from "../core/file-store.js"; import { Logger } from "log4js"; import { IAccessService } from "../access/index.js"; import { IEmailService } from "../service/index.js"; -import { IContext } from "../core/index.js"; -import { ILogger, logger } from "../utils/index.js"; +import { IContext, PluginRequestHandleReq } from "../core/index.js"; +import { ILogger, logger, utils } from "../utils/index.js"; import { HttpClient } from "../utils/util.request"; -import { utils } from "../utils/index.js"; import dayjs from "dayjs"; +import _ from "lodash-es"; + export enum ContextScope { global, pipeline, @@ -38,18 +39,13 @@ export type PluginDefine = Registrable & { [key: string]: any; }; - reference?: { - src: string; - dest: string; - type: "computed"; - }[]; - needPlus?: boolean; }; export type ITaskPlugin = { onInstance(): Promise; execute(): Promise; + onRequest(req: PluginRequestHandleReq): Promise; [key: string]: any; }; @@ -107,6 +103,17 @@ export abstract class AbstractTaskPlugin implements ITaskPlugin { this.accessService = ctx.accessService; } + async getAccess(accessId: string) { + if (accessId == null) { + throw new Error("您还没有配置授权"); + } + const res = await this.ctx.accessService.getById(accessId); + if (res == null) { + throw new Error("授权不存在,可能已被删除,请前往任务配置里面重新选择授权"); + } + return res; + } + randomFileId() { return Math.random().toString(36).substring(2, 9); } @@ -147,6 +154,22 @@ export abstract class AbstractTaskPlugin implements ITaskPlugin { } return name + "_" + dayjs().format("YYYYMMDDHHmmss"); } + + async onRequest(req: PluginRequestHandleReq) { + if (!req.action) { + throw new Error("action is required"); + } + + const methodName = `on${_.upperFirst(req.action)}`; + + // @ts-ignore + const method = this[methodName]; + if (method) { + // @ts-ignore + return await this[methodName](req.data); + } + throw new Error(`action ${req.action} not found`); + } } export type OutputVO = { diff --git a/packages/core/pipeline/src/plugin/group.ts b/packages/core/pipeline/src/plugin/group.ts index 73d62d20..78c56bb5 100644 --- a/packages/core/pipeline/src/plugin/group.ts +++ b/packages/core/pipeline/src/plugin/group.ts @@ -22,5 +22,6 @@ export const pluginGroups = { tencent: new PluginGroup("tencent", "腾讯云", 4), host: new PluginGroup("host", "主机", 5), cdn: new PluginGroup("cdn", "CDN", 6), - other: new PluginGroup("other", "其他", 7), + panel: new PluginGroup("panel", "面板", 7), + other: new PluginGroup("other", "其他", 8), }; diff --git a/packages/core/pipeline/src/utils/index.ts b/packages/core/pipeline/src/utils/index.ts index 972d453b..da79d8fb 100644 --- a/packages/core/pipeline/src/utils/index.ts +++ b/packages/core/pipeline/src/utils/index.ts @@ -6,11 +6,15 @@ export * from "./util.file.js"; export * from "./util.sp.js"; export * from "./util.promise.js"; export * from "./util.hash.js"; +export * from "./util.merge.js"; +export * from "./util.cache.js"; +import { mergeUtils } from "./util.merge.js"; import { sp } from "./util.sp.js"; import { hashUtils } from "./util.hash.js"; import { promises } from "./util.promise.js"; import { fileUtils } from "./util.file.js"; import _ from "lodash-es"; +import { cache } from "./util.cache.js"; export const utils = { sleep, http, @@ -19,4 +23,6 @@ export const utils = { promises, file: fileUtils, _, + mergeUtils, + cache, }; diff --git a/packages/core/pipeline/src/utils/util.cache.ts b/packages/core/pipeline/src/utils/util.cache.ts new file mode 100644 index 00000000..132a5532 --- /dev/null +++ b/packages/core/pipeline/src/utils/util.cache.ts @@ -0,0 +1,8 @@ +// LRUCache + +import { LRUCache } from "lru-cache"; + +export const cache = new LRUCache({ + max: 1000, + ttl: 1000 * 60 * 10, +}); diff --git a/packages/core/pipeline/src/utils/util.merge.ts b/packages/core/pipeline/src/utils/util.merge.ts new file mode 100644 index 00000000..72d5fc40 --- /dev/null +++ b/packages/core/pipeline/src/utils/util.merge.ts @@ -0,0 +1,64 @@ +import _ from "lodash-es"; +function isUnMergeable(srcValue: any) { + return srcValue != null && srcValue instanceof UnMergeable; +} +function isUnCloneable(value: any) { + return isUnMergeable(value) && !value.cloneable; +} +function merge(target: any, ...sources: any) { + /** + * 如果目标为不可合并对象,比如array、unMergeable、ref,则直接覆盖不合并 + * @param objValue 被合并对象 + * @param srcValue 来源对象 + */ + function customizer(objValue: any, srcValue: any) { + if (srcValue == null) { + return; + } + // 如果被合并对象为数组,则直接被覆盖对象覆盖,只要覆盖对象不为空 + if (_.isArray(objValue)) { + //原对象如果是数组 + return srcValue; //来源对象 + } + + if (isUnMergeable(srcValue)) { + return srcValue; + } + } + + let found: any = null; + for (const item of sources) { + if (isUnMergeable(item)) { + found = item; + } + } + if (found) { + return found; + } + return _.mergeWith(target, ...sources, customizer); +} + +function cloneDeep(target: any) { + if (isUnCloneable(target)) { + return target; + } + function customizer(value: any) { + if (isUnCloneable(value)) { + return value; + } + } + + return _.cloneDeepWith(target, customizer); +} +export class UnMergeable { + cloneable = false; + + setCloneable(cloneable: any) { + this.cloneable = cloneable; + } +} + +export const mergeUtils = { + merge, + cloneDeep, +}; diff --git a/packages/libs/lib-iframe/package.json b/packages/libs/lib-iframe/package.json index c9a01f44..5ddef78a 100644 --- a/packages/libs/lib-iframe/package.json +++ b/packages/libs/lib-iframe/package.json @@ -36,7 +36,7 @@ "rollup-plugin-visualizer": "^5.8.2", "ts-node": "^10.9.1", "tslib": "^2.5.2", - "typescript": "^4.8.4" + "typescript": "^5.4.2" }, "gitHead": "be13390b3a9177c9d99f1efabfc285d0c377b013" } diff --git a/packages/libs/lib-k8s/package.json b/packages/libs/lib-k8s/package.json index 890867af..53b0fdea 100644 --- a/packages/libs/lib-k8s/package.json +++ b/packages/libs/lib-k8s/package.json @@ -37,7 +37,7 @@ "rollup-plugin-visualizer": "^5.8.2", "ts-node": "^10.9.1", "tslib": "^2.5.2", - "typescript": "^4.8.4" + "typescript": "^5.4.2" }, "gitHead": "be13390b3a9177c9d99f1efabfc285d0c377b013" } diff --git a/packages/libs/midway-flyway-js/package.json b/packages/libs/midway-flyway-js/package.json index a9f0c30c..29fd49e0 100644 --- a/packages/libs/midway-flyway-js/package.json +++ b/packages/libs/midway-flyway-js/package.json @@ -53,7 +53,7 @@ "ts-node": "^10.9.1", "tslib": "^2.5.2", "typeorm": "^0.3.11", - "typescript": "~5.1.0" + "typescript": "^5.4.2" }, "gitHead": "be13390b3a9177c9d99f1efabfc285d0c377b013" } diff --git a/packages/plugins/plugin-cert/package.json b/packages/plugins/plugin-cert/package.json index 0e230c6e..de6b7dce 100644 --- a/packages/plugins/plugin-cert/package.json +++ b/packages/plugins/plugin-cert/package.json @@ -51,7 +51,7 @@ "rollup-plugin-visualizer": "^5.8.2", "ts-node": "^10.9.1", "tslib": "^2.5.2", - "typescript": "^4.8.4", + "typescript": "^5.4.2", "vite": "^3.1.0", "vue-tsc": "^0.38.9" }, diff --git a/packages/ui/certd-client/src/components/plugins/common/remote-select.vue b/packages/ui/certd-client/src/components/plugins/common/remote-select.vue new file mode 100644 index 00000000..071f3bc7 --- /dev/null +++ b/packages/ui/certd-client/src/components/plugins/common/remote-select.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/packages/ui/certd-client/src/components/plugins/index.ts b/packages/ui/certd-client/src/components/plugins/index.ts index d999d992..e093a786 100644 --- a/packages/ui/certd-client/src/components/plugins/index.ts +++ b/packages/ui/certd-client/src/components/plugins/index.ts @@ -1,6 +1,8 @@ -import PiSynologyIdDeviceGetter from "./synology/device-id-getter.vue"; +import SynologyIdDeviceGetter from "./synology/device-id-getter.vue"; +import RemoteSelect from "./common/remote-select.vue"; export default { install(app: any) { - app.component("PiSynologyDeviceIdGetter", PiSynologyIdDeviceGetter); + app.component("SynologyDeviceIdGetter", SynologyIdDeviceGetter); + app.component("RemoteSelect", RemoteSelect); } }; diff --git a/packages/ui/certd-client/src/components/plugins/lib/index.ts b/packages/ui/certd-client/src/components/plugins/lib/index.ts new file mode 100644 index 00000000..1a5b2ad5 --- /dev/null +++ b/packages/ui/certd-client/src/components/plugins/lib/index.ts @@ -0,0 +1,31 @@ +import { request } from "/@/api/service"; +export type ComponentPropsType = { + type: string; + typeName: string; + action: string; + form: any; + value?: any; +}; +export type RequestHandleReq = { + type: strin; + typeName: string; + action: string; + data: any; + input: T; +}; + +export async function doRequest(req: RequestHandleReq) { + const url = req.type === "access" ? "/pi/handle/access" : "/pi/handle/plugin"; + const { typeName, action, data, input } = req; + const res = await request({ + url, + method: "post", + data: { + typeName, + action, + data, + input + } + }); + return res; +} diff --git a/packages/ui/certd-client/src/components/plugins/synology/device-id-getter.vue b/packages/ui/certd-client/src/components/plugins/synology/device-id-getter.vue index f58149bb..1a738600 100644 --- a/packages/ui/certd-client/src/components/plugins/synology/device-id-getter.vue +++ b/packages/ui/certd-client/src/components/plugins/synology/device-id-getter.vue @@ -11,15 +11,10 @@