diff --git a/.gitignore b/.gitignore index 9da7995d..445616b8 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,6 @@ gen docker/image/workspace /packages/core/lego + +tsconfig.tsbuildinfo +test/**/*.js diff --git a/.npmrc b/.npmrc index 893912f5..6c2b9be4 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,2 @@ -link-workspace-packages=deep +link-workspace-packages=true +prefer-workspace-packages=true diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..903b313d --- /dev/null +++ b/.prettierrc @@ -0,0 +1,7 @@ +{ + "printWidth": 160, + "bracketSpacing": true, + "singleQuote": true, + "trailingComma": "es5", + "arrowParens": "avoid" +} diff --git a/package.json b/package.json index eb12353b..7c9ed52d 100644 --- a/package.json +++ b/package.json @@ -16,11 +16,12 @@ "afterpublishOnly": "", "prepublishOnly1": "npm run before-build && lerna run build ", "before-build": "cd ./packages/core/acme-client && time /t >build.md && git add ./build.md && git commit -m \"build: prepare to build\"", - "deploy1": "node --experimental-json-modules deploy.js " + "deploy1": "node --experimental-json-modules deploy.js ", + "init": "lerna run build" }, "license": "AGPL-3.0", "dependencies": { - "axios": "^1.4.0", + "axios": "^1.7.2", "lodash": "^4.17.21" }, "workspaces": [ diff --git a/packages/core/acme-client/tsconfig.json b/packages/core/acme-client/tsconfig.json index 18b4e398..c501a7b8 100644 --- a/packages/core/acme-client/tsconfig.json +++ b/packages/core/acme-client/tsconfig.json @@ -3,9 +3,10 @@ "module": "commonjs", "lib": ["es6"], "strict": true, - "noEmit": true, + "noEmit": false, "esModuleInterop": true, "baseUrl": ".", + "composite": true, "paths": { "acme-client": ["."] } } } diff --git a/packages/core/pipeline/.gitignore b/packages/core/pipeline/.gitignore index 5ee37c64..0e868052 100644 --- a/packages/core/pipeline/.gitignore +++ b/packages/core/pipeline/.gitignore @@ -23,4 +23,4 @@ dist-ssr *.sln *.sw? -test/user.secret.ts \ No newline at end of file +test/user.secret.* diff --git a/packages/core/pipeline/.npmrc b/packages/core/pipeline/.npmrc new file mode 100644 index 00000000..6c2b9be4 --- /dev/null +++ b/packages/core/pipeline/.npmrc @@ -0,0 +1,2 @@ +link-workspace-packages=true +prefer-workspace-packages=true diff --git a/packages/core/pipeline/fix-esm-import-paths.js b/packages/core/pipeline/fix-esm-import-paths.js new file mode 100644 index 00000000..eaec174b --- /dev/null +++ b/packages/core/pipeline/fix-esm-import-paths.js @@ -0,0 +1,96 @@ +import * as fs from "fs"; +import * as path from "path"; + +// https://gist.github.com/lovasoa/8691344 +async function* walk(dir) { + for await (const d of await fs.promises.opendir(dir)) { + const entry = path.join(dir, d.name); + if (d.isDirectory()) { + yield* walk(entry); + } else if (d.isFile()) { + yield entry; + } + } +} + +function resolveImportPath(sourceFile, importPath, options) { + const sourceFileAbs = path.resolve(process.cwd(), sourceFile); + const root = path.dirname(sourceFileAbs); + const { moduleFilter = defaultModuleFilter } = options; + + if (moduleFilter(importPath)) { + const importPathAbs = path.resolve(root, importPath); + let possiblePath = [path.resolve(importPathAbs, "./index.ts"), path.resolve(importPathAbs, "./index.js"), importPathAbs + ".ts", importPathAbs + ".js"]; + + if (possiblePath.length) { + for (let i = 0; i < possiblePath.length; i++) { + let entry = possiblePath[i]; + if (fs.existsSync(entry)) { + const resolved = path.relative(root, entry.replace(/\.ts$/, ".js")); + + if (!resolved.startsWith(".")) { + return "./" + resolved; + } + + return resolved; + } + } + } + } + + return null; +} + +function replace(filePath, outFilePath, options) { + const code = fs.readFileSync(filePath).toString(); + const newCode = code.replace(/(import|export) (.+?) from ('[^\n']+'|"[^\n"]+");/gs, function (found, action, imported, from) { + const importPath = from.slice(1, -1); + let resolvedPath = resolveImportPath(filePath, importPath, options); + + if (resolvedPath) { + resolvedPath = resolvedPath.replaceAll("\\", "/"); + console.log("\t", importPath, resolvedPath); + return `${action} ${imported} from "${resolvedPath}";`; + } + + return found; + }); + + if (code !== newCode) { + fs.writeFileSync(outFilePath, newCode); + } +} + +// Then, use it with a simple async for loop +async function run(srcDir, options = defaultOptions) { + const { sourceFileFilter = defaultSourceFileFilter } = options; + + for await (const entry of walk(srcDir)) { + if (sourceFileFilter(entry)) { + console.log(entry); + replace(entry, entry, options); + } + } +} + +const defaultSourceFileFilter = function (sourceFilePath) { + return /\.(js|ts)$/.test(sourceFilePath) && !/node_modules/.test(sourceFilePath); +}; + +const defaultModuleFilter = function (importedModule) { + return !path.isAbsolute(importedModule) && !importedModule.startsWith("@") && !importedModule.endsWith(".js"); +}; + +const defaultOptions = { + sourceFileFilter: defaultSourceFileFilter, + moduleFilter: defaultModuleFilter, +}; + +// Switch this to test on one file or directly run on a directory. +const DEBUG = false; + +if (DEBUG) { + replace("./src/index.ts", "./out.ts", defaultOptions); +} else { + await run("./src/", defaultOptions); +} diff --git a/packages/core/pipeline/package.json b/packages/core/pipeline/package.json index c22b499d..eb2f7da3 100644 --- a/packages/core/pipeline/package.json +++ b/packages/core/pipeline/package.json @@ -2,22 +2,20 @@ "name": "@certd/pipeline", "private": false, "version": "1.21.0", - "main": "./src/index.ts", - "module": "./src/index.ts", - "types": "./src/index.ts", - "publishConfig": { - "main": "./dist/bundle.js", - "module": "./dist/bundle.mjs", - "types": "./dist/d/index.d.ts" - }, + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", "scripts": { "dev": "vite", - "build": "rollup -c", + "build": "tsc --skipLibCheck", + "build3": "rollup -c", "build2": "vue-tsc --noEmit && vite build", "preview": "vite preview" }, "dependencies": { - "axios": "^1.4.0", + "@types/lodash-es": "^4.17.12", + "axios": "^1.7.2", + "lodash-es": "^4.17.21", "node-forge": "^1.3.1", "nodemailer": "^6.9.3", "qs": "^6.11.2" @@ -30,7 +28,6 @@ "@rollup/plugin-terser": "^0.4.3", "@rollup/plugin-typescript": "^11.0.0", "@types/chai": "^4.3.5", - "@types/lodash": "^4.14.194", "@types/mocha": "^10.0.1", "@types/node-forge": "^1.3.2", "@types/uuid": "^9.0.2", @@ -43,7 +40,6 @@ "eslint-plugin-import": "^2.27.5", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^4.2.1", - "lodash": "^4.17.21", "log4js": "^6.9.1", "mocha": "^10.2.0", "prettier": "^2.8.8", @@ -52,6 +48,7 @@ "rollup-plugin-typescript2": "^0.34.1", "rollup-plugin-visualizer": "^5.8.2", "ts-node": "^10.9.1", + "tsc-esm-fix": "^3.0.0", "tslib": "^2.5.2", "typescript": "^5.0.4", "vite": "^4.3.8", diff --git a/packages/core/pipeline/rollup.config.js b/packages/core/pipeline/rollup.config.js index 35d39643..6f53eb8c 100644 --- a/packages/core/pipeline/rollup.config.js +++ b/packages/core/pipeline/rollup.config.js @@ -28,7 +28,7 @@ module.exports = { ], external: [ "vue", - "lodash", + "lodash-es", "dayjs", "@certd/acme-client", "@certd/pipeline", diff --git a/packages/core/pipeline/src/access/api.ts b/packages/core/pipeline/src/access/api.ts index b0a18dc9..2540bcba 100644 --- a/packages/core/pipeline/src/access/api.ts +++ b/packages/core/pipeline/src/access/api.ts @@ -1,5 +1,5 @@ -import { Registrable } from "../registry"; -import { FormItemProps } from "../d.ts"; +import { Registrable } from "../registry/index.js"; +import { FormItemProps } from "../dt/index.js"; export type AccessInputDefine = FormItemProps & { title: string; diff --git a/packages/core/pipeline/src/access/decorator.ts b/packages/core/pipeline/src/access/decorator.ts index 3457afb0..b269ab23 100644 --- a/packages/core/pipeline/src/access/decorator.ts +++ b/packages/core/pipeline/src/access/decorator.ts @@ -1,8 +1,8 @@ // src/decorator/memoryCache.decorator.ts -import { AccessDefine, AccessInputDefine } from "./api"; -import { Decorator } from "../decorator"; -import _ from "lodash"; -import { accessRegistry } from "./registry"; +import { AccessDefine, AccessInputDefine } from "./api.js"; +import { Decorator } from "../decorator/index.js"; +import _ from "lodash-es"; +import { accessRegistry } from "./registry.js"; // 提供一个唯一 key export const ACCESS_CLASS_KEY = "pipeline:access"; diff --git a/packages/core/pipeline/src/access/index.ts b/packages/core/pipeline/src/access/index.ts index c97ebdb4..9b9e3a48 100644 --- a/packages/core/pipeline/src/access/index.ts +++ b/packages/core/pipeline/src/access/index.ts @@ -1,3 +1,3 @@ -export * from "./api"; -export * from "./registry"; -export * from "./decorator"; +export * from "./api.js"; +export * from "./registry.js"; +export * from "./decorator.js"; diff --git a/packages/core/pipeline/src/access/registry.ts b/packages/core/pipeline/src/access/registry.ts index 65b14fa2..4dea4643 100644 --- a/packages/core/pipeline/src/access/registry.ts +++ b/packages/core/pipeline/src/access/registry.ts @@ -1,4 +1,4 @@ -import { Registry } from "../registry"; +import { Registry } from "../registry/index.js"; // @ts-ignore export const accessRegistry = new Registry("access"); diff --git a/packages/core/pipeline/src/context/index.ts b/packages/core/pipeline/src/context/index.ts index 0c865d21..5c8c6b16 100644 --- a/packages/core/pipeline/src/context/index.ts +++ b/packages/core/pipeline/src/context/index.ts @@ -1,5 +1,5 @@ import { AxiosInstance } from "axios"; -import { IContext } from "../core"; +import { IContext } from "../core/index.js"; export type HttpClient = AxiosInstance; export type UserContext = IContext; diff --git a/packages/core/pipeline/src/core/context.ts b/packages/core/pipeline/src/core/context.ts index d1be12fb..11a73a9f 100644 --- a/packages/core/pipeline/src/core/context.ts +++ b/packages/core/pipeline/src/core/context.ts @@ -1,4 +1,4 @@ -import { IStorage, MemoryStorage } from "./storage"; +import { IStorage, MemoryStorage } from "./storage.js"; const CONTEXT_VERSION_KEY = "contextVersion"; export interface IContext { getInt(key: string): Promise; diff --git a/packages/core/pipeline/src/core/executor.ts b/packages/core/pipeline/src/core/executor.ts index 83a3707e..be7e14b3 100644 --- a/packages/core/pipeline/src/core/executor.ts +++ b/packages/core/pipeline/src/core/executor.ts @@ -1,18 +1,18 @@ -import { ConcurrencyStrategy, NotificationWhen, Pipeline, ResultType, Runnable, RunStrategy, Stage, Step, Task } from "../d.ts"; -import _ from "lodash"; -import { RunHistory, RunnableCollection } from "./run-history"; -import { AbstractTaskPlugin, PluginDefine, pluginRegistry, TaskInstanceContext } from "../plugin"; -import { ContextFactory, IContext } from "./context"; -import { IStorage } from "./storage"; -import { logger } from "../utils/util.log"; +import { ConcurrencyStrategy, NotificationWhen, Pipeline, ResultType, Runnable, RunStrategy, Stage, Step, Task } from "../dt/index.js"; +import _ from "lodash-es"; +import { RunHistory, RunnableCollection } from "./run-history.js"; +import { AbstractTaskPlugin, PluginDefine, pluginRegistry, TaskInstanceContext } from "../plugin/index.js"; +import { ContextFactory, IContext } from "./context.js"; +import { IStorage } from "./storage.js"; +import { logger } from "../utils/util.log.js"; import { Logger } from "log4js"; -import { createAxiosService } from "../utils/util.request"; -import { IAccessService } from "../access"; -import { RegistryItem } from "../registry"; -import { Decorator } from "../decorator"; -import { IEmailService } from "../service"; -import { FileStore } from "./file-store"; -import { TimeoutPromise } from "../utils/util.promise"; +import { createAxiosService } from "../utils/util.request.js"; +import { IAccessService } from "../access/index.js"; +import { RegistryItem } from "../registry/index.js"; +import { Decorator } from "../decorator/index.js"; +import { IEmailService } from "../service/index.js"; +import { FileStore } from "./file-store.js"; +// import { TimeoutPromise } from "../utils/util.promise.js"; export type ExecutorOptions = { userId: any; @@ -33,7 +33,7 @@ export class Executor { lastRuntime!: RunHistory; options: ExecutorOptions; canceled = false; - onChanged: (history: RunHistory) => void; + onChanged: (history: RunHistory) => Promise; constructor(options: ExecutorOptions) { this.options = options; this.pipeline = _.cloneDeep(options.pipeline); @@ -110,12 +110,13 @@ export class Executor { const intervalFlushLogId = setInterval(async () => { await this.onChanged(this.runtime); }, 5000); - const timeout = runnable.timeout ?? 20 * 60 * 1000; + + // const timeout = runnable.timeout ?? 20 * 60 * 1000; try { if (this.canceled) { - throw new Error("task canceled"); + return ResultType.canceled; } - await TimeoutPromise(run, timeout); + await run(); this.runtime.success(runnable); return ResultType.success; } catch (e: any) { @@ -142,19 +143,25 @@ export class Executor { async runStage(stage: Stage) { const runnerList = []; for (const task of stage.tasks) { - const runner = this.runWithHistory(task, "task", async () => { - await this.runTask(task); - }); + const runner = async () => { + return this.runWithHistory(task, "task", async () => { + await this.runTask(task); + }); + }; runnerList.push(runner); } let resList: ResultType[] = []; if (stage.concurrency === ConcurrencyStrategy.Parallel) { - resList = await Promise.all(runnerList); + const pList = []; + for (const item of runnerList) { + pList.push(item()); + } + resList = await Promise.all(pList); } else { for (let i = 0; i < runnerList.length; i++) { const runner = runnerList[i]; - resList[i] = await runner; + resList[i] = await runner(); } } return this.compositionResultType(resList); @@ -239,7 +246,7 @@ export class Executor { this.lastStatusMap.clear(); } //输出到output context - _.forEach(define.output, (item, key) => { + _.forEach(define.output, (item: any, key: any) => { step.status!.output[key] = instance[key]; const stepOutputKey = `step.${step.id}.${key}`; this.runtime.context[stepOutputKey] = instance[key]; diff --git a/packages/core/pipeline/src/core/file-store.ts b/packages/core/pipeline/src/core/file-store.ts index 5006fdc0..de1b1ed6 100644 --- a/packages/core/pipeline/src/core/file-store.ts +++ b/packages/core/pipeline/src/core/file-store.ts @@ -1,8 +1,8 @@ -import { fileUtils } from "../utils"; +import { fileUtils } from "../utils/index.js"; import dayjs from "dayjs"; import path from "path"; import fs from "fs"; -import { logger } from "../utils"; +import { logger } from "../utils/index.js"; export type FileStoreOptions = { rootDir?: string; diff --git a/packages/core/pipeline/src/core/index.ts b/packages/core/pipeline/src/core/index.ts index 91ca6755..25ff426d 100644 --- a/packages/core/pipeline/src/core/index.ts +++ b/packages/core/pipeline/src/core/index.ts @@ -1,5 +1,5 @@ -export * from "./executor"; -export * from "./run-history"; -export * from "./context"; -export * from "./storage"; -export * from "./file-store"; +export * from "./executor.js"; +export * from "./run-history.js"; +export * from "./context.js"; +export * from "./storage.js"; +export * from "./file-store.js"; diff --git a/packages/core/pipeline/src/core/run-history.ts b/packages/core/pipeline/src/core/run-history.ts index 8fa37837..bfdfc607 100644 --- a/packages/core/pipeline/src/core/run-history.ts +++ b/packages/core/pipeline/src/core/run-history.ts @@ -1,6 +1,6 @@ -import { Context, HistoryResult, Pipeline, ResultType, Runnable, RunnableMap, Stage, Step, Task } from "../d.ts"; -import _ from "lodash"; -import { buildLogger } from "../utils/util.log"; +import { Context, HistoryResult, Pipeline, ResultType, Runnable, RunnableMap, Stage, Step, Task } from "../dt/index.js"; +import _ from "lodash-es"; +import { buildLogger } from "../utils/util.log.js"; import { Logger } from "log4js"; export type HistoryStatus = { diff --git a/packages/core/pipeline/src/core/storage.ts b/packages/core/pipeline/src/core/storage.ts index fa0ab177..e237e3a2 100644 --- a/packages/core/pipeline/src/core/storage.ts +++ b/packages/core/pipeline/src/core/storage.ts @@ -1,6 +1,6 @@ import fs from "fs"; import path from "path"; -import { fileUtils } from "../utils/util.file"; +import { fileUtils } from "../utils/util.file.js"; export interface IStorage { get(scope: string, namespace: string, version: string, key: string): Promise; diff --git a/packages/core/pipeline/src/d.ts/pipeline.ts b/packages/core/pipeline/src/d.ts/pipeline.ts index 3def3483..f577e622 100644 --- a/packages/core/pipeline/src/d.ts/pipeline.ts +++ b/packages/core/pipeline/src/d.ts/pipeline.ts @@ -70,6 +70,7 @@ export type Runnable = { default?: { [key: string]: any; }; + context?: Context; }; export type EmailOptions = { diff --git a/packages/core/pipeline/src/decorator/common.ts b/packages/core/pipeline/src/decorator/common.ts index c458a648..0e5942ff 100644 --- a/packages/core/pipeline/src/decorator/common.ts +++ b/packages/core/pipeline/src/decorator/common.ts @@ -1,4 +1,4 @@ -import { Decorator } from "./index"; +import { Decorator } from "./index.js"; export type AutowireProp = { name?: string; diff --git a/packages/core/pipeline/src/decorator/index.ts b/packages/core/pipeline/src/decorator/index.ts index 0af2b940..f24f345b 100644 --- a/packages/core/pipeline/src/decorator/index.ts +++ b/packages/core/pipeline/src/decorator/index.ts @@ -1,2 +1,2 @@ -export * from "./utils"; -export * from "./common"; +export * from "./utils.js"; +export * from "./common.js"; diff --git a/packages/core/pipeline/src/decorator/utils.ts b/packages/core/pipeline/src/decorator/utils.ts index 076b1e12..bd2d5c4b 100644 --- a/packages/core/pipeline/src/decorator/utils.ts +++ b/packages/core/pipeline/src/decorator/utils.ts @@ -1,4 +1,4 @@ -import _ from "lodash"; +import _ from "lodash-es"; const propertyMap: any = {}; function attachProperty(target: any, propertyKey: string | symbol) { @@ -25,7 +25,7 @@ function target(target: any, propertyKey?: string | symbol) { } function inject(define: any, instance: any, context: any, preHandler?: (item: any, key: string, instance: any, context: any) => void) { - _.forEach(define, (item, key) => { + _.forEach(define, (item: any, key: any) => { if (preHandler) { preHandler(item, key, instance, context); } diff --git a/packages/core/pipeline/src/dt/fast-crud.ts b/packages/core/pipeline/src/dt/fast-crud.ts new file mode 100644 index 00000000..91515a61 --- /dev/null +++ b/packages/core/pipeline/src/dt/fast-crud.ts @@ -0,0 +1,115 @@ +/** + * [x]-col的配置 + */ +export type ColProps = { + span?: number; + [props: string]: any; +}; + +export type FormItemProps = { + /** + * 字段label + */ + title?: string; + /** + * 表单字段组件配置 + */ + component?: ComponentProps; + /** + * 表单字段 [a|el|n]-col的配置 + * 一般用来配置跨列:{span:24} 占满一行 + */ + col?: ColProps; + /** + * 默认值 + */ + value?: any; + /** + * 帮助提示配置 + */ + helper?: string | FormItemHelperProps; + /** + * 排序号 + */ + order?: number; + /** + * 是否显示此字段 + */ + show?: boolean; + /** + * 是否是空白占位栏 + */ + blank?: boolean; + + [key: string]: any; +}; + +/** + * 表单字段帮助说明配置 + */ +export type FormItemHelperProps = { + /** + * 自定义渲染帮助说明 + * @param scope + */ + render?: (scope: any) => any; + /** + * 帮助文本 + */ + text?: string; + /** + * 帮助说明所在的位置,[ undefined | label] + */ + position?: string; + /** + * [a|el|n]-tooltip配置 + */ + tooltip?: object; + + [key: string]: any; +}; + +/** + * 组件配置 + */ +export type ComponentProps = { + /** + * 组件的名称 + */ + name?: string | object; + /** + * vmodel绑定的目标属性名 + */ + vModel?: string; + + /** + * 当原始组件名的参数被以上属性名占用时,可以配置在这里 + * 例如:原始组件有一个叫name的属性,你想要配置它,则可以按如下配置 + * ``` + * component:{ + * name:"组件的名称" + * props:{ + * name:"组件的name属性" <----------- + * } + * } + * ``` + */ + props?: { + [key: string]: any; + }; + + /** + * 组件事件监听 + */ + on?: { + [key: string]: (context?: any) => void; + }; + + /** + * 组件其他参数 + * 事件:onXxx:(event)=>void 组件原始事件监听 + * on.onXxx:(context)=>void 组件事件监听(对原始事件包装) + * 样式:style、class等 + */ + [key: string]: any; +}; diff --git a/packages/core/pipeline/src/dt/index.ts b/packages/core/pipeline/src/dt/index.ts new file mode 100644 index 00000000..50c7496e --- /dev/null +++ b/packages/core/pipeline/src/dt/index.ts @@ -0,0 +1,2 @@ +export * from "./pipeline.js"; +export * from "./fast-crud.js"; diff --git a/packages/core/pipeline/src/dt/pipeline.ts b/packages/core/pipeline/src/dt/pipeline.ts new file mode 100644 index 00000000..3def3483 --- /dev/null +++ b/packages/core/pipeline/src/dt/pipeline.ts @@ -0,0 +1,139 @@ +export enum RunStrategy { + AlwaysRun, + SkipWhenSucceed, +} + +export enum ConcurrencyStrategy { + Serial, + Parallel, +} + +export enum NextStrategy { + AllSuccess, + OneSuccess, +} + +export enum HandlerType { + //清空后续任务的状态 + ClearFollowStatus, + SendEmail, +} + +export type EventHandler = { + type: HandlerType; + params: { + [key: string]: any; + }; +}; + +export type RunnableStrategy = { + runStrategy?: RunStrategy; + onSuccess?: EventHandler[]; + onError?: EventHandler[]; +}; + +export type Step = Runnable & { + type: string; //插件类型 + input: { + [key: string]: any; + }; +}; +export type Task = Runnable & { + steps: Step[]; +}; + +export type Stage = Runnable & { + tasks: Task[]; + concurrency: ConcurrencyStrategy; + next: NextStrategy; +}; + +export type Trigger = { + id: string; + title: string; + cron: string; + type: string; +}; + +export type FileItem = { + id: string; + filename: string; + path: string; +}; +export type Runnable = { + id: string; + title: string; + strategy?: RunnableStrategy; + runnableType?: string; // pipeline, stage, task , step + status?: HistoryResult; + timeout?: number; + default?: { + [key: string]: any; + }; +}; + +export type EmailOptions = { + receivers: string[]; +}; +export type NotificationWhen = "error" | "success" | "turnToSuccess" | "start"; +export type NotificationType = "email" | "url"; +export type Notification = { + type: NotificationType; + when: NotificationWhen[]; + options: EmailOptions; +}; + +export type Pipeline = Runnable & { + version?: number; + userId: any; + stages: Stage[]; + triggers: Trigger[]; + notifications?: Notification[]; +}; + +export type Context = { + [key: string]: any; +}; + +export type Log = { + title: string; + time: number; + level: string; + text: string; +}; + +export enum ResultType { + start = "start", + success = "success", + error = "error", + canceled = "canceled", + skip = "skip", + none = "none", +} + +export type HistoryResultGroup = { + [key: string]: { + runnable: Runnable; + res: HistoryResult; + }; +}; +export type HistoryResult = { + input: any; + output: any; + files?: FileItem[]; + /** + * 任务状态 + */ + status: ResultType; + startTime: number; + endTime?: number; + /** + * 处理结果 + */ + result?: ResultType; //success, error,skip + message?: string; +}; + +export type RunnableMap = { + [id: string]: Runnable; +}; diff --git a/packages/core/pipeline/src/index.ts b/packages/core/pipeline/src/index.ts index 80292cf4..06788a90 100644 --- a/packages/core/pipeline/src/index.ts +++ b/packages/core/pipeline/src/index.ts @@ -1,10 +1,10 @@ import "util"; -export * from "./core"; -export * from "./d.ts"; -export * from "./access"; -export * from "./registry"; -export * from "./plugin"; -export * from "./utils"; -export * from "./context"; -export * from "./decorator"; -export * from "./service"; +export * from "./core/index.js"; +export * from "./dt/index.js"; +export * from "./access/index.js"; +export * from "./registry/index.js"; +export * from "./plugin/index.js"; +export * from "./utils/index.js"; +export * from "./context/index.js"; +export * from "./decorator/index.js"; +export * from "./service/index.js"; diff --git a/packages/core/pipeline/src/plugin/api.ts b/packages/core/pipeline/src/plugin/api.ts index 41a66af6..0ddd7fa2 100644 --- a/packages/core/pipeline/src/plugin/api.ts +++ b/packages/core/pipeline/src/plugin/api.ts @@ -1,12 +1,12 @@ -import { Registrable } from "../registry"; -import { FileItem, FormItemProps, Pipeline, Runnable, Step } from "../d.ts"; -import { FileStore } from "../core/file-store"; +import { Registrable } from "../registry/index.js"; +import { FileItem, FormItemProps, Pipeline, Runnable, Step } from "../dt/index.js"; +import { FileStore } from "../core/file-store.js"; import { Logger } from "log4js"; -import { IAccessService } from "../access"; -import { IEmailService } from "../service"; -import { IContext } from "../core"; +import { IAccessService } from "../access/index.js"; +import { IEmailService } from "../service/index.js"; +import { IContext } from "../core/index.js"; import { AxiosInstance } from "axios"; -import { logger } from "../utils"; +import { logger } from "../utils/index.js"; export enum ContextScope { global, @@ -83,7 +83,7 @@ export abstract class AbstractTaskPlugin implements ITaskPlugin { return Math.random().toString(36).substring(2, 9); } linkFile(file: FileItem) { - this._result.files!.push({ + this._result.files?.push({ ...file, id: this.randomFileId(), }); @@ -91,13 +91,20 @@ export abstract class AbstractTaskPlugin implements ITaskPlugin { saveFile(filename: string, file: Buffer) { const filePath = this.ctx.fileStore.writeFile(filename, file); logger.info(`saveFile:${filePath}`); - this._result.files!.push({ + this._result.files?.push({ id: this.randomFileId(), filename, path: filePath, }); } + extendsFiles() { + if (this._result.files == null) { + this._result.files = []; + } + this._result.files.push(...(this.ctx.lastStatus?.status?.files || [])); + } + get pipeline() { return this.ctx.pipeline; } diff --git a/packages/core/pipeline/src/plugin/decorator.ts b/packages/core/pipeline/src/plugin/decorator.ts index 52461042..da14c28a 100644 --- a/packages/core/pipeline/src/plugin/decorator.ts +++ b/packages/core/pipeline/src/plugin/decorator.ts @@ -1,8 +1,8 @@ -import _ from "lodash"; -import { pluginRegistry } from "./registry"; -import { PluginDefine, TaskInputDefine, TaskOutputDefine } from "./api"; -import { Decorator } from "../decorator"; -import { AUTOWIRE_KEY } from "../decorator"; +import _ from "lodash-es"; +import { pluginRegistry } from "./registry.js"; +import { PluginDefine, TaskInputDefine, TaskOutputDefine } from "./api.js"; +import { Decorator } from "../decorator/index.js"; +import { AUTOWIRE_KEY } from "../decorator/index.js"; import "reflect-metadata"; // 提供一个唯一 key export const PLUGIN_CLASS_KEY = "pipeline:plugin"; diff --git a/packages/core/pipeline/src/plugin/index.ts b/packages/core/pipeline/src/plugin/index.ts index c97ebdb4..9b9e3a48 100644 --- a/packages/core/pipeline/src/plugin/index.ts +++ b/packages/core/pipeline/src/plugin/index.ts @@ -1,3 +1,3 @@ -export * from "./api"; -export * from "./registry"; -export * from "./decorator"; +export * from "./api.js"; +export * from "./registry.js"; +export * from "./decorator.js"; diff --git a/packages/core/pipeline/src/plugin/registry.ts b/packages/core/pipeline/src/plugin/registry.ts index 753a14b3..9d755e5d 100644 --- a/packages/core/pipeline/src/plugin/registry.ts +++ b/packages/core/pipeline/src/plugin/registry.ts @@ -1,4 +1,4 @@ -import { Registry } from "../registry"; -import { AbstractTaskPlugin } from "./api"; +import { Registry } from "../registry/index.js"; +import { AbstractTaskPlugin } from "./api.js"; export const pluginRegistry = new Registry("plugin"); diff --git a/packages/core/pipeline/src/plugin/test/echo-plugin.ts b/packages/core/pipeline/src/plugin/test/echo-plugin.ts index e3d4494a..539e4b71 100644 --- a/packages/core/pipeline/src/plugin/test/echo-plugin.ts +++ b/packages/core/pipeline/src/plugin/test/echo-plugin.ts @@ -1,6 +1,5 @@ -import { ITaskPlugin } from "../api"; -import { IsTaskPlugin, TaskInput } from "../decorator"; -import { Autowire } from "../../decorator"; +import { ITaskPlugin } from "../api.js"; +import { IsTaskPlugin, TaskInput } from "../decorator.js"; @IsTaskPlugin({ name: "EchoPlugin", diff --git a/packages/core/pipeline/src/registry/index.ts b/packages/core/pipeline/src/registry/index.ts index cd6849a5..0e8ed1bc 100644 --- a/packages/core/pipeline/src/registry/index.ts +++ b/packages/core/pipeline/src/registry/index.ts @@ -1 +1 @@ -export * from "./registry"; +export * from "./registry.js"; diff --git a/packages/core/pipeline/src/registry/registry.ts b/packages/core/pipeline/src/registry/registry.ts index 135e0017..b119c06a 100644 --- a/packages/core/pipeline/src/registry/registry.ts +++ b/packages/core/pipeline/src/registry/registry.ts @@ -1,4 +1,4 @@ -import { logger } from "../utils"; +import { logger } from "../utils/index.js"; export type Registrable = { name: string; diff --git a/packages/core/pipeline/src/service/index.ts b/packages/core/pipeline/src/service/index.ts index e1722e10..33c5af08 100644 --- a/packages/core/pipeline/src/service/index.ts +++ b/packages/core/pipeline/src/service/index.ts @@ -1 +1 @@ -export * from "./email"; +export * from "./email.js"; diff --git a/packages/core/pipeline/src/utils/index.ts b/packages/core/pipeline/src/utils/index.ts index fcf07887..54e1027e 100644 --- a/packages/core/pipeline/src/utils/index.ts +++ b/packages/core/pipeline/src/utils/index.ts @@ -1,7 +1,7 @@ -import sleep from "./util.sleep"; -import { request } from "./util.request"; -export * from "./util.log"; -export * from "./util.file"; +import sleep from "./util.sleep.js"; +import { request } from "./util.request.js"; +export * from "./util.log.js"; +export * from "./util.file.js"; export const utils = { sleep, http: request, diff --git a/packages/core/pipeline/src/utils/util.request.ts b/packages/core/pipeline/src/utils/util.request.ts index 5fbaf6d4..736612d2 100644 --- a/packages/core/pipeline/src/utils/util.request.ts +++ b/packages/core/pipeline/src/utils/util.request.ts @@ -1,7 +1,7 @@ import axios from "axios"; // @ts-ignore import qs from "qs"; -import { logger } from "./util.log"; +import { logger } from "./util.log.js"; import { Logger } from "log4js"; /** * @description 创建请求实例 diff --git a/packages/core/pipeline/tsconfig.json b/packages/core/pipeline/tsconfig.json index 82be5b6f..3944e11f 100644 --- a/packages/core/pipeline/tsconfig.json +++ b/packages/core/pipeline/tsconfig.json @@ -1,23 +1,41 @@ { + "compileOnSave": true, "compilerOptions": { - "importHelpers": false, "target": "ESNext", - "useDefineForClassFields": true, "module": "ESNext", - "moduleResolution": "Node", - "strict": true, - "jsx": "preserve", - "sourceMap": true, - "resolveJsonModule": true, - "isolatedModules": true, + "moduleResolution": "node", "esModuleInterop": true, - "lib": ["ESNext", "DOM"], - "skipLibCheck": true, "experimentalDecorators": true, - "paths": { - "tslib" : ["./node_modules/tslib/tslib.d.ts"] - } + "emitDecoratorMetadata": true, + "inlineSourceMap":true, + "noImplicitThis": true, + "noUnusedLocals": true, + "stripInternal": true, + "skipLibCheck": true, + "pretty": true, + "declaration": true, + "forceConsistentCasingInFileNames": true, + "typeRoots": [ "./typings", "./node_modules/@types"], + "outDir": "dist", + "rootDir": "src", + "composite": true, + "useDefineForClassFields": true, + "strict": true, +// "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": false, + "lib": ["ESNext", "DOM"], }, - - "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue","test/**/*.ts","rollup.config.ts"], + "include": [ + "src/**/*.ts", + "src/**/*.d.ts", + "src/**/*.json" + ], + "exclude": [ + "*.js", + "*.ts", + "dist", + "node_modules", + "test" + ], } diff --git a/packages/core/pipeline/vite.config.js b/packages/core/pipeline/vite.config.js index 1dc116da..d91f5a99 100644 --- a/packages/core/pipeline/vite.config.js +++ b/packages/core/pipeline/vite.config.js @@ -24,7 +24,7 @@ export default defineConfig({ ], external: [ "vue", - "lodash", + "lodash-es", "dayjs", "@certd/acme-client", "@certd/plugin-cert", diff --git a/packages/plugins/plugin-util/.eslintrc b/packages/libs/huawei/.eslintrc similarity index 100% rename from packages/plugins/plugin-util/.eslintrc rename to packages/libs/huawei/.eslintrc diff --git a/packages/libs/huawei/.gitignore b/packages/libs/huawei/.gitignore new file mode 100644 index 00000000..9a2e4c91 --- /dev/null +++ b/packages/libs/huawei/.gitignore @@ -0,0 +1,28 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +test/user.secret.ts + +rollup.cache diff --git a/packages/plugins/plugin-util/.npmignore b/packages/libs/huawei/.npmignore similarity index 100% rename from packages/plugins/plugin-util/.npmignore rename to packages/libs/huawei/.npmignore diff --git a/packages/plugins/plugin-util/.prettierrc b/packages/libs/huawei/.prettierrc similarity index 100% rename from packages/plugins/plugin-util/.prettierrc rename to packages/libs/huawei/.prettierrc diff --git a/packages/plugins/plugin-util/CHANGELOG.md b/packages/libs/huawei/CHANGELOG.md similarity index 100% rename from packages/plugins/plugin-util/CHANGELOG.md rename to packages/libs/huawei/CHANGELOG.md diff --git a/packages/plugins/plugin-util/README.md b/packages/libs/huawei/README.md similarity index 100% rename from packages/plugins/plugin-util/README.md rename to packages/libs/huawei/README.md diff --git a/packages/libs/huawei/fix-esm-import-paths.js b/packages/libs/huawei/fix-esm-import-paths.js new file mode 100644 index 00000000..eaec174b --- /dev/null +++ b/packages/libs/huawei/fix-esm-import-paths.js @@ -0,0 +1,96 @@ +import * as fs from "fs"; +import * as path from "path"; + +// https://gist.github.com/lovasoa/8691344 +async function* walk(dir) { + for await (const d of await fs.promises.opendir(dir)) { + const entry = path.join(dir, d.name); + if (d.isDirectory()) { + yield* walk(entry); + } else if (d.isFile()) { + yield entry; + } + } +} + +function resolveImportPath(sourceFile, importPath, options) { + const sourceFileAbs = path.resolve(process.cwd(), sourceFile); + const root = path.dirname(sourceFileAbs); + const { moduleFilter = defaultModuleFilter } = options; + + if (moduleFilter(importPath)) { + const importPathAbs = path.resolve(root, importPath); + let possiblePath = [path.resolve(importPathAbs, "./index.ts"), path.resolve(importPathAbs, "./index.js"), importPathAbs + ".ts", importPathAbs + ".js"]; + + if (possiblePath.length) { + for (let i = 0; i < possiblePath.length; i++) { + let entry = possiblePath[i]; + if (fs.existsSync(entry)) { + const resolved = path.relative(root, entry.replace(/\.ts$/, ".js")); + + if (!resolved.startsWith(".")) { + return "./" + resolved; + } + + return resolved; + } + } + } + } + + return null; +} + +function replace(filePath, outFilePath, options) { + const code = fs.readFileSync(filePath).toString(); + const newCode = code.replace(/(import|export) (.+?) from ('[^\n']+'|"[^\n"]+");/gs, function (found, action, imported, from) { + const importPath = from.slice(1, -1); + let resolvedPath = resolveImportPath(filePath, importPath, options); + + if (resolvedPath) { + resolvedPath = resolvedPath.replaceAll("\\", "/"); + console.log("\t", importPath, resolvedPath); + return `${action} ${imported} from "${resolvedPath}";`; + } + + return found; + }); + + if (code !== newCode) { + fs.writeFileSync(outFilePath, newCode); + } +} + +// Then, use it with a simple async for loop +async function run(srcDir, options = defaultOptions) { + const { sourceFileFilter = defaultSourceFileFilter } = options; + + for await (const entry of walk(srcDir)) { + if (sourceFileFilter(entry)) { + console.log(entry); + replace(entry, entry, options); + } + } +} + +const defaultSourceFileFilter = function (sourceFilePath) { + return /\.(js|ts)$/.test(sourceFilePath) && !/node_modules/.test(sourceFilePath); +}; + +const defaultModuleFilter = function (importedModule) { + return !path.isAbsolute(importedModule) && !importedModule.startsWith("@") && !importedModule.endsWith(".js"); +}; + +const defaultOptions = { + sourceFileFilter: defaultSourceFileFilter, + moduleFilter: defaultModuleFilter, +}; + +// Switch this to test on one file or directly run on a directory. +const DEBUG = false; + +if (DEBUG) { + replace("./src/index.ts", "./out.ts", defaultOptions); +} else { + await run("./src/", defaultOptions); +} diff --git a/packages/libs/huawei/package.json b/packages/libs/huawei/package.json new file mode 100644 index 00000000..663eba99 --- /dev/null +++ b/packages/libs/huawei/package.json @@ -0,0 +1,20 @@ +{ + "name": "@certd/lib-huawei", + "private": false, + "version": "1.21.0", + "main": "./dist/bundle.js", + "module": "./dist/bundle.js", + "types": "./dist/d/index.d.ts", + "scripts": { + "dev": "vite", + "build": "rollup -c ", + "build2": "vue-tsc --noEmit && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@certd/pipeline": "1.21.0", + "axios": "^1.7.2", + "rollup": "^3.7.4" + }, + "gitHead": "a31f1c7f5e71fa946de9bf0283e11d6ce049b3e9" +} diff --git a/packages/plugins/plugin-util/rollup.config.js b/packages/libs/huawei/rollup.config.js similarity index 72% rename from packages/plugins/plugin-util/rollup.config.js rename to packages/libs/huawei/rollup.config.js index f25c3ce5..f4e756e4 100644 --- a/packages/plugins/plugin-util/rollup.config.js +++ b/packages/libs/huawei/rollup.config.js @@ -32,22 +32,5 @@ module.exports = { json(), terser(), ], - external: [ - "vue", - "lodash", - "dayjs", - "@certd/acme-client", - "@certd/pipeline", - "@certd/plugin-cert", - "@certd/plugin-aliyun", - "@certd/plugin-tencent", - "@certd/plugin-huawei", - "@certd/plugin-host", - "@certd/plugin-tencent", - "@certd/plugin-util", - "log4js", - "@midwayjs/core", - "@midwayjs/decorator", - "kubernetes-client", - ], + external: ["vue", "lodash-es", "dayjs", "log4js", "@midwayjs/core", "@certd/pipeline", "axios"], }; diff --git a/packages/libs/huawei/src/index.ts b/packages/libs/huawei/src/index.ts new file mode 100644 index 00000000..1b0d6f4e --- /dev/null +++ b/packages/libs/huawei/src/index.ts @@ -0,0 +1,2 @@ +export { HuaweiYunClient } from "./lib/client.js"; +export { ApiRequestOptions } from "./lib/client.js"; diff --git a/packages/ui/certd-server/src/plugins/plugin-huawei/lib/APIGW-javascript-sdk-2.0.5/licenses/license-crypto-js b/packages/libs/huawei/src/lib/APIGW-javascript-sdk-2.0.5/licenses/license-crypto-js similarity index 100% rename from packages/ui/certd-server/src/plugins/plugin-huawei/lib/APIGW-javascript-sdk-2.0.5/licenses/license-crypto-js rename to packages/libs/huawei/src/lib/APIGW-javascript-sdk-2.0.5/licenses/license-crypto-js diff --git a/packages/ui/certd-server/src/plugins/plugin-huawei/lib/APIGW-javascript-sdk-2.0.5/licenses/license-node b/packages/libs/huawei/src/lib/APIGW-javascript-sdk-2.0.5/licenses/license-node similarity index 100% rename from packages/ui/certd-server/src/plugins/plugin-huawei/lib/APIGW-javascript-sdk-2.0.5/licenses/license-node rename to packages/libs/huawei/src/lib/APIGW-javascript-sdk-2.0.5/licenses/license-node diff --git a/packages/ui/certd-server/src/plugins/plugin-huawei/lib/APIGW-javascript-sdk-2.0.5/node_demo.js b/packages/libs/huawei/src/lib/APIGW-javascript-sdk-2.0.5/node_demo.js similarity index 100% rename from packages/ui/certd-server/src/plugins/plugin-huawei/lib/APIGW-javascript-sdk-2.0.5/node_demo.js rename to packages/libs/huawei/src/lib/APIGW-javascript-sdk-2.0.5/node_demo.js diff --git a/packages/ui/certd-server/src/plugins/plugin-huawei/lib/APIGW-javascript-sdk-2.0.5/signer.js b/packages/libs/huawei/src/lib/APIGW-javascript-sdk-2.0.5/signer.js similarity index 100% rename from packages/ui/certd-server/src/plugins/plugin-huawei/lib/APIGW-javascript-sdk-2.0.5/signer.js rename to packages/libs/huawei/src/lib/APIGW-javascript-sdk-2.0.5/signer.js diff --git a/packages/ui/certd-server/src/plugins/plugin-huawei/lib/APIGW-javascript-sdk-2.0.5/test.js b/packages/libs/huawei/src/lib/APIGW-javascript-sdk-2.0.5/test.js similarity index 100% rename from packages/ui/certd-server/src/plugins/plugin-huawei/lib/APIGW-javascript-sdk-2.0.5/test.js rename to packages/libs/huawei/src/lib/APIGW-javascript-sdk-2.0.5/test.js diff --git a/packages/libs/huawei/src/lib/client.d.ts b/packages/libs/huawei/src/lib/client.d.ts new file mode 100644 index 00000000..eaaba65e --- /dev/null +++ b/packages/libs/huawei/src/lib/client.d.ts @@ -0,0 +1,12 @@ +import { HuaweiAccess } from "../access/index.js"; +export type ApiRequestOptions = { + method: string; + url: string; + headers?: any; + data?: any; +}; +export declare class HuaweiYunClient { + access: HuaweiAccess; + constructor(access: HuaweiAccess); + request(options: ApiRequestOptions): Promise; +} diff --git a/packages/libs/huawei/src/lib/client.js b/packages/libs/huawei/src/lib/client.js new file mode 100644 index 00000000..f85ea316 --- /dev/null +++ b/packages/libs/huawei/src/lib/client.js @@ -0,0 +1,41 @@ +import { Signer, SigHttpRequest } from "./signer.js"; +import axios from "axios"; +export class HuaweiYunClient { + access; + constructor(access, logger) { + this.access = access; + } + async request(options) { + const sig = new Signer(this.access.accessKeyId, this.access.accessKeySecret); + //The following example shows how to set the request URL and parameters to query a VPC list. + //Specify a request method, such as GET, PUT, POST, DELETE, HEAD, and PATCH. + //Set request host. + //Set request URI. + //Set parameters for the request URL. + let body = undefined; + if (options.data) { + body = JSON.stringify(options.data); + } + const r = new SigHttpRequest(options.method, options.url, options.headers, body); + //Add header parameters, for example, x-domain-id for invoking a global service and x-project-id for invoking a project-level service. + r.headers = { "Content-Type": "application/json" }; + //Add a body if you have specified the PUT or POST method. Special characters, such as the double quotation mark ("), contained in the body must be escaped. + // r.body = option; + const opt = sig.Sign(r); + try { + const res = await axios.request({ + url: options.url, + method: options.method, + headers: opt.headers, + data: body, + }); + return res.data; + } catch (e) { + this.logger.error("华为云接口请求出错:", e?.response?.data); + const error = new Error(e?.response?.data.message); + error.code = e?.response?.code; + throw error; + } + } +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BsdWdpbnMvcGx1Z2luLWh1YXdlaS9saWIvY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXJELE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFRekMsTUFBTSxPQUFPLGVBQWU7SUFDMUIsTUFBTSxDQUFlO0lBQ3JCLFlBQVksTUFBb0I7UUFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUNELEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBMEI7UUFDdEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FDNUIsQ0FBQztRQUVGLDRGQUE0RjtRQUM1Riw0RUFBNEU7UUFDNUUsbUJBQW1CO1FBQ25CLGtCQUFrQjtRQUNsQixxQ0FBcUM7UUFDckMsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ3JCLElBQUksT0FBTyxDQUFDLElBQUksRUFBRTtZQUNoQixJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckM7UUFDRCxNQUFNLENBQUMsR0FBRyxJQUFJLGNBQWMsQ0FDMUIsT0FBTyxDQUFDLE1BQU0sRUFDZCxPQUFPLENBQUMsR0FBRyxFQUNYLE9BQU8sQ0FBQyxPQUFPLEVBQ2YsSUFBSSxDQUNMLENBQUM7UUFDRixzSUFBc0k7UUFDdEksQ0FBQyxDQUFDLE9BQU8sR0FBRyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDO1FBQ25ELDRKQUE0SjtRQUM1SixtQkFBbUI7UUFDbkIsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJO1lBQ0YsTUFBTSxHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUM5QixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7Z0JBQ2hCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtnQkFDdEIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO2dCQUNwQixJQUFJLEVBQUUsSUFBSTthQUNYLENBQUMsQ0FBQztZQUNILE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztTQUNqQjtRQUFDLE9BQU8sQ0FBTSxFQUFFO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM5QyxNQUFNLEtBQUssR0FBUSxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4RCxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDO1lBQy9CLE1BQU0sS0FBSyxDQUFDO1NBQ2I7SUFDSCxDQUFDO0NBQ0YifQ== diff --git a/packages/libs/huawei/src/lib/signer.d.ts b/packages/libs/huawei/src/lib/signer.d.ts new file mode 100644 index 00000000..cd828fe2 --- /dev/null +++ b/packages/libs/huawei/src/lib/signer.d.ts @@ -0,0 +1,20 @@ +export declare class SigHttpRequest { + method: string; + host: string; + uri: string; + query: any; + headers: any; + body: string; + constructor(method: any, url: any, headers: any, body: any); +} +export declare class Signer { + Key: string; + Secret: string; + constructor(Key: any, Secret: any); + Sign(r: any): { + hostname: any; + path: string; + method: any; + headers: any; + }; +} diff --git a/packages/libs/huawei/src/lib/signer.js b/packages/libs/huawei/src/lib/signer.js new file mode 100644 index 00000000..dd4f8d28 --- /dev/null +++ b/packages/libs/huawei/src/lib/signer.js @@ -0,0 +1,459 @@ +import crypto from 'crypto'; +function hmacsha256(keyByte, message) { + return crypto + .createHmac('SHA256', keyByte) + .update(message) + .digest() + .toString('hex'); +} +function HexEncodeSHA256Hash(body) { + return crypto.createHash('SHA256').update(body).digest().toString('hex'); +} +const Algorithm = 'SDK-HMAC-SHA256'; +const HeaderXDate = 'X-Sdk-Date'; +const HeaderAuthorization = 'Authorization'; +const HeaderContentSha256 = 'x-sdk-content-sha256'; +const hexTable = new Array(256); +for (let i = 0; i < 256; ++i) + hexTable[i] = '%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase(); +const noEscape = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, // 112 - 127 +]; +// function urlEncode is based on https://github.com/nodejs/node/blob/master/lib/querystring.js +// Copyright Joyent, Inc. and other Node contributors. +function urlEncode(str) { + if (typeof str !== 'string') { + if (typeof str === 'object') + str = String(str); + else + str += ''; + } + let out = ''; + let lastPos = 0; + for (let i = 0; i < str.length; ++i) { + let c = str.charCodeAt(i); + // ASCII + if (c < 0x80) { + if (noEscape[c] === 1) + continue; + if (lastPos < i) + out += str.slice(lastPos, i); + lastPos = i + 1; + out += hexTable[c]; + continue; + } + if (lastPos < i) + out += str.slice(lastPos, i); + // Multi-byte characters ... + if (c < 0x800) { + lastPos = i + 1; + out += hexTable[0xc0 | (c >> 6)] + hexTable[0x80 | (c & 0x3f)]; + continue; + } + if (c < 0xd800 || c >= 0xe000) { + lastPos = i + 1; + out += + hexTable[0xe0 | (c >> 12)] + + hexTable[0x80 | ((c >> 6) & 0x3f)] + + hexTable[0x80 | (c & 0x3f)]; + continue; + } + // Surrogate pair + ++i; + if (i >= str.length) + throw new Error('ERR_INVALID_URI'); + const c2 = str.charCodeAt(i) & 0x3ff; + lastPos = i + 1; + c = 0x10000 + (((c & 0x3ff) << 10) | c2); + out += + hexTable[0xf0 | (c >> 18)] + + hexTable[0x80 | ((c >> 12) & 0x3f)] + + hexTable[0x80 | ((c >> 6) & 0x3f)] + + hexTable[0x80 | (c & 0x3f)]; + } + if (lastPos === 0) + return str; + if (lastPos < str.length) + return out + str.slice(lastPos); + return out; +} +function findHeader(r, header) { + for (const k in r.headers) { + if (k.toLowerCase() === header.toLowerCase()) { + return r.headers[k]; + } + } + return null; +} +// Build a CanonicalRequest from a regular request string +// +// CanonicalRequest = +// HTTPRequestMethod + '\n' + +// CanonicalURI + '\n' + +// CanonicalQueryString + '\n' + +// CanonicalHeaders + '\n' + +// SignedHeaders + '\n' + +// HexEncode(Hash(RequestPayload)) +function CanonicalRequest(r, signedHeaders) { + let hexencode = findHeader(r, HeaderContentSha256); + if (hexencode === null) { + const data = RequestPayload(r); + hexencode = HexEncodeSHA256Hash(data); + } + return (r.method + + '\n' + + CanonicalURI(r) + + '\n' + + CanonicalQueryString(r) + + '\n' + + CanonicalHeaders(r, signedHeaders) + + '\n' + + signedHeaders.join(';') + + '\n' + + hexencode); +} +function CanonicalURI(r) { + const pattens = r.uri.split('/'); + const uri = []; + for (const k in pattens) { + const v = pattens[k]; + uri.push(urlEncode(v)); + } + let urlpath = uri.join('/'); + if (urlpath[urlpath.length - 1] !== '/') { + urlpath = urlpath + '/'; + } + //r.uri = urlpath + return urlpath; +} +function CanonicalQueryString(r) { + const keys = []; + for (const key in r.query) { + keys.push(key); + } + keys.sort(); + const a = []; + for (const i in keys) { + const key = urlEncode(keys[i]); + const value = r.query[keys[i]]; + if (Array.isArray(value)) { + value.sort(); + for (const iv in value) { + a.push(key + '=' + urlEncode(value[iv])); + } + } + else { + a.push(key + '=' + urlEncode(value)); + } + } + return a.join('&'); +} +function CanonicalHeaders(r, signedHeaders) { + const headers = {}; + for (const key in r.headers) { + headers[key.toLowerCase()] = r.headers[key]; + } + const a = []; + for (const i in signedHeaders) { + const value = headers[signedHeaders[i]]; + a.push(signedHeaders[i] + ':' + value.trim()); + } + return a.join('\n') + '\n'; +} +function SignedHeaders(r) { + const a = []; + for (const key in r.headers) { + a.push(key.toLowerCase()); + } + a.sort(); + return a; +} +function RequestPayload(r) { + return r.body; +} +// Create a "String to Sign". +function StringToSign(canonicalRequest, t) { + const bytes = HexEncodeSHA256Hash(canonicalRequest); + return Algorithm + '\n' + t + '\n' + bytes; +} +// Create the HWS Signature. +function SignStringToSign(stringToSign, signingKey) { + return hmacsha256(signingKey, stringToSign); +} +// Get the finalized value for the "Authorization" header. The signature +// parameter is the output from SignStringToSign +function AuthHeaderValue(signature, Key, signedHeaders) { + return (Algorithm + + ' Access=' + + Key + + ', SignedHeaders=' + + signedHeaders.join(';') + + ', Signature=' + + signature); +} +function twoChar(s) { + if (s >= 10) { + return '' + s; + } + else { + return '0' + s; + } +} +function getTime() { + const date = new Date(); + return ('' + + date.getUTCFullYear() + + twoChar(date.getUTCMonth() + 1) + + twoChar(date.getUTCDate()) + + 'T' + + twoChar(date.getUTCHours()) + + twoChar(date.getUTCMinutes()) + + twoChar(date.getUTCSeconds()) + + 'Z'); +} +export class SigHttpRequest { + method = ''; + host = ''; + uri = ''; + query = {}; + headers = {}; + body = ''; + constructor(method, url, headers, body) { + if (method === undefined) { + this.method = ''; + } + else { + this.method = method; + } + if (url === undefined) { + this.host = ''; + this.uri = ''; + this.query = {}; + } + else { + this.query = {}; + let host, path; + let i = url.indexOf('://'); + if (i !== -1) { + url = url.substr(i + 3); + } + i = url.indexOf('?'); + if (i !== -1) { + const query_str = url.substr(i + 1); + url = url.substr(0, i); + const spl = query_str.split('&'); + for (const i in spl) { + const kv = spl[i]; + const index = kv.indexOf('='); + let key, value; + if (index >= 0) { + key = kv.substr(0, index); + value = kv.substr(index + 1); + } + else { + key = kv; + value = ''; + } + if (key !== '') { + key = decodeURI(key); + value = decodeURI(value); + if (this.query[key] === undefined) { + this.query[key] = [value]; + } + else { + this.query[key].push(value); + } + } + } + } + i = url.indexOf('/'); + if (i === -1) { + host = url; + path = '/'; + } + else { + host = url.substr(0, i); + path = url.substr(i); + } + this.host = host; + this.uri = decodeURI(path); + } + if (headers === undefined) { + this.headers = {}; + } + else { + this.headers = headers; + } + if (body === undefined) { + this.body = ''; + } + else { + this.body = body; + } + } +} +export class Signer { + Key = ''; + Secret = ''; + constructor(Key, Secret) { + this.Key = Key; + this.Secret = Secret; + } + Sign(r) { + let headerTime = findHeader(r, HeaderXDate); + if (headerTime === null) { + headerTime = getTime(); + r.headers[HeaderXDate] = headerTime; + } + if (r.method !== 'PUT' && r.method !== 'PATCH' && r.method !== 'POST') { + r.body = ''; + } + let queryString = CanonicalQueryString(r); + if (queryString !== '') { + queryString = '?' + queryString; + } + const options = { + hostname: r.host, + path: encodeURI(r.uri) + queryString, + method: r.method, + headers: r.headers, + }; + if (findHeader(r, 'host') === null) { + r.headers.host = r.host; + } + const signedHeaders = SignedHeaders(r); + const canonicalRequest = CanonicalRequest(r, signedHeaders); + const stringToSign = StringToSign(canonicalRequest, headerTime); + const signature = SignStringToSign(stringToSign, this.Secret); + options.headers[HeaderAuthorization] = AuthHeaderValue(signature, this.Key, signedHeaders); + return options; + } +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BsdWdpbnMvcGx1Z2luLWh1YXdlaS9saWIvc2lnbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixTQUFTLFVBQVUsQ0FBQyxPQUFZLEVBQUUsT0FBWTtJQUM1QyxPQUFPLE1BQU07U0FDVixVQUFVLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQztTQUM3QixNQUFNLENBQUMsT0FBTyxDQUFDO1NBQ2YsTUFBTSxFQUFFO1NBQ1IsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3JCLENBQUM7QUFDRCxTQUFTLG1CQUFtQixDQUFDLElBQVM7SUFDcEMsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0UsQ0FBQztBQUNELE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDO0FBQ3BDLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQztBQUNqQyxNQUFNLG1CQUFtQixHQUFHLGVBQWUsQ0FBQztBQUM1QyxNQUFNLG1CQUFtQixHQUFHLHNCQUFzQixDQUFDO0FBRW5ELE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDO0lBQzFCLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBRTNFLE1BQU0sUUFBUSxHQUFHO0lBQ2YsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUM7SUFDRCxDQUFDO0lBQ0QsQ0FBQztJQUNELENBQUMsRUFBRSxZQUFZO0NBQ2hCLENBQUM7QUFFRiwrRkFBK0Y7QUFDL0Ysc0RBQXNEO0FBQ3RELFNBQVMsU0FBUyxDQUFDLEdBQVE7SUFDekIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7UUFDM0IsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1lBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzs7WUFDMUMsR0FBRyxJQUFJLEVBQUUsQ0FBQztLQUNoQjtJQUNELElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNiLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUVoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNuQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFCLFFBQVE7UUFDUixJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUU7WUFDWixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUFFLFNBQVM7WUFDaEMsSUFBSSxPQUFPLEdBQUcsQ0FBQztnQkFBRSxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEIsR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQixTQUFTO1NBQ1Y7UUFFRCxJQUFJLE9BQU8sR0FBRyxDQUFDO1lBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTlDLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUU7WUFDYixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQixHQUFHLElBQUksUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMvRCxTQUFTO1NBQ1Y7UUFDRCxJQUFJLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLE1BQU0sRUFBRTtZQUM3QixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQixHQUFHO2dCQUNELFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQzFCLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztvQkFDbEMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzlCLFNBQVM7U0FDVjtRQUNELGlCQUFpQjtRQUNqQixFQUFFLENBQUMsQ0FBQztRQUVKLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRXhELE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBRXJDLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLEdBQUc7WUFDRCxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUMxQixRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ25DLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztnQkFDbEMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQy9CO0lBQ0QsSUFBSSxPQUFPLEtBQUssQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQzlCLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNO1FBQUUsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxDQUFNLEVBQUUsTUFBVztJQUNyQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUU7UUFDekIsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQzVDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNyQjtLQUNGO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQseURBQXlEO0FBQ3pELEVBQUU7QUFDRixxQkFBcUI7QUFDckIsOEJBQThCO0FBQzlCLHlCQUF5QjtBQUN6QixpQ0FBaUM7QUFDakMsNkJBQTZCO0FBQzdCLDBCQUEwQjtBQUMxQixtQ0FBbUM7QUFDbkMsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFNLEVBQUUsYUFBa0I7SUFDbEQsSUFBSSxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ25ELElBQUksU0FBUyxLQUFLLElBQUksRUFBRTtRQUN0QixNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsU0FBUyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3ZDO0lBQ0QsT0FBTyxDQUNMLENBQUMsQ0FBQyxNQUFNO1FBQ1IsSUFBSTtRQUNKLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDZixJQUFJO1FBQ0osb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLElBQUk7UUFDSixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDO1FBQ2xDLElBQUk7UUFDSixhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUN2QixJQUFJO1FBQ0osU0FBUyxDQUNWLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsQ0FBTTtJQUMxQixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDZixLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU8sRUFBRTtRQUN2QixNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN4QjtJQUNELElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7UUFDdkMsT0FBTyxHQUFHLE9BQU8sR0FBRyxHQUFHLENBQUM7S0FDekI7SUFDRCxpQkFBaUI7SUFDakIsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUMsQ0FBTTtJQUNsQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7SUFDaEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDaEI7SUFDRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDWixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDYixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRTtRQUNwQixNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2IsS0FBSyxNQUFNLEVBQUUsSUFBSSxLQUFLLEVBQUU7Z0JBQ3RCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMxQztTQUNGO2FBQU07WUFDTCxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDdEM7S0FDRjtJQUNELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFNLEVBQUUsYUFBa0I7SUFDbEQsTUFBTSxPQUFPLEdBQVEsRUFBRSxDQUFDO0lBQ3hCLEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRTtRQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUM3QztJQUNELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNiLEtBQUssTUFBTSxDQUFDLElBQUksYUFBYSxFQUFFO1FBQzdCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7S0FDL0M7SUFDRCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzdCLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxDQUFNO0lBQzNCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNiLEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRTtRQUMzQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0tBQzNCO0lBQ0QsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ1QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsQ0FBTTtJQUM1QixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUVELDZCQUE2QjtBQUM3QixTQUFTLFlBQVksQ0FBQyxnQkFBcUIsRUFBRSxDQUFNO0lBQ2pELE1BQU0sS0FBSyxHQUFHLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDcEQsT0FBTyxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQzdDLENBQUM7QUFFRCw0QkFBNEI7QUFDNUIsU0FBUyxnQkFBZ0IsQ0FBQyxZQUFpQixFQUFFLFVBQWU7SUFDMUQsT0FBTyxVQUFVLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRCx5RUFBeUU7QUFDekUsZ0RBQWdEO0FBQ2hELFNBQVMsZUFBZSxDQUFDLFNBQWMsRUFBRSxHQUFRLEVBQUUsYUFBa0I7SUFDbkUsT0FBTyxDQUNMLFNBQVM7UUFDVCxVQUFVO1FBQ1YsR0FBRztRQUNILGtCQUFrQjtRQUNsQixhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUN2QixjQUFjO1FBQ2QsU0FBUyxDQUNWLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsQ0FBTTtJQUNyQixJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDWCxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDZjtTQUFNO1FBQ0wsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0tBQ2hCO0FBQ0gsQ0FBQztBQUVELFNBQVMsT0FBTztJQUNkLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDeEIsT0FBTyxDQUNMLEVBQUU7UUFDRixJQUFJLENBQUMsY0FBYyxFQUFFO1FBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDMUIsR0FBRztRQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzdCLEdBQUcsQ0FDSixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sT0FBTyxjQUFjO0lBQ3pCLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDWixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ1YsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNULEtBQUssR0FBUSxFQUFFLENBQUM7SUFDaEIsT0FBTyxHQUFRLEVBQUUsQ0FBQztJQUNsQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRVYsWUFBWSxNQUFXLEVBQUUsR0FBUSxFQUFFLE9BQVksRUFBRSxJQUFTO1FBQ3hELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztTQUNsQjthQUFNO1lBQ0wsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7U0FDdEI7UUFDRCxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7WUFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1NBQ2pCO2FBQU07WUFDTCxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNoQixJQUFJLElBQUksRUFBRSxJQUFJLENBQUM7WUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNaLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUN6QjtZQUNELENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNaLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZCLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFO29CQUNuQixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xCLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzlCLElBQUksR0FBRyxFQUFFLEtBQUssQ0FBQztvQkFDZixJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7d0JBQ2QsR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUMxQixLQUFLLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7cUJBQzlCO3lCQUFNO3dCQUNMLEdBQUcsR0FBRyxFQUFFLENBQUM7d0JBQ1QsS0FBSyxHQUFHLEVBQUUsQ0FBQztxQkFDWjtvQkFDRCxJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUU7d0JBQ2QsR0FBRyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDckIsS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsRUFBRTs0QkFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUMzQjs2QkFBTTs0QkFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDN0I7cUJBQ0Y7aUJBQ0Y7YUFDRjtZQUNELENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNaLElBQUksR0FBRyxHQUFHLENBQUM7Z0JBQ1gsSUFBSSxHQUFHLEdBQUcsQ0FBQzthQUNaO2lCQUFNO2dCQUNMLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEI7WUFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNqQixJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM1QjtRQUNELElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztTQUNuQjthQUFNO1lBQ0wsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7U0FDeEI7UUFDRCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDdEIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7U0FDaEI7YUFBTTtZQUNMLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1NBQ2xCO0lBQ0gsQ0FBQztDQUNGO0FBQ0QsTUFBTSxPQUFPLE1BQU07SUFDakIsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNULE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDWixZQUFZLEdBQVEsRUFBRSxNQUFXO1FBQy9CLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQUksQ0FBQyxDQUFNO1FBQ1QsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM1QyxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUU7WUFDdkIsVUFBVSxHQUFHLE9BQU8sRUFBRSxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsVUFBVSxDQUFDO1NBQ3JDO1FBQ0QsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLE9BQU8sSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sRUFBRTtZQUNyRSxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztTQUNiO1FBQ0QsSUFBSSxXQUFXLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxXQUFXLEtBQUssRUFBRSxFQUFFO1lBQ3RCLFdBQVcsR0FBRyxHQUFHLEdBQUcsV0FBVyxDQUFDO1NBQ2pDO1FBQ0QsTUFBTSxPQUFPLEdBQUc7WUFDZCxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUk7WUFDaEIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVztZQUNwQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07WUFDaEIsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPO1NBQ25CLENBQUM7UUFDRixJQUFJLFVBQVUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2xDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDekI7UUFDRCxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsTUFBTSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDNUQsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLGVBQWUsQ0FDcEQsU0FBUyxFQUNULElBQUksQ0FBQyxHQUFHLEVBQ1IsYUFBYSxDQUNkLENBQUM7UUFDRixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0YifQ== \ No newline at end of file diff --git a/packages/libs/huawei/tsconfig.json b/packages/libs/huawei/tsconfig.json new file mode 100644 index 00000000..4ce7aeb5 --- /dev/null +++ b/packages/libs/huawei/tsconfig.json @@ -0,0 +1,41 @@ +{ + "compileOnSave": true, + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "node", + "esModuleInterop": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "inlineSourceMap":true, + "noImplicitThis": true, + "noUnusedLocals": true, + "stripInternal": true, + "skipLibCheck": true, + "pretty": true, + "declaration": true, + "forceConsistentCasingInFileNames": true, + "typeRoots": [ "./typings", "./node_modules/@types"], + "outDir": "dist", + "rootDir": "src", + "composite": true, + "useDefineForClassFields": true, + "strict": false, + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": false, + "lib": ["ESNext", "DOM"], + }, + "include": [ + "src/**/*.ts", + "src/**/*.d.ts", + "src/**/*.js", + "src/**/*.json" + ], + "exclude": [ + "*.ts", + "dist", + "node_modules", + "test" + ], +} diff --git a/packages/libs/k8s/.eslintrc b/packages/libs/k8s/.eslintrc new file mode 100644 index 00000000..a591578c --- /dev/null +++ b/packages/libs/k8s/.eslintrc @@ -0,0 +1,23 @@ +{ + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended", + "prettier" + ], + "env": { + "mocha": true + }, + "rules": { + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/ban-ts-ignore": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-empty-function": "off", +// "no-unused-expressions": "off", + "max-len": [0, 160, 2, { "ignoreUrls": true }] + } +} diff --git a/packages/plugins/plugin-util/.gitignore b/packages/libs/k8s/.gitignore similarity index 100% rename from packages/plugins/plugin-util/.gitignore rename to packages/libs/k8s/.gitignore diff --git a/packages/libs/k8s/.npmignore b/packages/libs/k8s/.npmignore new file mode 100644 index 00000000..bf40d278 --- /dev/null +++ b/packages/libs/k8s/.npmignore @@ -0,0 +1,2 @@ +node_modules +src \ No newline at end of file diff --git a/packages/libs/k8s/.prettierrc b/packages/libs/k8s/.prettierrc new file mode 100644 index 00000000..903b313d --- /dev/null +++ b/packages/libs/k8s/.prettierrc @@ -0,0 +1,7 @@ +{ + "printWidth": 160, + "bracketSpacing": true, + "singleQuote": true, + "trailingComma": "es5", + "arrowParens": "avoid" +} diff --git a/packages/libs/k8s/CHANGELOG.md b/packages/libs/k8s/CHANGELOG.md new file mode 100644 index 00000000..55e6df7f --- /dev/null +++ b/packages/libs/k8s/CHANGELOG.md @@ -0,0 +1,128 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [1.21.0](https://github.com/certd/certd/compare/v1.20.17...v1.21.0) (2024-07-03) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.20.17](https://github.com/certd/certd/compare/v1.20.16...v1.20.17) (2024-07-03) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.20.16](https://github.com/certd/certd/compare/v1.20.15...v1.20.16) (2024-07-01) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.20.15](https://github.com/certd/certd/compare/v1.20.14...v1.20.15) (2024-06-28) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.20.14](https://github.com/certd/certd/compare/v1.20.13...v1.20.14) (2024-06-23) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.20.13](https://github.com/certd/certd/compare/v1.20.12...v1.20.13) (2024-06-18) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.20.12](https://github.com/certd/certd/compare/v1.20.10...v1.20.12) (2024-06-17) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.20.10](https://github.com/certd/certd/compare/v1.20.9...v1.20.10) (2024-05-30) + +### Performance Improvements + +* 优化文件下载包名 ([d9eb927](https://github.com/certd/certd/commit/d9eb927b0a1445feab08b1958aa9ea80637a5ae6)) + +## [1.20.9](https://github.com/certd/certd/compare/v1.20.8...v1.20.9) (2024-03-22) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.20.8](https://github.com/certd/certd/compare/v1.20.7...v1.20.8) (2024-03-22) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.20.7](https://github.com/certd/certd/compare/v1.20.6...v1.20.7) (2024-03-22) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.20.6](https://github.com/certd/certd/compare/v1.20.5...v1.20.6) (2024-03-21) + +### Performance Improvements + +* 插件贡献文档及示例 ([72fb20a](https://github.com/certd/certd/commit/72fb20abf3ba5bdd862575d2907703a52fd7eb17)) + +## [1.20.5](https://github.com/certd/certd/compare/v1.20.2...v1.20.5) (2024-03-11) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.20.2](https://github.com/certd/certd/compare/v1.2.1...v1.20.2) (2024-02-28) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.2.1](https://github.com/certd/certd/compare/v1.2.0...v1.2.1) (2023-12-12) + +**Note:** Version bump only for package @certd/plugin-util + +**Note:** Version bump only for package @certd/plugin-util + +# [1.2.0](https://github.com/certd/certd/compare/v1.1.6...v1.2.0) (2023-10-27) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.1.6](https://github.com/certd/certd/compare/v1.1.5...v1.1.6) (2023-07-10) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.1.5](https://github.com/certd/certd/compare/v1.1.4...v1.1.5) (2023-07-03) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.1.4](https://github.com/certd/certd/compare/v1.1.3...v1.1.4) (2023-07-03) + +### Performance Improvements + +* timeout ([3eeb1f7](https://github.com/certd/certd/commit/3eeb1f77aa2922f3545f3d2067f561d95621d54f)) + +## [1.1.3](https://github.com/certd/certd/compare/v1.1.2...v1.1.3) (2023-07-03) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.1.2](https://github.com/certd/certd/compare/v1.1.1...v1.1.2) (2023-07-03) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.1.1](https://github.com/certd/certd/compare/v1.1.0...v1.1.1) (2023-06-28) + +**Note:** Version bump only for package @certd/plugin-util + +# [1.1.0](https://github.com/certd/certd/compare/v1.0.6...v1.1.0) (2023-06-28) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.0.6](https://github.com/certd/certd/compare/v1.0.5...v1.0.6) (2023-05-25) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.0.5](https://github.com/certd/certd/compare/v1.0.4...v1.0.5) (2023-05-25) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.0.4](https://github.com/certd/certd/compare/v1.0.3...v1.0.4) (2023-05-25) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.0.3](https://github.com/certd/certd/compare/v1.0.2...v1.0.3) (2023-05-25) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.0.2](https://github.com/certd/certd/compare/v1.0.1...v1.0.2) (2023-05-24) + +**Note:** Version bump only for package @certd/plugin-util + +## [1.0.1](https://github.com/certd/certd/compare/v1.0.0...v1.0.1) (2023-05-24) + +**Note:** Version bump only for package @certd/plugin-util diff --git a/packages/libs/k8s/README.md b/packages/libs/k8s/README.md new file mode 100644 index 00000000..30b15e21 --- /dev/null +++ b/packages/libs/k8s/README.md @@ -0,0 +1,16 @@ +# Vue 3 + TypeScript + Vite + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `