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 @@