mirror of
https://github.com/woodchen-ink/certimate.git
synced 2025-07-18 01:11:55 +08:00
fix: #812
This commit is contained in:
parent
2a498edef7
commit
4d42b06572
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user