Skip to content

Commit dbcf694

Browse files
committed
🚧 WIP Arrays
1 parent 0774162 commit dbcf694

32 files changed

+2135
-704
lines changed

src/Models/Options.ts

Lines changed: 0 additions & 5 deletions
This file was deleted.

src/Models/ParserTree.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
1-
import { Options } from './Options';
2-
import { Directive, OperationType } from './Spec';
1+
import { Directive, OperationType, FieldType } from './Spec';
32
import { GraphQLNodeParams } from './Types';
43

54
export interface ParserField {
65
name: string;
76
type: {
8-
name: string;
9-
options?: Options[];
7+
fieldType: FieldType;
108
operations?: OperationType[];
119
directiveOptions?: Directive[];
1210
};
1311
data: GraphQLNodeParams;
14-
args?: ParserField[];
15-
interfaces?: string[];
16-
directives?: ParserField[];
12+
args: ParserField[];
13+
interfaces: string[];
14+
directives: ParserField[];
1715
description?: string;
1816
}
1917

src/Models/Spec.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,11 @@ export enum Helpers {
9191
Extend = 'Extend',
9292
Comment = 'Comment',
9393
}
94+
95+
export enum Options {
96+
array = 'array',
97+
required = 'required',
98+
name = 'name',
99+
}
100+
101+
export type FieldType = { type: Options; nest?: FieldType; name?: string };

src/Models/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
export * from './ParserTree';
2-
export * from './Options';
32
export * from './Types';
43
export * from './Spec';
54
export * from './DisplayMap';

src/Parser/ParserUtils.ts

Lines changed: 0 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
11
import { ParserField, TypeDefinition, TypeExtension } from '@/Models';
22

