This commit is contained in:
Fu Diwei 2025-06-24 10:38:27 +08:00 committed by RHQYZ
parent 2a498edef7
commit 4d42b06572

View File

@ -511,20 +511,40 @@ export const newNode = (nodeType: WorkflowNodeType, options: NewNodeOptions = {}
type CloneNodeOptions = {
withCopySuffix?: boolean;
nodeIdMap?: Map<string, string>;
};
export const cloneNode = (sourceNode: WorkflowNode, { withCopySuffix }: CloneNodeOptions = { withCopySuffix: true }): WorkflowNode => {
export const cloneNode = (sourceNode: WorkflowNode, { withCopySuffix, nodeIdMap }: CloneNodeOptions = { withCopySuffix: true }): WorkflowNode => {
const { produce } = new Immer({ autoFreeze: false });
const deepClone = (node: WorkflowNode): WorkflowNode => {
return produce(node, (draft) => {
draft.id = nanoid();
nodeIdMap ??= new Map(); // 原节点 ID 映射到新节点 ID
nodeIdMap.set(node.id, draft.id);
if (draft.next) {
draft.next = cloneNode(draft.next, { withCopySuffix });
draft.next = cloneNode(draft.next, { withCopySuffix, nodeIdMap });
}
if (draft.branches) {
draft.branches = draft.branches.map((branch) => cloneNode(branch, { withCopySuffix }));
draft.branches = draft.branches.map((branch) => cloneNode(branch, { withCopySuffix, nodeIdMap }));
}
if (draft.config) {
switch (draft.type) {
case WorkflowNodeType.Deploy:
{
const prevNodeId = (draft.config as WorkflowNodeConfigForDeploy).certificate?.split("#")?.[0];
if (nodeIdMap.has(prevNodeId)) {
draft.config = {
...draft.config,
certificate: `${nodeIdMap.get(prevNodeId)}#certificate`,
} as WorkflowNodeConfigForDeploy;
}
}
break;
}
}
return draft;