Skip to content

Commit 678caa5

Browse files
committed
✨ removing extension nodes
1 parent 7bbfec5 commit 678caa5

File tree

5 files changed

+63
-3
lines changed

5 files changed

+63
-3
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "graphql-js-tree",
3-
"version": "0.3.0",
3+
"version": "0.3.1",
44
"private": false,
55
"license": "MIT",
66
"description": "GraphQL Parser providing simplier structure",

src/TreeOperations/shared.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
1-
import { AllTypes, FieldType, Options, ParserField, ScalarTypes, TypeExtension } from '@/Models';
1+
import {
2+
AllTypes,
3+
FieldType,
4+
Options,
5+
ParserField,
6+
ParserTree,
7+
ScalarTypes,
8+
TypeDefinition,
9+
TypeExtension,
10+
} from '@/Models';
211
import { generateNodeId, getTypeName } from '@/shared';
312

413
export function filterNotNull<T>(t: T | null): t is T {
@@ -102,6 +111,26 @@ export const ChangeAllRelatedNodes = ({
102111
}) => {
103112
nodes.forEach((n) => ChangeRelatedNode({ oldName, newName, node: n }));
104113
};
114+
export const RemoveRelatedExtensionNodes = ({ node, tree }: { tree: ParserTree; node: ParserField }) => {
115+
const {
116+
data: { type },
117+
} = node;
118+
if (
119+
type === TypeDefinition.EnumTypeDefinition ||
120+
type === TypeDefinition.InputObjectTypeDefinition ||
121+
type === TypeDefinition.InterfaceTypeDefinition ||
122+
type === TypeDefinition.ObjectTypeDefinition ||
123+
type === TypeDefinition.ScalarTypeDefinition ||
124+
type === TypeDefinition.UnionTypeDefinition
125+
) {
126+
[...tree.nodes].forEach((n) => {
127+
if (n.name === node.name) {
128+
const nodeToBeRemoved = tree.nodes.findIndex((fn) => fn.id === n.id);
129+
tree.nodes.splice(nodeToBeRemoved, 1);
130+
}
131+
});
132+
}
133+
};
105134

106135
export const isScalarArgument = (field: ParserField, scalarTypes: string[]) => {
107136
const typeName = getTypeName(field.type.fieldType);

src/TreeOperations/tree.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {
2828
isExtensionNode,
2929
isScalarArgument,
3030
regenerateId,
31+
RemoveRelatedExtensionNodes,
3132
} from '@/TreeOperations/shared';
3233

3334
export const mutate = (tree: ParserTree, allNodes: ParserField[]) => {
@@ -172,6 +173,7 @@ export const mutate = (tree: ParserTree, allNodes: ParserField[]) => {
172173
if (node.data.type === TypeExtension.InterfaceTypeExtension) {
173174
}
174175
tree.nodes.splice(deletedNode, 1);
176+
RemoveRelatedExtensionNodes({ node, tree });
175177
tree.nodes.forEach((n) => {
176178
n.args = n.args
177179
.filter((a) => {

src/__tests__/TreeOperations/mocks.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ParserTree, TypeDefinition, ScalarTypes, ValueDefinition, Options, Value } from '@/Models';
1+
import { ParserTree, TypeDefinition, ScalarTypes, ValueDefinition, Options, Value, TypeExtension } from '@/Models';
22
import {
33
createRootField,
44
createPlainField,
@@ -9,6 +9,7 @@ import {
99
createPlainArgument,
1010
createPlainEnumValue,
1111
createUnionMember,
12+
createRootExtensionField,
1213
} from '@/shared';
1314

1415
const mainMock: ParserTree = {
@@ -135,6 +136,26 @@ const mainMock: ParserTree = {
135136
name: 'model',
136137
args: [createPlainInputValue({ name: 'maxAge', type: ScalarTypes.Int })],
137138
}),
139+
createRootExtensionField({
140+
name: 'Person',
141+
type: TypeExtension.ObjectTypeExtension,
142+
args: [
143+
createPlainField({
144+
name: 'extendedName',
145+
type: ScalarTypes.String,
146+
}),
147+
],
148+
}),
149+
createRootExtensionField({
150+
name: 'Person',
151+
type: TypeExtension.ObjectTypeExtension,
152+
args: [
153+
createPlainField({
154+
name: 'extendedName2',
155+
type: ScalarTypes.String,
156+
}),
157+
],
158+
}),
138159
],
139160
};
140161

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,12 @@ describe('Tree Operations - node removal tests', () => {
7474
expect(treeMock.nodes[5].args).not.toContainEqual(oldArgument);
7575
expect(treeMock.nodes[0].directives[0].args).toHaveLength(0);
7676
});
77+
test('Delete node extensions when node is removed', () => {
78+
const treeMock = createMock();
79+
const oldExtendNode = JSON.parse(JSON.stringify(treeMock.nodes[6]));
80+
const oldExtendNode2 = JSON.parse(JSON.stringify(treeMock.nodes[7]));
81+
mutate(treeMock, treeMock.nodes).removeNode(treeMock.nodes[0]);
82+
expect(treeMock.nodes).not.toContainEqual(oldExtendNode);
83+
expect(treeMock.nodes).not.toContainEqual(oldExtendNode2);
84+
});
7785
});

0 commit comments

Comments
 (0)