Skip to content

Commit 6f714f2

Browse files
committed
⚡ improved Value AST
1 parent ff7c945 commit 6f714f2

File tree

13 files changed

+149
-821
lines changed

13 files changed

+149
-821
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.2.3",
3+
"version": "0.2.4",
44
"private": false,
55
"license": "MIT",
66
"description": "GraphQL Parser providing simplier structure",

src/Models/ParserTree.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Directive, OperationType, FieldType } from './Spec';
1+
import { Directive, OperationType, FieldType, Value } from './Spec';
22
import { GraphQLNodeParams } from './Types';
33

44
export interface ParserField {
@@ -15,6 +15,10 @@ export interface ParserField {
1515
directives: ParserField[];
1616
description?: string;
1717
fromInterface?: string[];
18+
value?: {
19+
type: Value;
20+
value?: string;
21+
};
1822
}
1923

2024
export interface ParserTree {

src/Models/Types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export type AllTypes =
3030
| Type;
3131

3232
export const kindAsAllTypes = (v: string) => v as AllTypes;
33+
export const kindAsValue = (v: string) => v as Value;
3334
export interface GraphQLNodeParams {
3435
type: AllTypes;
3536
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { ValueNode } from 'graphql';
2+
3+
export const extractDefaultValueString = (graphqlNode: ValueNode) => {
4+
const startIndex = graphqlNode.loc?.start;
5+
const endIndex = graphqlNode.loc?.end;
6+
if (!startIndex || !endIndex) return;
7+
8+
const textNode = graphqlNode.loc?.source.body.slice(startIndex, endIndex);
9+
if (textNode && graphqlNode.kind === 'StringValue' && textNode.match(/^"|'/gm) && textNode.match(/"|'$/gm)) {
10+
return textNode.slice(1, -1);
11+
}
12+
return textNode;
13+
};

src/Parser/typeResolver.ts

Lines changed: 24 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ import {
1010
TypeSystemExtensionNode,
1111
ValueNode,
1212
} from 'graphql';
13-
import { AllTypes, kindAsAllTypes, Options, ParserField } from '@/Models';
14-
import { Instances, TypeSystemDefinition, Value, ValueDefinition } from '@/Models/Spec';
13+
import { kindAsValue, Options, ParserField } from '@/Models';
14+
import { Instances, TypeSystemDefinition, ValueDefinition } from '@/Models/Spec';
1515
import { generateNodeId } from '@/shared';
16+
import { extractDefaultValueString } from '@/Parser/extractDefaultValueString';
1617

1718
/**
1819
* Class for resolving Types to ParserFields
@@ -93,7 +94,6 @@ export class TypeResolver {
9394
* @param f
9495
*/
9596
static resolveObjectField(f: ObjectFieldNode): ParserField[] {
96-
const args = TypeResolver.resolveValue(f.value);
9797
return [
9898
{
9999
name: f.name.value,
@@ -105,106 +105,16 @@ export class TypeResolver {
105105
},
106106
interfaces: [],
107107
directives: [],
108-
args,
109-
id: generateNodeId(f.name.value, Instances.Argument, args),
108+
args: [],
109+
value: {
110+
type: kindAsValue(f.value.kind),
111+
value: extractDefaultValueString(f.value),
112+
},
113+
id: generateNodeId(f.name.value, Instances.Argument, []),
110114
},
111115
];
112116
}
113117

114-
/**
115-
* Resolve GraphQL ValueNode
116-
*
117-
* @param value
118-
*/
119-
static resolveValue(value: ValueNode): ParserField[] {
120-
if (value.kind === 'ListValue') {
121-
const args = value.values.map((f) => TypeResolver.resolveValue(f)).reduce((a, b) => [...a, ...b], []);
122-
123-
return [
124-
{
125-
name: value.kind,
126-
directives: [],
127-
interfaces: [],
128-
args,
129-
data: {
130-
type: kindAsAllTypes(value.kind),
131-
},
132-
type: {
133-
fieldType: {
134-
name: kindAsAllTypes(value.kind),
135-
type: Options.name,
136-
},
137-
},
138-
id: generateNodeId(value.kind, kindAsAllTypes(value.kind), args),
139-
},
140-
];
141-
}
142-
if (value.kind === 'ObjectValue') {
143-
const args = value.fields.map((f) => TypeResolver.resolveObjectField(f)).reduce((a, b) => [...a, ...b], []);
144-
145-
return [
146-
{
147-
args,
148-
name: value.kind,
149-
directives: [],
150-
interfaces: [],
151-
data: {
152-
type: kindAsAllTypes(value.kind),
153-
},
154-
type: {
155-
fieldType: {
156-
name: kindAsAllTypes(value.kind),
157-
type: Options.name,
158-
},
159-
},
160-
id: generateNodeId(value.kind, kindAsAllTypes(value.kind), args),
161-
},
162-
];
163-
}
164-
if (value.kind === 'EnumValue') {
165-
return [
166-
{
167-
name: value.value,
168-
args: [],
169-
directives: [],
170-
interfaces: [],
171-
data: {
172-
type: kindAsAllTypes(value.kind),
173-
},
174-
type: {
175-
fieldType: {
176-
name: value.value as AllTypes,
177-
type: Options.name,
178-
},
179-
},
180-
id: generateNodeId(value.value, kindAsAllTypes(value.kind), []),
181-
},
182-
];
183-
}
184-
if (value.kind in Value) {
185-
const name = 'value' in value ? value.value.toString() : 'name' in value ? value.name.value : '';
186-
return [
187-
{
188-
name,
189-
type: {
190-
fieldType: {
191-
name: value.kind,
192-
type: Options.name,
193-
},
194-
},
195-
args: [],
196-
directives: [],
197-
interfaces: [],
198-
data: {
199-
type: kindAsAllTypes(value.kind),
200-
},
201-
id: generateNodeId(name, kindAsAllTypes(value.kind), []),
202-
},
203-
];
204-
}
205-
return [];
206-
}
207-
208118
/**
209119
* Iterate directives
210120
* @param directives GraphQL Directive nodes
@@ -239,7 +149,6 @@ export class TypeResolver {
239149
*/
240150
static iterateArgumentFields(fields: ReadonlyArray<ArgumentNode>): ParserField[] {
241151
return fields.map((n) => {
242-
const args = TypeResolver.resolveValue(n.value);
243152
return {
244153
name: n.name.value,
245154
type: {
@@ -250,8 +159,12 @@ export class TypeResolver {
250159
},
251160
directives: [],
252161
interfaces: [],
253-
args,
254-
id: generateNodeId(n.name.value, Instances.Argument, args),
162+
value: {
163+
type: kindAsValue(n.value.kind),
164+
value: extractDefaultValueString(n.value),
165+
},
166+
args: [],
167+
id: generateNodeId(n.name.value, Instances.Argument, []),
255168
};
256169
});
257170
}
@@ -263,7 +176,12 @@ export class TypeResolver {
263176
*/
264177
static iterateInputValueFields(fields: ReadonlyArray<InputValueDefinitionNode>): ParserField[] {
265178
return fields.map((n) => {
266-
const args = n.defaultValue ? TypeResolver.resolveValue(n.defaultValue) : [];
179+
const value = n.defaultValue
180+
? {
181+
type: kindAsValue(n.defaultValue.kind),
182+
value: extractDefaultValueString(n.defaultValue),
183+
}
184+
: undefined;
267185
return {
268186
name: n.name.value,
269187
...(n.description ? { description: n.description.value } : {}),
@@ -272,9 +190,10 @@ export class TypeResolver {
272190
data: {
273191
type: ValueDefinition.InputValueDefinition,
274192
},
275-
args,
193+
args: [],
276194
interfaces: [],
277-
id: generateNodeId(n.name.value, ValueDefinition.InputValueDefinition, args),
195+
...(value ? { value } : {}),
196+
id: generateNodeId(n.name.value, ValueDefinition.InputValueDefinition, []),
278197
};
279198
});
280199
}

src/TreeToGraphQL/templates/ArgumentTemplate.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
1-
import { ParserField } from '@/Models';
1+
import { ParserField, Value } from '@/Models';
22
import { getTypeName } from '@/shared';
3-
import { TemplateUtils } from './TemplateUtils';
43

54
/**
65
* resolve function argument
76
*/
87
export class ArgumentTemplate {
9-
static resolve({ args, type }: ParserField, prefix = 0): string {
8+
static resolve({ type, value }: ParserField): string {
109
let argsString = '';
11-
if (args) {
12-
if (args.length) {
13-
argsString = `${args.map((a) => TemplateUtils.resolverForConnection(a, prefix)).join('\n')}`;
14-
} else {
15-
argsString = '[]';
16-
}
10+
if (value?.value) {
11+
argsString = `${value.type === Value.StringValue ? `"${value.value}"` : value.value}`;
1712
}
1813
return `${getTypeName(type.fieldType)}: ${argsString}`;
1914
}

src/TreeToGraphQL/templates/InputValueTemplate.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ParserField } from '@/Models';
1+
import { ParserField, Value } from '@/Models';
22
import { TemplateUtils } from './TemplateUtils';
33

44
/**
@@ -7,8 +7,8 @@ import { TemplateUtils } from './TemplateUtils';
77
export class InputValueTemplate {
88
static resolve(f: ParserField, prefix = 0): string {
99
let argsString = '';
10-
if (f.args.length > 0) {
11-
argsString = ` = ${f.args.map((a) => TemplateUtils.resolverForConnection(a, prefix + 1)).join('\n')}`;
10+
if (f.value?.value) {
11+
argsString = ` = ${f.value.type === Value.StringValue ? `"${f.value.value}"` : f.value.value}`;
1212
}
1313
return `${TemplateUtils.descriptionResolver(f.description, prefix)}${'\t'.repeat(prefix)}${
1414
f.name

src/TreeToGraphQL/templates/TemplateUtils.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {
55
TypeDefinition,
66
TypeExtension,
77
TypeSystemDefinition,
8-
Value,
98
ValueDefinition,
109
} from '@/Models';
1110
import { compileType } from '@/shared';
@@ -18,7 +17,6 @@ import { FieldTemplate } from './FieldTemplate';
1817
import { InputValueTemplate } from './InputValueTemplate';
1918
import { TypeDefinitionsTemplates } from './TypeDefinitionsTemplates';
2019
import { UnionMemberTemplate } from './UnionMemberTemplate';
21-
import { ValueTemplate } from './ValueTemplate';
2220

2321
const dedent = new RegExp('\n([\t ]*)', 'gm');
2422

@@ -95,9 +93,6 @@ export class TemplateUtils {
9593
if (type === TypeDefinition.UnionTypeDefinition) {
9694
return TypeDefinitionsTemplates.resolveUnion(f);
9795
}
98-
if (type in Value) {
99-
return ValueTemplate.resolve(f);
100-
}
10196
if (type in TypeExtension) {
10297
if (type === TypeExtension.UnionTypeExtension) {
10398
return TypeDefinitionsTemplates.resolveUnionExtension(f);

src/TreeToGraphQL/templates/ValueTemplate.ts

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

0 commit comments

Comments
 (0)