Skip to content

Commit dbebfea

Browse files
committed
feat(mergeAST): add mergeAST util
1 parent 6b253e7 commit dbebfea

File tree

2 files changed

+404
-0
lines changed

2 files changed

+404
-0
lines changed
+224
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
import {
2+
GraphQLInt,
3+
GraphQLObjectType,
4+
} from '../../type'
5+
import {
6+
buildSchema,
7+
parse,
8+
} from '../../language/parser';
9+
import { describe, it } from 'mocha';
10+
11+
import { GraphQLSchema } from '../../type/schema';
12+
import { expect } from 'chai';
13+
import fs from 'node:fs';
14+
import { mergeAST } from '../mergeAST';
15+
import path from 'node:path';
16+
import {
17+
print,
18+
} from '../../language/printer'
19+
20+
const schema = new GraphQLSchema({
21+
query: new GraphQLObjectType({
22+
name: 'Test',
23+
fields: {
24+
id: {
25+
type: GraphQLInt,
26+
},
27+
},
28+
}),
29+
});
30+
31+
describe.only('MergeAst', () => {
32+
it('does not modify query with no fragments', () => {
33+
const query = /* GraphQL */ `
34+
query Test {
35+
id
36+
}
37+
`;
38+
const mergedQuery = stripWhitespace(/* GraphQL */ `
39+
query Test {
40+
id
41+
}
42+
`);
43+
expect(parseMergeAndPrint(query)).to.equal(mergedQuery);
44+
expect(parseMergeAndPrint(query, schema)).to.equal(mergedQuery);
45+
});
46+
47+
it('does inline simple nested fragment', () => {
48+
const query = /* GraphQL */ `
49+
query Test {
50+
...Fragment1
51+
}
52+
53+
fragment Fragment1 on Test {
54+
id
55+
}
56+
`;
57+
const mergedQuery = stripWhitespace(/* GraphQL */ `
58+
query Test {
59+
... on Test {
60+
id
61+
}
62+
}
63+
`);
64+
const mergedQueryWithSchema = stripWhitespace(/* GraphQL */ `
65+
query Test {
66+
id
67+
}
68+
`);
69+
expect(parseMergeAndPrint(query)).to.equal(mergedQuery);
70+
expect(parseMergeAndPrint(query, schema)).to.equal(mergedQueryWithSchema);
71+
});
72+
73+
it('does inline triple nested fragment', () => {
74+
const query = /* GraphQL */ `
75+
query Test {
76+
...Fragment1
77+
}
78+
79+
fragment Fragment1 on Test {
80+
...Fragment2
81+
}
82+
83+
fragment Fragment2 on Test {
84+
...Fragment3
85+
}
86+
87+
fragment Fragment3 on Test {
88+
id
89+
}
90+
`;
91+
const mergedQuery = stripWhitespace(/* GraphQL */ `
92+
query Test {
93+
... on Test {
94+
... on Test {
95+
... on Test {
96+
id
97+
}
98+
}
99+
}
100+
}
101+
`);
102+
const mergedQueryWithSchema = stripWhitespace(/* GraphQL */ `
103+
query Test {
104+
id
105+
}
106+
`);
107+
expect(parseMergeAndPrint(query)).to.equal(mergedQuery);
108+
expect(parseMergeAndPrint(query, schema)).to.equal(mergedQueryWithSchema);
109+
});
110+
111+
it('does inline multiple fragments', () => {
112+
const query = /* GraphQL */ `
113+
query Test {
114+
...Fragment1
115+
...Fragment2
116+
...Fragment3
117+
}
118+
119+
fragment Fragment1 on Test {
120+
id
121+
}
122+
123+
fragment Fragment2 on Test {
124+
id
125+
}
126+
127+
fragment Fragment3 on Test {
128+
id
129+
}
130+
`;
131+
const mergedQuery = stripWhitespace(/* GraphQL */ `
132+
query Test {
133+
... on Test {
134+
id
135+
}
136+
... on Test {
137+
id
138+
}
139+
... on Test {
140+
id
141+
}
142+
}
143+
`);
144+
const mergedQueryWithSchema = stripWhitespace(/* GraphQL */ `
145+
query Test {
146+
id
147+
}
148+
`);
149+
expect(parseMergeAndPrint(query)).to.equal(mergedQuery);
150+
expect(parseMergeAndPrint(query, schema)).to.equal(mergedQueryWithSchema);
151+
});
152+
153+
it('removes duplicate fragment spreads', () => {
154+
const query = /* GraphQL */ `
155+
query Test {
156+
...Fragment1
157+
...Fragment1
158+
}
159+
160+
fragment Fragment1 on Test {
161+
id
162+
}
163+
`;
164+
const mergedQuery = stripWhitespace(/* GraphQL */ `
165+
query Test {
166+
... on Test {
167+
id
168+
}
169+
}
170+
`);
171+
const mergedQueryWithSchema = stripWhitespace(/* GraphQL */ `
172+
query Test {
173+
id
174+
}
175+
`);
176+
expect(parseMergeAndPrint(query)).to.equal(mergedQuery);
177+
expect(parseMergeAndPrint(query, schema)).to.equal(mergedQueryWithSchema);
178+
});
179+
180+
it('handles very complex query without crashing', async () => {
181+
// // graphQLVersion = pkg.version;
182+
// const schemaIDL = fs.readFileSync(
183+
// path.join(__dirname, '__schema__/sorareSchema.graphql'),
184+
// 'utf8',
185+
// );
186+
//
187+
// const sorareSchema = buildSchema(schemaIDL);
188+
//
189+
// // graphQLVersion = pkg.version;
190+
// const query = fs.readFileSync(
191+
// path.join(__dirname, '__queries__/testQuery.graphql'),
192+
// 'utf8',
193+
// );
194+
// // graphQLVersion = pkg.version;
195+
// const mergedQuery = stripWhitespace(
196+
// fs.readFileSync(
197+
// path.join(__dirname, '__queries__/mergedQuery.graphql'),
198+
// 'utf8',
199+
// ),
200+
// );
201+
// // graphQLVersion = pkg.version;
202+
// const mergedQueryWithSchema = stripWhitespace(
203+
// fs.readFileSync(
204+
// path.join(__dirname, '__queries__/mergedQueryWithSchema.graphql'),
205+
// 'utf8',
206+
// ),
207+
// );
208+
//
209+
// expect(removeParametersCommas(parseMergeAndPrint(query))).to.equal(mergedQuery);
210+
// expect(parseMergeAndPrint(query, sorareSchema)).to.equal(mergedQueryWithSchema);
211+
});
212+
});
213+
214+
function parseMergeAndPrint(query: string, maybeSchema?: GraphQLSchema) {
215+
return stripWhitespace(print(mergeAST(parse(query), maybeSchema)));
216+
}
217+
218+
function stripWhitespace(str: string) {
219+
return str.replace(/\s/g, '');
220+
}
221+
222+
// function removeParametersCommas(str: string) {
223+
// return str.replaceAll(',', '');
224+
// }

0 commit comments

Comments
 (0)