3-
const compareArrays = (a1: any[] = [], a2: any[] = []): boolean =>
4-
a1.length === a2.length &&
5-
a1.sort().every((value, index) => {
6-
return value === a2.sort()[index];
7-
});
8-
93
const extensionMap: Record<TypeExtension, TypeDefinition> = {
104
EnumTypeExtension: TypeDefinition.EnumTypeDefinition,
115
InputObjectTypeExtension: TypeDefinition.InputObjectTypeDefinition,
@@ -18,51 +12,6 @@ const extensionMap: Record<TypeExtension, TypeDefinition> = {
1812
* Class used mainly for comparison of ParserFields
1913
*/
2014
export class ParserUtils {
21-
/**
22-
* Compare two parserFields
23-
*/
24-
static compareParserFields = (node1: ParserField, node2: ParserField): boolean => {
25-
if (
26-
node1.name !== node2.name ||
27-
node1.type.name !== node2.type.name ||
28-
!compareArrays(node1.type.directiveOptions, node2.type.directiveOptions) ||
29-
!compareArrays(node1.type.operations, node2.type.operations) ||
30-
!compareArrays(node1.type.options, node2.type.options) ||
31-
!compareArrays(node1.interfaces, node2.interfaces) ||
32-
!ParserUtils.compareParserTreesNodes(node1.directives, node2.directives) ||
33-
!ParserUtils.compareParserTreesNodes(node1.args, node2.args)
34-
) {
35-
return false;
36-
}
37-
return true;
38-
};
39-
/**
40-
* Compare parserfields arrays
41-
*/
42-
static compareParserTreesNodes = (t1: ParserField[] | undefined, t2: ParserField[] | undefined): boolean => {
43-
if (!t1) {
44-
if (!t2) {
45-
return true;
46-
}
47-
if (t2.length === 0) {
48-
return true;
49-
}
50-
return false;
51-
}
52-
if (!t2) {
53-
if (t1.length === 0) {
54-
return true;
55-
}
56-
return false;
57-
}
58-
for (const node1 of t1) {
59-
const compareResult = t2.find((node2) => ParserUtils.compareParserFields(node1, node2));
60-
if (!compareResult) {
61-
return false;
62-
}
63-
}
64-
return true;
65-
};
6615
static isExtensionOf = (extensionNode: ParserField, extendedNode: ParserField): boolean => {
6716
if (extendedNode.name !== extensionNode.name) {
6817
return false;

src/Parser/index.ts

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
isTypeSystemExtensionNode,
88
parse,
99
} from 'graphql';
10-
import { AllTypes, ParserField, ParserTree, TypeDefinitionDisplayMap } from '@/Models';
10+
import { AllTypes, ParserField, ParserTree, TypeDefinitionDisplayMap, Options } from '@/Models';
1111
import { Directive, Helpers, OperationType, TypeDefinition, TypeExtension } from '@/Models/Spec';
1212
import { TypeResolver } from './typeResolver';
1313
import { ParserUtils } from './ParserUtils';
@@ -36,18 +36,19 @@ export class Parser {
3636
type:
3737
d.kind === 'DirectiveDefinition'
3838
? {
39-
name: TypeDefinitionDisplayMap[d.kind],
39+
fieldType: { name: TypeDefinitionDisplayMap[d.kind], type: Options.name },
4040
directiveOptions: d.locations.map((l) => l.value as Directive),
4141
}
4242
: {
43-
name: TypeDefinitionDisplayMap[d.kind],
43+
fieldType: { name: TypeDefinitionDisplayMap[d.kind], type: Options.name },
4444
},
4545
data: {
4646
type: d.kind as AllTypes,
4747
},
48-
description: 'description' in d && d.description ? d.description.value : '',
49-
interfaces: 'interfaces' in d && d.interfaces ? d.interfaces.map((i) => i.name.value) : undefined,
50-
directives: 'directives' in d && d.directives ? TypeResolver.iterateDirectives(d.directives) : undefined,
48+
49+
...('description' in d && d.description?.value ? { description: d.description.value } : {}),
50+
interfaces: 'interfaces' in d && d.interfaces ? d.interfaces.map((i) => i.name.value) : [],
51+
directives: 'directives' in d && d.directives ? TypeResolver.iterateDirectives(d.directives) : [],
5152
args: TypeResolver.resolveFieldsFromDefinition(d),
5253
};
5354
}
@@ -94,19 +95,22 @@ export class Parser {
9495
.filter((t) => 'name' in t && t.name && !excludeRoots.includes(t.name.value))
9596
.map(Parser.documentDefinitionToSerializedNodeTree)
9697
.filter((d) => !!d) as ParserField[];
97-
const comments: ParserField[] = Parser.findComments(schema).map(
98-
(description) =>
99-
({
98+
const comments: ParserField[] = Parser.findComments(schema).map((description) => ({
99+
name: Helpers.Comment,
100+
type: {
101+
fieldType: {
100102
name: Helpers.Comment,
101-
type: {
102-
name: Helpers.Comment,
103-
},
104-
data: {
105-
type: Helpers.Comment,
106-
},
107-
description,
108-
} as ParserField),
109-
);
103+
type: Options.name,
104+
},
105+
},
106+
args: [],
107+
directives: [],
108+
interfaces: [],
109+
data: {
110+
type: Helpers.Comment,
111+
},
112+
description,
113+
}));
110114
const nodeTree: ParserTree = {
111115
nodes: [...comments, ...nodes],
112116
};
@@ -137,15 +141,9 @@ export class Parser {
137141
if (!extendedNode) {
138142
throw new Error(`Invalid extension node`);
139143
}
140-
if (e.directives) {
141-
extendedNode.directives = [...(extendedNode.directives || []), ...e.directives];
142-
}
143-
if (e.interfaces) {
144-
extendedNode.interfaces = [...(extendedNode.interfaces || []), ...e.interfaces];
145-
}
146-
if (e.args) {
147-
extendedNode.args = [...(extendedNode.args || []), ...e.args];
148-
}
144+
extendedNode.directives = [...(extendedNode.directives || []), ...e.directives];
145+
extendedNode.interfaces = [...(extendedNode.interfaces || []), ...e.interfaces];
146+
extendedNode.args = [...(extendedNode.args || []), ...e.args];
149147
});
150148

151149
return { nodes };

0 commit comments

Comments
 (0)