diff --git a/package.json b/package.json index 19bfcc8..eac9454 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "graphql-js-tree", - "version": "3.0.0", + "version": "3.0.1", "private": false, "license": "MIT", "description": "GraphQL Parser providing simplier structure", diff --git a/src/TreeOperations/tree.ts b/src/TreeOperations/tree.ts index ca99819..e931f55 100644 --- a/src/TreeOperations/tree.ts +++ b/src/TreeOperations/tree.ts @@ -44,7 +44,7 @@ export const mutate = (tree: ParserTree, allNodes: ParserField[]) => { return; } }; - const deleteFieldFromNode = (n: ParserField, i: number) => { + const deleteFieldFromNode = (n: ParserField, i: number, parentNode?: string) => { if (n.data.type === TypeDefinition.InterfaceTypeDefinition) { const argName = n.args[i].name; tree.nodes @@ -64,7 +64,7 @@ export const mutate = (tree: ParserTree, allNodes: ParserField[]) => { } n.args.splice(i, 1); regenerateId(n); - mutateParentIfField(n); + mutateParentIfField(n, parentNode); }; const updateFieldOnNode = (node: ParserField, i: number, updatedField: ParserField, parentNode?: string) => { @@ -82,13 +82,13 @@ export const mutate = (tree: ParserTree, allNodes: ParserField[]) => { mutateParentIfField(node, parentNode); }; - const addFieldToNode = (node: ParserField, f: ParserField) => { + const addFieldToNode = (node: ParserField, f: ParserField, parentNode?: string) => { node.args?.push({ ...f }); if (node.data.type === TypeDefinition.InterfaceTypeDefinition) { updateInterfaceNodeAddField(tree.nodes, node); } regenerateId(node); - mutateParentIfField(node); + mutateParentIfField(node, parentNode); }; const renameRootNode = (node: ParserField, newName: string) => { const isError = allNodes.map((n) => n.name).includes(newName); @@ -118,12 +118,12 @@ export const mutate = (tree: ParserTree, allNodes: ParserField[]) => { node.name = newName; regenerateId(node); }; - const removeNode = (node: ParserField) => { + const removeNode = (node: ParserField, parentNode?: string) => { if (node.data.type === TypeSystemDefinition.FieldDefinition) { const parent = allNodes.find((parentNode) => parentNode.args.includes(node)); if (parent) { const index = parent.args.indexOf(node); - deleteFieldFromNode(parent, index); + deleteFieldFromNode(parent, index, parentNode); } return; } @@ -131,7 +131,7 @@ export const mutate = (tree: ParserTree, allNodes: ParserField[]) => { const parent = allNodes.find((parentNode) => parentNode.args.includes(node)); if (parent) { const index = parent.args.indexOf(node); - deleteFieldFromNode(parent, index); + deleteFieldFromNode(parent, index, parentNode); } return; } @@ -142,13 +142,13 @@ export const mutate = (tree: ParserTree, allNodes: ParserField[]) => { recursivelyDeleteDirectiveArgument(allNodes, parent.name, node); } const index = parent.args.indexOf(node); - deleteFieldFromNode(parent, index); + deleteFieldFromNode(parent, index, parentNode); } else { const parent = allNodes.find((p) => p.args.some((a) => a.args.includes(node))); const field = parent?.args.find((a) => a.args.includes(node)); if (field) { const fieldIndex = field.args.findIndex((f) => f === node); - deleteFieldFromNode(field, fieldIndex); + deleteFieldFromNode(field, fieldIndex, parentNode); } } return; @@ -157,7 +157,7 @@ export const mutate = (tree: ParserTree, allNodes: ParserField[]) => { const parent = allNodes.find((parentNode) => parentNode.args.includes(node)); if (parent) { const index = parent.args.indexOf(node); - deleteFieldFromNode(parent, index); + deleteFieldFromNode(parent, index, parentNode); } return; } diff --git a/src/__tests__/TreeOperations/tree.addField.spec.ts b/src/__tests__/TreeOperations/tree.addField.spec.ts index 28aa24c..d5b9524 100644 --- a/src/__tests__/TreeOperations/tree.addField.spec.ts +++ b/src/__tests__/TreeOperations/tree.addField.spec.ts @@ -39,4 +39,16 @@ describe('Tree Operations tests - adding fields', () => { expect(treeMock.nodes[0].args[2].args).toContainEqual(limitNode); }); + test('Add field with args to node that exists in other type', () => { + const treeMock = createMock(); + const oldField = treeMock.nodes[2].args[0].args[0]; + const newField = { + ...oldField, + name: 'secondName', + }; + + mutate(treeMock, treeMock.nodes).addFieldToNode(treeMock.nodes[2].args[0], newField, treeMock.nodes[2].id); + expect(treeMock.nodes[2].args[0].args).toContainEqual(newField); + expect(treeMock.nodes[0].args[3].args).not.toContainEqual(newField); + }); }); diff --git a/src/__tests__/TreeOperations/tree.remove.spec.ts b/src/__tests__/TreeOperations/tree.remove.spec.ts index ee08270..7fc82ad 100644 --- a/src/__tests__/TreeOperations/tree.remove.spec.ts +++ b/src/__tests__/TreeOperations/tree.remove.spec.ts @@ -82,4 +82,12 @@ describe('Tree Operations - node removal tests', () => { expect(treeMock.nodes).not.toContainEqual(oldExtendNode); expect(treeMock.nodes).not.toContainEqual(oldExtendNode2); }); + test('Delete field with args that exists in other type', () => { + const treeMock = createMock(); + const oldField = treeMock.nodes[2].args[0].args[0]; + + mutate(treeMock, treeMock.nodes).removeNode(treeMock.nodes[2].args[0].args[0], treeMock.nodes[2].id); + expect(treeMock.nodes[2].args[0].args).not.toContainEqual(oldField); + expect(treeMock.nodes[0].args[3].args).toContainEqual(oldField); + }); });