Skip to content

Commit 41f1c37

Browse files
committed
fix add and delete field to node
1 parent 1c4d70a commit 41f1c37

File tree

3 files changed

+32
-10
lines changed

3 files changed

+32
-10
lines changed

src/TreeOperations/tree.ts

+10-10
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const mutate = (tree: ParserTree, allNodes: ParserField[]) => {
4444
return;
4545
}
4646
};
47-
const deleteFieldFromNode = (n: ParserField, i: number) => {
47+
const deleteFieldFromNode = (n: ParserField, i: number, parentNode?: string) => {
4848
if (n.data.type === TypeDefinition.InterfaceTypeDefinition) {
4949
const argName = n.args[i].name;
5050
tree.nodes
@@ -64,7 +64,7 @@ export const mutate = (tree: ParserTree, allNodes: ParserField[]) => {
6464
}
6565
n.args.splice(i, 1);
6666
regenerateId(n);
67-
mutateParentIfField(n);
67+
mutateParentIfField(n, parentNode);
6868
};
6969

7070
const updateFieldOnNode = (node: ParserField, i: number, updatedField: ParserField, parentNode?: string) => {
@@ -82,13 +82,13 @@ export const mutate = (tree: ParserTree, allNodes: ParserField[]) => {
8282
mutateParentIfField(node, parentNode);
8383
};
8484

85-
const addFieldToNode = (node: ParserField, f: ParserField) => {
85+
const addFieldToNode = (node: ParserField, f: ParserField, parentNode?: string) => {
8686
node.args?.push({ ...f });
8787
if (node.data.type === TypeDefinition.InterfaceTypeDefinition) {
8888
updateInterfaceNodeAddField(tree.nodes, node);
8989
}
9090
regenerateId(node);
91-
mutateParentIfField(node);
91+
mutateParentIfField(node, parentNode);
9292
};
9393
const renameRootNode = (node: ParserField, newName: string) => {
9494
const isError = allNodes.map((n) => n.name).includes(newName);
@@ -118,20 +118,20 @@ export const mutate = (tree: ParserTree, allNodes: ParserField[]) => {
118118
node.name = newName;
119119
regenerateId(node);
120120
};
121-
const removeNode = (node: ParserField) => {
121+
const removeNode = (node: ParserField, parentNode?: string) => {
122122
if (node.data.type === TypeSystemDefinition.FieldDefinition) {
123123
const parent = allNodes.find((parentNode) => parentNode.args.includes(node));
124124
if (parent) {
125125
const index = parent.args.indexOf(node);
126-
deleteFieldFromNode(parent, index);
126+
deleteFieldFromNode(parent, index, parentNode);
127127
}
128128
return;
129129
}
130130
if (node.data.type === TypeSystemDefinition.UnionMemberDefinition) {
131131
const parent = allNodes.find((parentNode) => parentNode.args.includes(node));
132132
if (parent) {
133133
const index = parent.args.indexOf(node);
134-
deleteFieldFromNode(parent, index);
134+
deleteFieldFromNode(parent, index, parentNode);
135135
}
136136
return;
137137
}
@@ -142,13 +142,13 @@ export const mutate = (tree: ParserTree, allNodes: ParserField[]) => {
142142
recursivelyDeleteDirectiveArgument(allNodes, parent.name, node);
143143
}
144144
const index = parent.args.indexOf(node);
145-
deleteFieldFromNode(parent, index);
145+
deleteFieldFromNode(parent, index, parentNode);
146146
} else {
147147
const parent = allNodes.find((p) => p.args.some((a) => a.args.includes(node)));
148148
const field = parent?.args.find((a) => a.args.includes(node));
149149
if (field) {
150150
const fieldIndex = field.args.findIndex((f) => f === node);
151-
deleteFieldFromNode(field, fieldIndex);
151+
deleteFieldFromNode(field, fieldIndex, parentNode);
152152
}
153153
}
154154
return;
@@ -157,7 +157,7 @@ export const mutate = (tree: ParserTree, allNodes: ParserField[]) => {
157157
const parent = allNodes.find((parentNode) => parentNode.args.includes(node));
158158
if (parent) {
159159
const index = parent.args.indexOf(node);
160-
deleteFieldFromNode(parent, index);
160+
deleteFieldFromNode(parent, index, parentNode);
161161
}
162162
return;
163163
}

src/__tests__/TreeOperations/tree.addField.spec.ts

+12
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,16 @@ describe('Tree Operations tests - adding fields', () => {
3939

4040
expect(treeMock.nodes[0].args[2].args).toContainEqual(limitNode);
4141
});
42+
test('Add field with args to node that exists in other type', () => {
43+
const treeMock = createMock();
44+
const oldField = treeMock.nodes[2].args[0].args[0];
45+
const newField = {
46+
...oldField,
47+
name: 'secondName',
48+
};
49+
50+
mutate(treeMock, treeMock.nodes).addFieldToNode(treeMock.nodes[2].args[0], newField, treeMock.nodes[2].id);
51+
expect(treeMock.nodes[2].args[0].args).toContainEqual(newField);
52+
expect(treeMock.nodes[0].args[3].args).not.toContainEqual(newField);
53+
});
4254
});

src/__tests__/TreeOperations/tree.remove.spec.ts

+10
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,14 @@ describe('Tree Operations - node removal tests', () => {
8282
expect(treeMock.nodes).not.toContainEqual(oldExtendNode);
8383
expect(treeMock.nodes).not.toContainEqual(oldExtendNode2);
8484
});
85+
test('Delete field with args that exists in other type', () => {
86+
const treeMock = createMock();
87+
const oldField = treeMock.nodes[2].args[0].args[0];
88+
console.log(oldField);
89+
90+
mutate(treeMock, treeMock.nodes).removeNode(treeMock.nodes[2].args[0].args[0]);
91+
console.log(treeMock.nodes[2].args[0], treeMock.nodes[0].args[3]);
92+
expect(treeMock.nodes[2].args[0].args).not.toContainEqual(oldField);
93+
expect(treeMock.nodes[0].args[3].args).toContainEqual(oldField);
94+
});
8595
});

0 commit comments

Comments
 (0)