From 9475f2e56cdf0d94f1fc63ab14f140f5e256c900 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 7 Apr 2025 23:52:21 +0800 Subject: [PATCH] chore: code-editor --- packages/ui/certd-client/src/App.vue | 4 +- .../components/code-editor/async-import.ts | 37 +++ .../components/code-editor/import-works.ts | 48 ++++ .../src/components/code-editor/index.vue | 247 ++++++++++++++++++ .../src/components/code-editor/validators.ts | 37 +++ .../src/components/code-editor/workers.ts | 59 +++++ .../src/components/code-editor/yaml.worker.ts | 1 + .../ui/certd-client/src/components/index.ts | 6 + packages/ui/certd-client/src/main.ts | 7 +- .../src/views/certd/pipeline/detail.vue | 22 +- .../sys/plugin/components/plugin-input.vue | 108 ++++---- .../src/views/sys/plugin/edit.vue | 73 +++--- 12 files changed, 551 insertions(+), 98 deletions(-) create mode 100644 packages/ui/certd-client/src/components/code-editor/async-import.ts create mode 100644 packages/ui/certd-client/src/components/code-editor/import-works.ts create mode 100644 packages/ui/certd-client/src/components/code-editor/index.vue create mode 100644 packages/ui/certd-client/src/components/code-editor/validators.ts create mode 100644 packages/ui/certd-client/src/components/code-editor/workers.ts create mode 100644 packages/ui/certd-client/src/components/code-editor/yaml.worker.ts diff --git a/packages/ui/certd-client/src/App.vue b/packages/ui/certd-client/src/App.vue index 0b65e7b7..9197921d 100644 --- a/packages/ui/certd-client/src/App.vue +++ b/packages/ui/certd-client/src/App.vue @@ -1,9 +1,9 @@ diff --git a/packages/ui/certd-client/src/components/code-editor/async-import.ts b/packages/ui/certd-client/src/components/code-editor/async-import.ts new file mode 100644 index 00000000..c550158a --- /dev/null +++ b/packages/ui/certd-client/src/components/code-editor/async-import.ts @@ -0,0 +1,37 @@ +export async function importJsYaml() { + return await import("js-yaml"); +} + +export async function importYamlContribution() { + await import("monaco-editor/esm/vs/basic-languages/yaml/yaml.contribution"); +} + +export async function importJsonContribution() { + await import("monaco-editor/esm/vs/language/json/monaco.contribution"); +} + +export async function importJavascriptContribution() { + await import("monaco-editor/esm/vs/basic-languages/javascript/javascript.contribution"); +} + +export async function importMonacoYaml() { + return await import("monaco-yaml"); +} + +export async function importWorks() { + const editorWorker = await import("monaco-editor/esm/vs/editor/editor.worker?worker"); + const jsonWorker = await import("monaco-editor/esm/vs/language/json/json.worker?worker"); + const cssWorker = await import("monaco-editor/esm/vs/language/css/css.worker?worker"); + const htmlWorker = await import("monaco-editor/esm/vs/language/html/html.worker?worker"); + const tsWorker = await import("monaco-editor/esm/vs/language/typescript/ts.worker?worker"); + const yamlWorker = await import("./yaml.worker?worker"); + + return { + editorWorker, + jsonWorker, + cssWorker, + htmlWorker, + tsWorker, + yamlWorker, + }; +} diff --git a/packages/ui/certd-client/src/components/code-editor/import-works.ts b/packages/ui/certd-client/src/components/code-editor/import-works.ts new file mode 100644 index 00000000..ee04a655 --- /dev/null +++ b/packages/ui/certd-client/src/components/code-editor/import-works.ts @@ -0,0 +1,48 @@ +// const editorWorker = await import("monaco-editor/esm/vs/editor/editor.worker?worker"); +// const jsonWorker = await import("monaco-editor/esm/vs/language/json/json.worker?worker"); +// const cssWorker = await import("monaco-editor/esm/vs/language/css/css.worker?worker"); +// const htmlWorker = await import("monaco-editor/esm/vs/language/html/html.worker?worker"); +// const tsWorker = await import("monaco-editor/esm/vs/language/typescript/ts.worker?worker"); +// const yamlWorker = await import("monaco-yaml/yaml.worker.js?worker"); + +import editorWorker from "monaco-editor/esm/vs/editor/editor.worker?worker"; +import jsonWorker from "monaco-editor/esm/vs/language/json/json.worker?worker"; +import cssWorker from "monaco-editor/esm/vs/language/css/css.worker?worker"; +import htmlWorker from "monaco-editor/esm/vs/language/html/html.worker?worker"; +import tsWorker from "monaco-editor/esm/vs/language/typescript/ts.worker?worker"; +import yamlWorker from "./yaml.worker?worker"; + +const WorkerBucket: any = {}; + +/** + * 注册自定义worker + * @param name + * @param worker + */ +export function registerWorker(name: string, worker: any) { + WorkerBucket[name] = worker; +} +//@ts-ignore +window.MonacoEnvironment = { + //@ts-ignore + getWorker(_, label) { + debugger; + const custom = WorkerBucket[label]; + if (custom) { + return new custom(); + } + if (label === "json") { + return new jsonWorker(); + } else if (label === "css" || label === "scss" || label === "less") { + return new cssWorker(); + } else if (label === "html" || label === "handlebars" || label === "razor") { + return new htmlWorker(); + } else if (label === "typescript" || label === "javascript") { + return new tsWorker(); + } else if (label === "yaml" || label === "yml") { + //@ts-ignore + return new yamlWorker(); + } + return new editorWorker(); + }, +}; diff --git a/packages/ui/certd-client/src/components/code-editor/index.vue b/packages/ui/certd-client/src/components/code-editor/index.vue new file mode 100644 index 00000000..8da38344 --- /dev/null +++ b/packages/ui/certd-client/src/components/code-editor/index.vue @@ -0,0 +1,247 @@ + + + + + diff --git a/packages/ui/certd-client/src/components/code-editor/validators.ts b/packages/ui/certd-client/src/components/code-editor/validators.ts new file mode 100644 index 00000000..d55f80d3 --- /dev/null +++ b/packages/ui/certd-client/src/components/code-editor/validators.ts @@ -0,0 +1,37 @@ +import { importJsYaml } from "./async-import"; + +const jsonRule = { + validator: async (rule: any, value: any) => { + //校验value json的有效性 + if (value) { + try { + JSON.parse(value); + } catch (e: any) { + console.error(e); + throw new Error("json格式错误:" + e.message); + } + } + }, + message: "json格式错误", +}; + +const yamlRule = { + validator: async (rule: any, value: any) => { + //校验value yaml的有效性 + if (value) { + try { + const yaml = await importJsYaml(); + yaml.load(value, { schema: yaml.JSON_SCHEMA }); + } catch (e: any) { + console.error(e); + throw new Error("yaml格式错误:" + e.message); + } + } + }, + message: "yaml格式错误", +}; + +export const FsEditorCodeValidators = { + jsonRule, + yamlRule, +}; diff --git a/packages/ui/certd-client/src/components/code-editor/workers.ts b/packages/ui/certd-client/src/components/code-editor/workers.ts new file mode 100644 index 00000000..31cd3aa0 --- /dev/null +++ b/packages/ui/certd-client/src/components/code-editor/workers.ts @@ -0,0 +1,59 @@ +import { importWorks } from "./async-import"; + +const WorkerBucket: any = {}; + +/** + * 注册自定义worker + * @param name + * @param worker + */ +export function registerWorker(name: string, worker: any) { + WorkerBucket[name] = worker; +} + +export async function initWorkers() { + if (window.MonacoEnvironment) { + return; + } + + // const { editorWorker, jsonWorker, cssWorker, htmlWorker, tsWorker } = await importWorks(); + // + // // const editorWorker = new Worker(new URL("monaco-editor/esm/vs/editor/editor.worker.js", import.meta.url)); + // // const jsonWorker = new Worker(new URL("monaco-editor/esm/vs/language/json/json.worker.js", import.meta.url)); + // // const cssWorker = new Worker(new URL("monaco-editor/esm/vs/language/css/css.worker.js", import.meta.url)); + // // const htmlWorker = new Worker(new URL("monaco-editor/esm/vs/language/html/html.worker.js", import.meta.url)); + // // const tsWorker = new Worker(new URL("monaco-editor/esm/vs/language/typescript/ts.worker.js", import.meta.url)); + // // const yamlWorker = new Worker(new URL("./yaml.worker.js", import.meta.url)); + + const editorWorker = await import("monaco-editor/esm/vs/editor/editor.worker?worker"); + const jsonWorker = await import("monaco-editor/esm/vs/language/json/json.worker?worker"); + const cssWorker = await import("monaco-editor/esm/vs/language/css/css.worker?worker"); + const htmlWorker = await import("monaco-editor/esm/vs/language/html/html.worker?worker"); + const tsWorker = await import("monaco-editor/esm/vs/language/typescript/ts.worker?worker"); + const yamlWorker = await import("./yaml.worker?worker"); + + //@ts-ignore + window.MonacoEnvironment = { + //@ts-ignore + getWorker(_, label) { + const custom = WorkerBucket[label]; + if (custom) { + return new custom(); + } + if (label === "json") { + return new jsonWorker.default(); + } else if (label === "css" || label === "scss" || label === "less") { + return new cssWorker.default(); + } else if (label === "html" || label === "handlebars" || label === "razor") { + return new htmlWorker.default(); + } else if (label === "typescript" || label === "javascript") { + return new tsWorker.default(); + } else if (label === "yaml" || label === "yml") { + debugger; + //@ts-ignore + return new yamlWorker.default(); + } + return new editorWorker.default(); + }, + }; +} diff --git a/packages/ui/certd-client/src/components/code-editor/yaml.worker.ts b/packages/ui/certd-client/src/components/code-editor/yaml.worker.ts new file mode 100644 index 00000000..e56ff9c9 --- /dev/null +++ b/packages/ui/certd-client/src/components/code-editor/yaml.worker.ts @@ -0,0 +1 @@ +export * from "monaco-yaml/yaml.worker.js"; diff --git a/packages/ui/certd-client/src/components/index.ts b/packages/ui/certd-client/src/components/index.ts index a2de51da..4698b26d 100644 --- a/packages/ui/certd-client/src/components/index.ts +++ b/packages/ui/certd-client/src/components/index.ts @@ -12,12 +12,18 @@ import IconSelect from "./icon-select.vue"; import ExpiresTimeText from "./expires-time-text.vue"; import FileInput from "./file-input.vue"; import PemInput from "./pem-input.vue"; +import { defineAsyncComponent } from "vue"; export default { install(app: any) { + app.component( + "CodeEditor", + defineAsyncComponent(() => import("./code-editor/index.vue")) + ); app.component("PiContainer", PiContainer); app.component("TextEditable", TextEditable); app.component("FileInput", FileInput); app.component("PemInput", PemInput); + // app.component("CodeEditor", CodeEditor); app.component("CronLight", CronLight); app.component("CronEditor", CronEditor); diff --git a/packages/ui/certd-client/src/main.ts b/packages/ui/certd-client/src/main.ts index 478b236f..e7fba4bf 100644 --- a/packages/ui/certd-client/src/main.ts +++ b/packages/ui/certd-client/src/main.ts @@ -13,6 +13,7 @@ import plugin from "./plugin/"; import { setupVben } from "./vben"; import { util } from "/@/utils"; import { initPreferences } from "/@/vben/preferences"; +// import "./components/code-editor/import-works"; // @ts-ignore async function bootstrap() { const app = createApp(App); @@ -33,9 +34,9 @@ async function bootstrap() { namespace, overrides: { app: { - name: import.meta.env.VITE_APP_TITLE - } - } + name: import.meta.env.VITE_APP_TITLE, + }, + }, }); app.mount("#app"); diff --git a/packages/ui/certd-client/src/views/certd/pipeline/detail.vue b/packages/ui/certd-client/src/views/certd/pipeline/detail.vue index 6649b360..06ab5ccf 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/detail.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/detail.vue @@ -18,7 +18,7 @@ import { LocalStorage } from "/@/utils/util.storage"; import { useUserStore } from "/@/store/modules/user"; defineOptions({ - name: "PipelineDetail" + name: "PipelineDetail", }); const route = useRoute(); const pipelineId: Ref = ref(route.query.id); @@ -33,8 +33,8 @@ const pipelineOptions: PipelineOptions = { userId: detail.pipeline.userId, stages: [], triggers: [], - ...JSON.parse(detail.pipeline.content || "{}") - } + ...JSON.parse(detail.pipeline.content || "{}"), + }, } as PipelineDetail; }, @@ -56,13 +56,13 @@ const pipelineOptions: PipelineOptions = { async doSave(pipelineConfig: any) { await api.Save({ id: pipelineConfig.id, - content: JSON.stringify(pipelineConfig) + content: JSON.stringify(pipelineConfig), }); }, async doTrigger(options: { pipelineId: number; stepId?: string }) { const { pipelineId, stepId } = options; await api.Trigger(pipelineId, stepId); - } + }, }; const pipelineOptionsRef: Ref = ref(pipelineOptions); @@ -83,7 +83,7 @@ function useTour() { onFinish: () => { tour.value.open = false; LocalStorage.set("tour-off", true, 999999999); - } + }, }); const tourHandleOpen = (val: boolean): void => { @@ -99,28 +99,28 @@ function useTour() { description: "这里就是我们刚创建的证书任务,点击可以修改证书申请参数", target: () => { return document.querySelector(".pipeline .stages .stage_0 .task"); - } + }, }, { title: "添加部署证书任务", description: "证书申请成功之后还需要部署证书,点击这里可以添加证书部署任务", target: () => { return document.querySelector(".pipeline .stages .last-stage .tasks .task"); - } + }, }, { title: "手动运行流水线", description: "点击此处可以手动运行流水线", target: () => { return document.querySelector(".pipeline .stages .first-stage .tasks .task"); - } - } + }, + }, ]; } return { tour, - tourHandleOpen + tourHandleOpen, }; } diff --git a/packages/ui/certd-client/src/views/sys/plugin/components/plugin-input.vue b/packages/ui/certd-client/src/views/sys/plugin/components/plugin-input.vue index c661872f..0dda49ac 100644 --- a/packages/ui/certd-client/src/views/sys/plugin/components/plugin-input.vue +++ b/packages/ui/certd-client/src/views/sys/plugin/components/plugin-input.vue @@ -25,8 +25,11 @@ - - + + + + + @@ -39,7 +42,7 @@