vscode-apollo 1.19.2 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.changeset/README.md +8 -0
- package/.changeset/config.json +14 -0
- package/.circleci/config.yml +82 -0
- package/.eslintrc.js +10 -0
- package/.gitattributes +1 -0
- package/.github/workflows/release.yml +95 -0
- package/.gitleaks.toml +26 -0
- package/.nvmrc +1 -0
- package/.prettierrc +5 -0
- package/.vscode/launch.json +61 -0
- package/.vscode/settings.json +16 -0
- package/.vscode/tasks.json +18 -0
- package/.vscodeignore +17 -1
- package/CHANGELOG.md +172 -1
- package/LICENSE +2 -2
- package/README.md +9 -9
- package/codegen.yml +12 -0
- package/images/IconRun.svg +8 -0
- package/jest.config.ts +11 -0
- package/package.json +102 -22
- package/renovate.json +23 -0
- package/src/__mocks__/fs.js +3 -0
- package/src/__tests__/statusBar.test.ts +8 -7
- package/src/debug.ts +2 -5
- package/src/env/fetch/fetch.ts +32 -0
- package/src/env/fetch/global.ts +30 -0
- package/src/env/fetch/index.d.ts +2 -0
- package/src/env/fetch/index.ts +2 -0
- package/src/env/fetch/url.ts +9 -0
- package/src/env/index.ts +4 -0
- package/src/env/polyfills/array.ts +17 -0
- package/src/env/polyfills/index.ts +2 -0
- package/src/env/polyfills/object.ts +7 -0
- package/src/env/typescript-utility-types.ts +2 -0
- package/src/extension.ts +106 -37
- package/src/language-server/__tests__/diagnostics.test.ts +86 -0
- package/src/language-server/__tests__/document.test.ts +187 -0
- package/src/language-server/__tests__/fileSet.test.ts +46 -0
- package/src/language-server/__tests__/fixtures/starwarsSchema.ts +1917 -0
- package/src/language-server/config/__tests__/config.ts +128 -0
- package/src/language-server/config/__tests__/loadConfig.ts +508 -0
- package/src/language-server/config/__tests__/utils.ts +106 -0
- package/src/language-server/config/config.ts +219 -0
- package/src/language-server/config/index.ts +3 -0
- package/src/language-server/config/loadConfig.ts +228 -0
- package/src/language-server/config/utils.ts +56 -0
- package/src/language-server/diagnostics.ts +109 -0
- package/src/language-server/document.ts +277 -0
- package/src/language-server/engine/GraphQLDataSource.ts +124 -0
- package/src/language-server/engine/index.ts +105 -0
- package/src/language-server/engine/operations/frontendUrlRoot.ts +7 -0
- package/src/language-server/engine/operations/schemaTagsAndFieldStats.ts +24 -0
- package/src/language-server/errors/__tests__/NoMissingClientDirectives.test.ts +220 -0
- package/src/language-server/errors/logger.ts +58 -0
- package/src/language-server/errors/validation.ts +277 -0
- package/src/language-server/fileSet.ts +65 -0
- package/src/language-server/format.ts +48 -0
- package/src/language-server/graphqlTypes.ts +7176 -0
- package/src/language-server/index.ts +29 -0
- package/src/language-server/languageProvider.ts +798 -0
- package/src/language-server/loadingHandler.ts +64 -0
- package/src/language-server/project/base.ts +399 -0
- package/src/language-server/project/client.ts +602 -0
- package/src/language-server/project/defaultClientSchema.ts +45 -0
- package/src/language-server/project/service.ts +48 -0
- package/src/language-server/providers/schema/__tests__/file.ts +150 -0
- package/src/language-server/providers/schema/base.ts +15 -0
- package/src/language-server/providers/schema/endpoint.ts +157 -0
- package/src/language-server/providers/schema/engine.ts +197 -0
- package/src/language-server/providers/schema/file.ts +167 -0
- package/src/language-server/providers/schema/index.ts +75 -0
- package/src/language-server/server.ts +252 -0
- package/src/language-server/typings/codemirror.d.ts +4 -0
- package/src/language-server/typings/graphql.d.ts +27 -0
- package/src/language-server/utilities/__tests__/graphql.test.ts +411 -0
- package/src/language-server/utilities/__tests__/uri.ts +55 -0
- package/src/language-server/utilities/debouncer.ts +8 -0
- package/src/language-server/utilities/debug.ts +89 -0
- package/src/language-server/utilities/graphql.ts +432 -0
- package/src/language-server/utilities/index.ts +3 -0
- package/src/language-server/utilities/source.ts +182 -0
- package/src/language-server/utilities/uri.ts +19 -0
- package/src/language-server/workspace.ts +262 -0
- package/src/languageServerClient.ts +19 -12
- package/src/messages.ts +84 -0
- package/src/statusBar.ts +5 -5
- package/src/tools/__tests__/buildServiceDefinition.test.ts +491 -0
- package/src/tools/__tests__/snapshotSerializers/astSerializer.ts +19 -0
- package/src/tools/__tests__/snapshotSerializers/graphQLTypeSerializer.ts +14 -0
- package/src/tools/buildServiceDefinition.ts +241 -0
- package/src/tools/index.ts +6 -0
- package/src/tools/schema/index.ts +2 -0
- package/src/tools/schema/resolveObject.ts +18 -0
- package/src/tools/schema/resolverMap.ts +23 -0
- package/src/tools/utilities/graphql.ts +22 -0
- package/src/tools/utilities/index.ts +3 -0
- package/src/tools/utilities/invariant.ts +5 -0
- package/src/tools/utilities/predicates.ts +5 -0
- package/src/utils.ts +1 -16
- package/syntaxes/graphql.js.json +3 -3
- package/syntaxes/graphql.json +13 -9
- package/syntaxes/graphql.lua.json +51 -0
- package/syntaxes/graphql.rb.json +1 -1
- package/tsconfig.build.json +4 -0
- package/tsconfig.json +20 -7
- package/create-server-symlink.js +0 -8
- package/lib/debug.d.ts +0 -11
- package/lib/debug.d.ts.map +0 -1
- package/lib/debug.js +0 -48
- package/lib/debug.js.map +0 -1
- package/lib/extension.d.ts +0 -4
- package/lib/extension.d.ts.map +0 -1
- package/lib/extension.js +0 -187
- package/lib/extension.js.map +0 -1
- package/lib/languageServerClient.d.ts +0 -4
- package/lib/languageServerClient.d.ts.map +0 -1
- package/lib/languageServerClient.js +0 -57
- package/lib/languageServerClient.js.map +0 -1
- package/lib/statusBar.d.ts +0 -24
- package/lib/statusBar.d.ts.map +0 -1
- package/lib/statusBar.js +0 -46
- package/lib/statusBar.js.map +0 -1
- package/lib/testRunner/index.d.ts +0 -3
- package/lib/testRunner/index.d.ts.map +0 -1
- package/lib/testRunner/index.js +0 -49
- package/lib/testRunner/index.js.map +0 -1
- package/lib/testRunner/jest-config.d.ts +0 -14
- package/lib/testRunner/jest-config.d.ts.map +0 -1
- package/lib/testRunner/jest-config.js +0 -18
- package/lib/testRunner/jest-config.js.map +0 -1
- package/lib/testRunner/jest-vscode-environment.d.ts +0 -2
- package/lib/testRunner/jest-vscode-environment.d.ts.map +0 -1
- package/lib/testRunner/jest-vscode-environment.js +0 -19
- package/lib/testRunner/jest-vscode-environment.js.map +0 -1
- package/lib/testRunner/jest-vscode-framework-setup.d.ts +0 -1
- package/lib/testRunner/jest-vscode-framework-setup.d.ts.map +0 -1
- package/lib/testRunner/jest-vscode-framework-setup.js +0 -3
- package/lib/testRunner/jest-vscode-framework-setup.js.map +0 -1
- package/lib/testRunner/vscode-test-script.d.ts +0 -2
- package/lib/testRunner/vscode-test-script.d.ts.map +0 -1
- package/lib/testRunner/vscode-test-script.js +0 -23
- package/lib/testRunner/vscode-test-script.js.map +0 -1
- package/lib/utils.d.ts +0 -18
- package/lib/utils.d.ts.map +0 -1
- package/lib/utils.js +0 -52
- package/lib/utils.js.map +0 -1
- package/src/testRunner/README.md +0 -23
- package/src/testRunner/index.ts +0 -72
- package/src/testRunner/jest-config.ts +0 -17
- package/src/testRunner/jest-vscode-environment.ts +0 -25
- package/src/testRunner/jest-vscode-framework-setup.ts +0 -10
- package/src/testRunner/jest.d.ts +0 -37
- package/src/testRunner/vscode-test-script.ts +0 -38
- package/tsconfig.test.json +0 -4
- package/tsconfig.tsbuildinfo +0 -2486
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
import gql from "graphql-tag";
|
|
2
|
+
import { buildServiceDefinition } from "../buildServiceDefinition";
|
|
3
|
+
import { GraphQLNamedType, GraphQLObjectType, printType } from "graphql";
|
|
4
|
+
|
|
5
|
+
describe("buildServiceDefinition", () => {
|
|
6
|
+
describe(`type definitions`, () => {
|
|
7
|
+
it(`should include types from different modules`, () => {
|
|
8
|
+
const service = buildServiceDefinition([
|
|
9
|
+
{
|
|
10
|
+
typeDefs: gql`
|
|
11
|
+
type User {
|
|
12
|
+
name: String
|
|
13
|
+
}
|
|
14
|
+
`,
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
typeDefs: gql`
|
|
18
|
+
type Post {
|
|
19
|
+
title: String
|
|
20
|
+
}
|
|
21
|
+
`,
|
|
22
|
+
},
|
|
23
|
+
]);
|
|
24
|
+
|
|
25
|
+
expect(service.errors).toBeUndefined();
|
|
26
|
+
|
|
27
|
+
expect(service.schema).toBeDefined();
|
|
28
|
+
const schema = service.schema!;
|
|
29
|
+
|
|
30
|
+
expect(printType(schema.getType("User")!)).toMatchInlineSnapshot(`
|
|
31
|
+
"type User {
|
|
32
|
+
name: String
|
|
33
|
+
}"
|
|
34
|
+
`);
|
|
35
|
+
|
|
36
|
+
expect(printType(schema.getType("Post")!)).toMatchInlineSnapshot(`
|
|
37
|
+
"type Post {
|
|
38
|
+
title: String
|
|
39
|
+
}"
|
|
40
|
+
`);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it(`should not allow two types with the same name in the same module`, () => {
|
|
44
|
+
const service = buildServiceDefinition([
|
|
45
|
+
{
|
|
46
|
+
typeDefs: gql`
|
|
47
|
+
type User {
|
|
48
|
+
name: String
|
|
49
|
+
}
|
|
50
|
+
`,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
typeDefs: gql`
|
|
54
|
+
type User {
|
|
55
|
+
title: String
|
|
56
|
+
}
|
|
57
|
+
`,
|
|
58
|
+
},
|
|
59
|
+
]);
|
|
60
|
+
|
|
61
|
+
expect(service.errors).toMatchInlineSnapshot(`
|
|
62
|
+
Array [
|
|
63
|
+
[GraphQLError: Type "User" was defined more than once.],
|
|
64
|
+
]
|
|
65
|
+
`);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it(`should not allow two types with the same name in different modules`, () => {
|
|
69
|
+
const service = buildServiceDefinition([
|
|
70
|
+
{
|
|
71
|
+
typeDefs: gql`
|
|
72
|
+
type User {
|
|
73
|
+
name: String
|
|
74
|
+
}
|
|
75
|
+
`,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
typeDefs: gql`
|
|
79
|
+
type User {
|
|
80
|
+
title: String
|
|
81
|
+
}
|
|
82
|
+
`,
|
|
83
|
+
},
|
|
84
|
+
]);
|
|
85
|
+
|
|
86
|
+
expect(service.errors).toMatchInlineSnapshot(`
|
|
87
|
+
Array [
|
|
88
|
+
[GraphQLError: Type "User" was defined more than once.],
|
|
89
|
+
]
|
|
90
|
+
`);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it(`should report multiple type duplication errors`, () => {
|
|
94
|
+
const service = buildServiceDefinition([
|
|
95
|
+
{
|
|
96
|
+
typeDefs: gql`
|
|
97
|
+
type User {
|
|
98
|
+
name: String
|
|
99
|
+
}
|
|
100
|
+
`,
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
typeDefs: gql`
|
|
104
|
+
type User {
|
|
105
|
+
title: String
|
|
106
|
+
}
|
|
107
|
+
`,
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
typeDefs: gql`
|
|
111
|
+
type Post {
|
|
112
|
+
title: String
|
|
113
|
+
}
|
|
114
|
+
`,
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
typeDefs: gql`
|
|
118
|
+
type Post {
|
|
119
|
+
name: String
|
|
120
|
+
}
|
|
121
|
+
`,
|
|
122
|
+
},
|
|
123
|
+
]);
|
|
124
|
+
|
|
125
|
+
expect(service.errors).toMatchInlineSnapshot(`
|
|
126
|
+
Array [
|
|
127
|
+
[GraphQLError: Type "User" was defined more than once.],
|
|
128
|
+
[GraphQLError: Type "Post" was defined more than once.],
|
|
129
|
+
]
|
|
130
|
+
`);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
describe(`directive definitions`, () => {
|
|
135
|
+
it(`should include directive`, () => {
|
|
136
|
+
const service = buildServiceDefinition([
|
|
137
|
+
{
|
|
138
|
+
typeDefs: gql`
|
|
139
|
+
directive @something on FIELD_DEFINITION
|
|
140
|
+
`,
|
|
141
|
+
},
|
|
142
|
+
]);
|
|
143
|
+
|
|
144
|
+
expect(service.errors).toBeUndefined();
|
|
145
|
+
|
|
146
|
+
expect(service.schema).toBeDefined();
|
|
147
|
+
const schema = service.schema!;
|
|
148
|
+
const directive = schema.getDirective("something");
|
|
149
|
+
expect(directive).toBeDefined();
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it(`should include directives from different modules`, () => {
|
|
153
|
+
const service = buildServiceDefinition([
|
|
154
|
+
{
|
|
155
|
+
typeDefs: gql`
|
|
156
|
+
directive @something on FIELD_DEFINITION
|
|
157
|
+
`,
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
typeDefs: gql`
|
|
161
|
+
directive @another on FIELD_DEFINITION
|
|
162
|
+
`,
|
|
163
|
+
},
|
|
164
|
+
]);
|
|
165
|
+
|
|
166
|
+
expect(service.errors).toBeUndefined();
|
|
167
|
+
|
|
168
|
+
expect(service.schema).toBeDefined();
|
|
169
|
+
const schema = service.schema!;
|
|
170
|
+
|
|
171
|
+
expect(schema.getDirective("something")).toMatchInlineSnapshot(
|
|
172
|
+
`"@something"`
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
expect(schema.getDirective("another")).toMatchInlineSnapshot(
|
|
176
|
+
`"@another"`
|
|
177
|
+
);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it(`should not allow two types with the same name in the same module`, () => {
|
|
181
|
+
const service = buildServiceDefinition([
|
|
182
|
+
{
|
|
183
|
+
typeDefs: gql`
|
|
184
|
+
directive @something on FIELD_DEFINITION
|
|
185
|
+
`,
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
typeDefs: gql`
|
|
189
|
+
directive @something on FIELD_DEFINITION
|
|
190
|
+
`,
|
|
191
|
+
},
|
|
192
|
+
]);
|
|
193
|
+
|
|
194
|
+
expect(service.errors).toMatchInlineSnapshot(`
|
|
195
|
+
Array [
|
|
196
|
+
[GraphQLError: Directive "something" was defined more than once.],
|
|
197
|
+
]
|
|
198
|
+
`);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it(`should not allow two types with the same name in different modules`, () => {
|
|
202
|
+
const service = buildServiceDefinition([
|
|
203
|
+
{
|
|
204
|
+
typeDefs: gql`
|
|
205
|
+
directive @something on FIELD_DEFINITION
|
|
206
|
+
`,
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
typeDefs: gql`
|
|
210
|
+
directive @something on FIELD_DEFINITION
|
|
211
|
+
`,
|
|
212
|
+
},
|
|
213
|
+
]);
|
|
214
|
+
|
|
215
|
+
expect(service.errors).toMatchInlineSnapshot(`
|
|
216
|
+
Array [
|
|
217
|
+
[GraphQLError: Directive "something" was defined more than once.],
|
|
218
|
+
]
|
|
219
|
+
`);
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
it(`should report multiple type duplication errors`, () => {
|
|
223
|
+
const service = buildServiceDefinition([
|
|
224
|
+
{
|
|
225
|
+
typeDefs: gql`
|
|
226
|
+
directive @something on FIELD_DEFINITION
|
|
227
|
+
`,
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
typeDefs: gql`
|
|
231
|
+
directive @something on FIELD_DEFINITION
|
|
232
|
+
`,
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
typeDefs: gql`
|
|
236
|
+
directive @another on FIELD_DEFINITION
|
|
237
|
+
`,
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
typeDefs: gql`
|
|
241
|
+
directive @another on FIELD_DEFINITION
|
|
242
|
+
`,
|
|
243
|
+
},
|
|
244
|
+
]);
|
|
245
|
+
|
|
246
|
+
expect(service.errors).toMatchInlineSnapshot(`
|
|
247
|
+
Array [
|
|
248
|
+
[GraphQLError: Directive "something" was defined more than once.],
|
|
249
|
+
[GraphQLError: Directive "another" was defined more than once.],
|
|
250
|
+
]
|
|
251
|
+
`);
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
describe(`type extension`, () => {
|
|
256
|
+
it(`should allow extending a type from the same module`, () => {
|
|
257
|
+
const service = buildServiceDefinition([
|
|
258
|
+
{
|
|
259
|
+
typeDefs: gql`
|
|
260
|
+
type User {
|
|
261
|
+
name: String
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
extend type User {
|
|
265
|
+
email: String
|
|
266
|
+
}
|
|
267
|
+
`,
|
|
268
|
+
},
|
|
269
|
+
]);
|
|
270
|
+
|
|
271
|
+
expect(service.errors).toBeUndefined();
|
|
272
|
+
|
|
273
|
+
expect(service.schema).toBeDefined();
|
|
274
|
+
const schema = service.schema!;
|
|
275
|
+
|
|
276
|
+
expect(printType(schema.getType("User")!)).toMatchInlineSnapshot(`
|
|
277
|
+
"type User {
|
|
278
|
+
name: String
|
|
279
|
+
email: String
|
|
280
|
+
}"
|
|
281
|
+
`);
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
it(`should allow extending a type from a different module`, () => {
|
|
285
|
+
const service = buildServiceDefinition([
|
|
286
|
+
{
|
|
287
|
+
typeDefs: gql`
|
|
288
|
+
type User {
|
|
289
|
+
name: String
|
|
290
|
+
}
|
|
291
|
+
`,
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
typeDefs: gql`
|
|
295
|
+
extend type User {
|
|
296
|
+
email: String
|
|
297
|
+
}
|
|
298
|
+
`,
|
|
299
|
+
},
|
|
300
|
+
]);
|
|
301
|
+
|
|
302
|
+
expect(service.errors).toBeUndefined();
|
|
303
|
+
|
|
304
|
+
expect(service.schema).toBeDefined();
|
|
305
|
+
const schema = service.schema!;
|
|
306
|
+
|
|
307
|
+
expect(printType(schema.getType("User")!)).toMatchInlineSnapshot(`
|
|
308
|
+
"type User {
|
|
309
|
+
name: String
|
|
310
|
+
email: String
|
|
311
|
+
}"
|
|
312
|
+
`);
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
it(`should report an error when extending a non-existent type`, () => {
|
|
316
|
+
const service = buildServiceDefinition([
|
|
317
|
+
{
|
|
318
|
+
typeDefs: gql`
|
|
319
|
+
extend type User {
|
|
320
|
+
email: String
|
|
321
|
+
}
|
|
322
|
+
`,
|
|
323
|
+
},
|
|
324
|
+
]);
|
|
325
|
+
|
|
326
|
+
expect(service.errors).toMatchInlineSnapshot(`
|
|
327
|
+
Array [
|
|
328
|
+
[GraphQLError: Cannot extend type "User" because it does not exist in the existing schema.],
|
|
329
|
+
]
|
|
330
|
+
`);
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
describe(`extending root operation types that aren't defined elsewhere`, () => {
|
|
335
|
+
it(`should be allowed`, () => {
|
|
336
|
+
const service = buildServiceDefinition([
|
|
337
|
+
{
|
|
338
|
+
typeDefs: gql`
|
|
339
|
+
extend type Query {
|
|
340
|
+
rootField: String
|
|
341
|
+
}
|
|
342
|
+
`,
|
|
343
|
+
},
|
|
344
|
+
]);
|
|
345
|
+
|
|
346
|
+
expect(service.errors).toBeUndefined();
|
|
347
|
+
|
|
348
|
+
expect(service.schema).toBeDefined();
|
|
349
|
+
const schema = service.schema!;
|
|
350
|
+
|
|
351
|
+
expect(printType(schema.getType("Query")!)).toMatchInlineSnapshot(`
|
|
352
|
+
"type Query {
|
|
353
|
+
rootField: String
|
|
354
|
+
}"
|
|
355
|
+
`);
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
it(`should be allowed with non default type names`, () => {
|
|
359
|
+
const service = buildServiceDefinition([
|
|
360
|
+
{
|
|
361
|
+
typeDefs: gql`
|
|
362
|
+
schema {
|
|
363
|
+
query: QueryRoot
|
|
364
|
+
}
|
|
365
|
+
extend type QueryRoot {
|
|
366
|
+
rootField: String
|
|
367
|
+
}
|
|
368
|
+
`,
|
|
369
|
+
},
|
|
370
|
+
]);
|
|
371
|
+
|
|
372
|
+
expect(service.errors).toBeUndefined();
|
|
373
|
+
|
|
374
|
+
expect(service.schema).toBeDefined();
|
|
375
|
+
const schema = service.schema!;
|
|
376
|
+
|
|
377
|
+
expect(printType(schema.getType("QueryRoot")!)).toMatchInlineSnapshot(`
|
|
378
|
+
"type QueryRoot {
|
|
379
|
+
rootField: String
|
|
380
|
+
}"
|
|
381
|
+
`);
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
it(`should be allowed with non default nanmes specified in schema extensions`, () => {
|
|
385
|
+
const service = buildServiceDefinition([
|
|
386
|
+
{
|
|
387
|
+
typeDefs: gql`
|
|
388
|
+
schema {
|
|
389
|
+
query: QueryRoot
|
|
390
|
+
}
|
|
391
|
+
type QueryRoot {
|
|
392
|
+
rootField: String
|
|
393
|
+
}
|
|
394
|
+
`,
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
typeDefs: gql`
|
|
398
|
+
extend schema {
|
|
399
|
+
mutation: MutationRoot
|
|
400
|
+
}
|
|
401
|
+
extend type MutationRoot {
|
|
402
|
+
rootField: String
|
|
403
|
+
}
|
|
404
|
+
`,
|
|
405
|
+
},
|
|
406
|
+
]);
|
|
407
|
+
|
|
408
|
+
expect(service.errors).toBeUndefined();
|
|
409
|
+
|
|
410
|
+
expect(service.schema).toBeDefined();
|
|
411
|
+
const schema = service.schema!;
|
|
412
|
+
|
|
413
|
+
expect(printType(schema.getType("MutationRoot")!)).toMatchInlineSnapshot(`
|
|
414
|
+
"type MutationRoot {
|
|
415
|
+
rootField: String
|
|
416
|
+
}"
|
|
417
|
+
`);
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
describe(`resolvers`, () => {
|
|
422
|
+
it(`should add a resolver for a field`, () => {
|
|
423
|
+
const name = () => {};
|
|
424
|
+
|
|
425
|
+
const service = buildServiceDefinition([
|
|
426
|
+
{
|
|
427
|
+
typeDefs: gql`
|
|
428
|
+
type User {
|
|
429
|
+
name: String
|
|
430
|
+
}
|
|
431
|
+
`,
|
|
432
|
+
resolvers: {
|
|
433
|
+
User: {
|
|
434
|
+
name,
|
|
435
|
+
},
|
|
436
|
+
},
|
|
437
|
+
},
|
|
438
|
+
]);
|
|
439
|
+
|
|
440
|
+
expect(service.schema).toBeDefined();
|
|
441
|
+
const schema = service.schema!;
|
|
442
|
+
|
|
443
|
+
const userType = schema.getType("User");
|
|
444
|
+
expect(userType).toBeDefined();
|
|
445
|
+
|
|
446
|
+
const nameField = (userType! as GraphQLObjectType).getFields()["name"];
|
|
447
|
+
expect(nameField).toBeDefined();
|
|
448
|
+
|
|
449
|
+
expect(nameField.resolve).toEqual(name);
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
it(`should handle subscriptions`, () => {
|
|
453
|
+
const commentAddedSubscription = () =>
|
|
454
|
+
async function* () {
|
|
455
|
+
yield "111";
|
|
456
|
+
yield "222";
|
|
457
|
+
yield "333";
|
|
458
|
+
};
|
|
459
|
+
|
|
460
|
+
const service = buildServiceDefinition([
|
|
461
|
+
{
|
|
462
|
+
typeDefs: gql`
|
|
463
|
+
type Subscription {
|
|
464
|
+
commentAdded: String
|
|
465
|
+
}
|
|
466
|
+
`,
|
|
467
|
+
resolvers: {
|
|
468
|
+
Subscription: {
|
|
469
|
+
commentAdded: {
|
|
470
|
+
subscribe: commentAddedSubscription,
|
|
471
|
+
},
|
|
472
|
+
},
|
|
473
|
+
},
|
|
474
|
+
},
|
|
475
|
+
]);
|
|
476
|
+
|
|
477
|
+
expect(service.schema).toBeDefined();
|
|
478
|
+
const schema = service.schema!;
|
|
479
|
+
|
|
480
|
+
const subscriptionType = schema.getType("Subscription");
|
|
481
|
+
expect(subscriptionType).toBeDefined();
|
|
482
|
+
|
|
483
|
+
const commentAdded = (subscriptionType! as GraphQLObjectType).getFields()[
|
|
484
|
+
"commentAdded"
|
|
485
|
+
];
|
|
486
|
+
expect(commentAdded).toBeDefined();
|
|
487
|
+
|
|
488
|
+
expect(commentAdded.subscribe).toEqual(commentAddedSubscription);
|
|
489
|
+
});
|
|
490
|
+
});
|
|
491
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ASTNode, print } from "graphql";
|
|
2
|
+
import { Plugin } from "pretty-format";
|
|
3
|
+
|
|
4
|
+
const plugin: Plugin = {
|
|
5
|
+
test(value) {
|
|
6
|
+
return value && typeof value.kind === "string";
|
|
7
|
+
},
|
|
8
|
+
|
|
9
|
+
serialize(value: ASTNode, _config, indentation): string {
|
|
10
|
+
return (
|
|
11
|
+
indentation +
|
|
12
|
+
print(value)
|
|
13
|
+
.trim()
|
|
14
|
+
.replace(/\n/g, "\n" + indentation)
|
|
15
|
+
);
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export default plugin;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { isNamedType, GraphQLNamedType, printType } from "graphql";
|
|
2
|
+
import { Plugin } from "pretty-format";
|
|
3
|
+
|
|
4
|
+
const plugin: Plugin = {
|
|
5
|
+
test(value) {
|
|
6
|
+
return value && isNamedType(value);
|
|
7
|
+
},
|
|
8
|
+
|
|
9
|
+
serialize(value: GraphQLNamedType): string {
|
|
10
|
+
return printType(value);
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default plugin;
|