Skip to content

Commit 50386d4

Browse files
committed
🔖 Fixed translateGraphql
1 parent 14b6d80 commit 50386d4

File tree

5 files changed

+131
-13
lines changed

5 files changed

+131
-13
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.1.1",
3+
"version": "0.1.2",
44
"private": false,
55
"license": "MIT",
66
"description": "GraphQL Parser providing simplier structure",

src/TreeToGraphQL/templates/TemplateUtils.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,19 @@ const dedent = new RegExp('\n([\t ]*)', 'gm');
2929
* @class TemplateUtils
3030
*/
3131
export class TemplateUtils {
32-
static resolveFieldType = (f: ParserField['type']['fieldType'], fn: (x: string) => string = (x) => x): string => {
32+
static resolveFieldType = (
33+
f: ParserField['type']['fieldType'],
34+
fn: (x: string) => string = (x) => x,
35+
required = false,
36+
): string => {
3337
if (f.type === Options.name && f.name) {
34-
return fn(f.name);
38+
return fn(required ? `${f.name}!` : f.name);
3539
}
36-
if (f.type === Options.array && f.nest) {
37-
return TemplateUtils.resolveFieldType(f.nest, (x) => `[${fn(x)}]`);
40+
if (f.type === Options.array) {
41+
return TemplateUtils.resolveFieldType(f.nest, (x) => (required ? `[${fn(x)}]!` : `[${fn(x)}]`));
3842
}
39-
if (f.type === Options.required && f.nest) {
40-
return TemplateUtils.resolveFieldType(f.nest, (x) => `${fn(x)}!`);
43+
if (f.type === Options.required) {
44+
return TemplateUtils.resolveFieldType(f.nest, fn, true);
4145
}
4246
throw new Error('Invalid field type:' + JSON.stringify(f));
4347
};

src/__tests__/Parser/Field.spec.ts

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,4 +623,90 @@ describe('Fields tests on parser', () => {
623623
};
624624
expect(tree.nodes).toEqual(expect.arrayContaining(treeMock.nodes));
625625
});
626+
test(`ListType fields`, () => {
627+
const schema = `type Person{
628+
id: ${ScalarTypes.ID}!
629+
name: [${ScalarTypes.String}]
630+
friends: [Person]!
631+
}`;
632+
const tree = Parser.parse(schema);
633+
const treeMock: ParserTree = {
634+
nodes: [
635+
{
636+
name: 'Person',
637+
type: {
638+
fieldType: {
639+
name: TypeDefinitionDisplayStrings.type,
640+
type: Options.name,
641+
},
642+
},
643+
data: {
644+
type: TypeDefinition.ObjectTypeDefinition,
645+
},
646+
interfaces: [],
647+
directives: [],
648+
args: [
649+
{
650+
name: 'id',
651+
type: {
652+
fieldType: {
653+
type: Options.required,
654+
nest: {
655+
name: ScalarTypes.ID,
656+
type: Options.name,
657+
},
658+
},
659+
},
660+
data: {
661+
type: TypeSystemDefinition.FieldDefinition,
662+
},
663+
directives: [],
664+
args: [],
665+
interfaces: [],
666+
},
667+
{
668+
name: 'name',
669+
type: {
670+
fieldType: {
671+
type: Options.array,
672+
nest: {
673+
name: ScalarTypes.String,
674+
type: Options.name,
675+
},
676+
},
677+
},
678+
data: {
679+
type: TypeSystemDefinition.FieldDefinition,
680+
},
681+
directives: [],
682+
args: [],
683+
interfaces: [],
684+
},
685+
{
686+
name: 'friends',
687+
type: {
688+
fieldType: {
689+
type: Options.required,
690+
nest: {
691+
type: Options.array,
692+
nest: {
693+
type: Options.name,
694+
name: 'Person',
695+
},
696+
},
697+
},
698+
},
699+
data: {
700+
type: TypeSystemDefinition.FieldDefinition,
701+
},
702+
directives: [],
703+
args: [],
704+
interfaces: [],
705+
},
706+
],
707+
},
708+
],
709+
};
710+
expect(tree.nodes).toEqual(expect.arrayContaining(treeMock.nodes));
711+
});
626712
});

src/__tests__/TreeToGraphQL/Field.spec.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -553,11 +553,8 @@ describe('Fields tests on parser', () => {
553553
nest: {
554554
type: Options.array,
555555
nest: {
556-
type: Options.required,
557-
nest: {
558-
type: Options.name,
559-
name: 'Person',
560-
},
556+
type: Options.name,
557+
name: 'Person',
561558
},
562559
},
563560
},
@@ -576,7 +573,7 @@ describe('Fields tests on parser', () => {
576573

577574
const graphql = TreeToGraphQL.parse(treeMock);
578575
expect(graphql).toContain(`name: [${ScalarTypes.String}]`);
579-
expect(graphql).toContain(`friends: [Person!]!`);
576+
expect(graphql).toContain(`friends: [Person]!`);
580577
});
581578
test(`ListType nested lists`, () => {
582579
const treeMock: ParserTree = {
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { TemplateUtils } from '@/TreeToGraphQL/templates/TemplateUtils';
2+
import { Options, ParserField, TypeSystemDefinition } from '../../Models';
3+
4+
describe('TemplateUtils tests on parser', () => {
5+
test(`ListType fields`, () => {
6+
const treeMock: ParserField = {
7+
name: 'friends',
8+
type: {
9+
fieldType: {
10+
type: Options.required,
11+
nest: {
12+
type: Options.array,
13+
nest: {
14+
type: Options.name,
15+
name: 'Person',
16+
},
17+
},
18+
},
19+
},
20+
data: {
21+
type: TypeSystemDefinition.FieldDefinition,
22+
},
23+
directives: [],
24+
interfaces: [],
25+
args: [],
26+
};
27+
28+
const graphql = TemplateUtils.resolveFieldType(treeMock.type.fieldType);
29+
expect(graphql).toContain(`[Person]!`);
30+
});
31+
});

0 commit comments

Comments
 (0)