vscode-apollo 1.19.3 → 1.20.1

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.
Files changed (156) hide show
  1. package/.changeset/README.md +8 -0
  2. package/.changeset/config.json +14 -0
  3. package/.circleci/config.yml +82 -0
  4. package/.eslintrc.js +10 -0
  5. package/.gitattributes +1 -0
  6. package/.github/workflows/build-prs.yml +57 -0
  7. package/.github/workflows/release.yml +114 -0
  8. package/.gitleaks.toml +26 -0
  9. package/.nvmrc +1 -0
  10. package/.prettierrc +5 -0
  11. package/.vscode/launch.json +61 -0
  12. package/.vscode/settings.json +16 -0
  13. package/.vscode/tasks.json +18 -0
  14. package/.vscodeignore +17 -1
  15. package/CHANGELOG.md +178 -1
  16. package/LICENSE +2 -2
  17. package/README.md +9 -9
  18. package/codegen.yml +12 -0
  19. package/images/IconRun.svg +8 -0
  20. package/jest.config.ts +11 -0
  21. package/package.json +102 -22
  22. package/renovate.json +23 -0
  23. package/src/__mocks__/fs.js +3 -0
  24. package/src/__tests__/statusBar.test.ts +8 -7
  25. package/src/debug.ts +2 -5
  26. package/src/env/fetch/fetch.ts +32 -0
  27. package/src/env/fetch/global.ts +30 -0
  28. package/src/env/fetch/index.d.ts +2 -0
  29. package/src/env/fetch/index.ts +2 -0
  30. package/src/env/fetch/url.ts +9 -0
  31. package/src/env/index.ts +4 -0
  32. package/src/env/polyfills/array.ts +17 -0
  33. package/src/env/polyfills/index.ts +2 -0
  34. package/src/env/polyfills/object.ts +7 -0
  35. package/src/env/typescript-utility-types.ts +2 -0
  36. package/src/extension.ts +106 -37
  37. package/src/language-server/__tests__/diagnostics.test.ts +86 -0
  38. package/src/language-server/__tests__/document.test.ts +187 -0
  39. package/src/language-server/__tests__/fileSet.test.ts +46 -0
  40. package/src/language-server/__tests__/fixtures/starwarsSchema.ts +1917 -0
  41. package/src/language-server/config/__tests__/config.ts +128 -0
  42. package/src/language-server/config/__tests__/loadConfig.ts +508 -0
  43. package/src/language-server/config/__tests__/utils.ts +106 -0
  44. package/src/language-server/config/config.ts +219 -0
  45. package/src/language-server/config/index.ts +3 -0
  46. package/src/language-server/config/loadConfig.ts +228 -0
  47. package/src/language-server/config/utils.ts +56 -0
  48. package/src/language-server/diagnostics.ts +109 -0
  49. package/src/language-server/document.ts +277 -0
  50. package/src/language-server/engine/GraphQLDataSource.ts +124 -0
  51. package/src/language-server/engine/index.ts +105 -0
  52. package/src/language-server/engine/operations/frontendUrlRoot.ts +7 -0
  53. package/src/language-server/engine/operations/schemaTagsAndFieldStats.ts +24 -0
  54. package/src/language-server/errors/__tests__/NoMissingClientDirectives.test.ts +220 -0
  55. package/src/language-server/errors/logger.ts +58 -0
  56. package/src/language-server/errors/validation.ts +277 -0
  57. package/src/language-server/fileSet.ts +65 -0
  58. package/src/language-server/format.ts +48 -0
  59. package/src/language-server/graphqlTypes.ts +7176 -0
  60. package/src/language-server/index.ts +29 -0
  61. package/src/language-server/languageProvider.ts +798 -0
  62. package/src/language-server/loadingHandler.ts +64 -0
  63. package/src/language-server/project/base.ts +399 -0
  64. package/src/language-server/project/client.ts +602 -0
  65. package/src/language-server/project/defaultClientSchema.ts +45 -0
  66. package/src/language-server/project/service.ts +48 -0
  67. package/src/language-server/providers/schema/__tests__/file.ts +150 -0
  68. package/src/language-server/providers/schema/base.ts +15 -0
  69. package/src/language-server/providers/schema/endpoint.ts +157 -0
  70. package/src/language-server/providers/schema/engine.ts +197 -0
  71. package/src/language-server/providers/schema/file.ts +167 -0
  72. package/src/language-server/providers/schema/index.ts +75 -0
  73. package/src/language-server/server.ts +252 -0
  74. package/src/language-server/typings/codemirror.d.ts +4 -0
  75. package/src/language-server/typings/graphql.d.ts +27 -0
  76. package/src/language-server/utilities/__tests__/graphql.test.ts +411 -0
  77. package/src/language-server/utilities/__tests__/uri.ts +55 -0
  78. package/src/language-server/utilities/debouncer.ts +8 -0
  79. package/src/language-server/utilities/debug.ts +89 -0
  80. package/src/language-server/utilities/graphql.ts +432 -0
  81. package/src/language-server/utilities/index.ts +3 -0
  82. package/src/language-server/utilities/source.ts +182 -0
  83. package/src/language-server/utilities/uri.ts +19 -0
  84. package/src/language-server/workspace.ts +262 -0
  85. package/src/languageServerClient.ts +19 -12
  86. package/src/messages.ts +84 -0
  87. package/src/statusBar.ts +5 -5
  88. package/src/tools/__tests__/buildServiceDefinition.test.ts +491 -0
  89. package/src/tools/__tests__/snapshotSerializers/astSerializer.ts +19 -0
  90. package/src/tools/__tests__/snapshotSerializers/graphQLTypeSerializer.ts +14 -0
  91. package/src/tools/buildServiceDefinition.ts +241 -0
  92. package/src/tools/index.ts +6 -0
  93. package/src/tools/schema/index.ts +2 -0
  94. package/src/tools/schema/resolveObject.ts +18 -0
  95. package/src/tools/schema/resolverMap.ts +23 -0
  96. package/src/tools/utilities/graphql.ts +22 -0
  97. package/src/tools/utilities/index.ts +3 -0
  98. package/src/tools/utilities/invariant.ts +5 -0
  99. package/src/tools/utilities/predicates.ts +5 -0
  100. package/src/utils.ts +1 -16
  101. package/syntaxes/graphql.js.json +3 -3
  102. package/syntaxes/graphql.json +13 -9
  103. package/syntaxes/graphql.lua.json +51 -0
  104. package/syntaxes/graphql.rb.json +1 -1
  105. package/tsconfig.build.json +4 -0
  106. package/tsconfig.json +20 -7
  107. package/create-server-symlink.js +0 -8
  108. package/lib/debug.d.ts +0 -11
  109. package/lib/debug.d.ts.map +0 -1
  110. package/lib/debug.js +0 -48
  111. package/lib/debug.js.map +0 -1
  112. package/lib/extension.d.ts +0 -4
  113. package/lib/extension.d.ts.map +0 -1
  114. package/lib/extension.js +0 -187
  115. package/lib/extension.js.map +0 -1
  116. package/lib/languageServerClient.d.ts +0 -4
  117. package/lib/languageServerClient.d.ts.map +0 -1
  118. package/lib/languageServerClient.js +0 -57
  119. package/lib/languageServerClient.js.map +0 -1
  120. package/lib/statusBar.d.ts +0 -24
  121. package/lib/statusBar.d.ts.map +0 -1
  122. package/lib/statusBar.js +0 -46
  123. package/lib/statusBar.js.map +0 -1
  124. package/lib/testRunner/index.d.ts +0 -3
  125. package/lib/testRunner/index.d.ts.map +0 -1
  126. package/lib/testRunner/index.js +0 -49
  127. package/lib/testRunner/index.js.map +0 -1
  128. package/lib/testRunner/jest-config.d.ts +0 -14
  129. package/lib/testRunner/jest-config.d.ts.map +0 -1
  130. package/lib/testRunner/jest-config.js +0 -18
  131. package/lib/testRunner/jest-config.js.map +0 -1
  132. package/lib/testRunner/jest-vscode-environment.d.ts +0 -2
  133. package/lib/testRunner/jest-vscode-environment.d.ts.map +0 -1
  134. package/lib/testRunner/jest-vscode-environment.js +0 -19
  135. package/lib/testRunner/jest-vscode-environment.js.map +0 -1
  136. package/lib/testRunner/jest-vscode-framework-setup.d.ts +0 -1
  137. package/lib/testRunner/jest-vscode-framework-setup.d.ts.map +0 -1
  138. package/lib/testRunner/jest-vscode-framework-setup.js +0 -3
  139. package/lib/testRunner/jest-vscode-framework-setup.js.map +0 -1
  140. package/lib/testRunner/vscode-test-script.d.ts +0 -2
  141. package/lib/testRunner/vscode-test-script.d.ts.map +0 -1
  142. package/lib/testRunner/vscode-test-script.js +0 -23
  143. package/lib/testRunner/vscode-test-script.js.map +0 -1
  144. package/lib/utils.d.ts +0 -18
  145. package/lib/utils.d.ts.map +0 -1
  146. package/lib/utils.js +0 -52
  147. package/lib/utils.js.map +0 -1
  148. package/src/testRunner/README.md +0 -23
  149. package/src/testRunner/index.ts +0 -72
  150. package/src/testRunner/jest-config.ts +0 -17
  151. package/src/testRunner/jest-vscode-environment.ts +0 -25
  152. package/src/testRunner/jest-vscode-framework-setup.ts +0 -10
  153. package/src/testRunner/jest.d.ts +0 -37
  154. package/src/testRunner/vscode-test-script.ts +0 -38
  155. package/tsconfig.test.json +0 -4
  156. 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;