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.
Files changed (155) 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/release.yml +95 -0
  7. package/.gitleaks.toml +26 -0
  8. package/.nvmrc +1 -0
  9. package/.prettierrc +5 -0
  10. package/.vscode/launch.json +61 -0
  11. package/.vscode/settings.json +16 -0
  12. package/.vscode/tasks.json +18 -0
  13. package/.vscodeignore +17 -1
  14. package/CHANGELOG.md +172 -1
  15. package/LICENSE +2 -2
  16. package/README.md +9 -9
  17. package/codegen.yml +12 -0
  18. package/images/IconRun.svg +8 -0
  19. package/jest.config.ts +11 -0
  20. package/package.json +102 -22
  21. package/renovate.json +23 -0
  22. package/src/__mocks__/fs.js +3 -0
  23. package/src/__tests__/statusBar.test.ts +8 -7
  24. package/src/debug.ts +2 -5
  25. package/src/env/fetch/fetch.ts +32 -0
  26. package/src/env/fetch/global.ts +30 -0
  27. package/src/env/fetch/index.d.ts +2 -0
  28. package/src/env/fetch/index.ts +2 -0
  29. package/src/env/fetch/url.ts +9 -0
  30. package/src/env/index.ts +4 -0
  31. package/src/env/polyfills/array.ts +17 -0
  32. package/src/env/polyfills/index.ts +2 -0
  33. package/src/env/polyfills/object.ts +7 -0
  34. package/src/env/typescript-utility-types.ts +2 -0
  35. package/src/extension.ts +106 -37
  36. package/src/language-server/__tests__/diagnostics.test.ts +86 -0
  37. package/src/language-server/__tests__/document.test.ts +187 -0
  38. package/src/language-server/__tests__/fileSet.test.ts +46 -0
  39. package/src/language-server/__tests__/fixtures/starwarsSchema.ts +1917 -0
  40. package/src/language-server/config/__tests__/config.ts +128 -0
  41. package/src/language-server/config/__tests__/loadConfig.ts +508 -0
  42. package/src/language-server/config/__tests__/utils.ts +106 -0
  43. package/src/language-server/config/config.ts +219 -0
  44. package/src/language-server/config/index.ts +3 -0
  45. package/src/language-server/config/loadConfig.ts +228 -0
  46. package/src/language-server/config/utils.ts +56 -0
  47. package/src/language-server/diagnostics.ts +109 -0
  48. package/src/language-server/document.ts +277 -0
  49. package/src/language-server/engine/GraphQLDataSource.ts +124 -0
  50. package/src/language-server/engine/index.ts +105 -0
  51. package/src/language-server/engine/operations/frontendUrlRoot.ts +7 -0
  52. package/src/language-server/engine/operations/schemaTagsAndFieldStats.ts +24 -0
  53. package/src/language-server/errors/__tests__/NoMissingClientDirectives.test.ts +220 -0
  54. package/src/language-server/errors/logger.ts +58 -0
  55. package/src/language-server/errors/validation.ts +277 -0
  56. package/src/language-server/fileSet.ts +65 -0
  57. package/src/language-server/format.ts +48 -0
  58. package/src/language-server/graphqlTypes.ts +7176 -0
  59. package/src/language-server/index.ts +29 -0
  60. package/src/language-server/languageProvider.ts +798 -0
  61. package/src/language-server/loadingHandler.ts +64 -0
  62. package/src/language-server/project/base.ts +399 -0
  63. package/src/language-server/project/client.ts +602 -0
  64. package/src/language-server/project/defaultClientSchema.ts +45 -0
  65. package/src/language-server/project/service.ts +48 -0
  66. package/src/language-server/providers/schema/__tests__/file.ts +150 -0
  67. package/src/language-server/providers/schema/base.ts +15 -0
  68. package/src/language-server/providers/schema/endpoint.ts +157 -0
  69. package/src/language-server/providers/schema/engine.ts +197 -0
  70. package/src/language-server/providers/schema/file.ts +167 -0
  71. package/src/language-server/providers/schema/index.ts +75 -0
  72. package/src/language-server/server.ts +252 -0
  73. package/src/language-server/typings/codemirror.d.ts +4 -0
  74. package/src/language-server/typings/graphql.d.ts +27 -0
  75. package/src/language-server/utilities/__tests__/graphql.test.ts +411 -0
  76. package/src/language-server/utilities/__tests__/uri.ts +55 -0
  77. package/src/language-server/utilities/debouncer.ts +8 -0
  78. package/src/language-server/utilities/debug.ts +89 -0
  79. package/src/language-server/utilities/graphql.ts +432 -0
  80. package/src/language-server/utilities/index.ts +3 -0
  81. package/src/language-server/utilities/source.ts +182 -0
  82. package/src/language-server/utilities/uri.ts +19 -0
  83. package/src/language-server/workspace.ts +262 -0
  84. package/src/languageServerClient.ts +19 -12
  85. package/src/messages.ts +84 -0
  86. package/src/statusBar.ts +5 -5
  87. package/src/tools/__tests__/buildServiceDefinition.test.ts +491 -0
  88. package/src/tools/__tests__/snapshotSerializers/astSerializer.ts +19 -0
  89. package/src/tools/__tests__/snapshotSerializers/graphQLTypeSerializer.ts +14 -0
  90. package/src/tools/buildServiceDefinition.ts +241 -0
  91. package/src/tools/index.ts +6 -0
  92. package/src/tools/schema/index.ts +2 -0
  93. package/src/tools/schema/resolveObject.ts +18 -0
  94. package/src/tools/schema/resolverMap.ts +23 -0
  95. package/src/tools/utilities/graphql.ts +22 -0
  96. package/src/tools/utilities/index.ts +3 -0
  97. package/src/tools/utilities/invariant.ts +5 -0
  98. package/src/tools/utilities/predicates.ts +5 -0
  99. package/src/utils.ts +1 -16
  100. package/syntaxes/graphql.js.json +3 -3
  101. package/syntaxes/graphql.json +13 -9
  102. package/syntaxes/graphql.lua.json +51 -0
  103. package/syntaxes/graphql.rb.json +1 -1
  104. package/tsconfig.build.json +4 -0
  105. package/tsconfig.json +20 -7
  106. package/create-server-symlink.js +0 -8
  107. package/lib/debug.d.ts +0 -11
  108. package/lib/debug.d.ts.map +0 -1
  109. package/lib/debug.js +0 -48
  110. package/lib/debug.js.map +0 -1
  111. package/lib/extension.d.ts +0 -4
  112. package/lib/extension.d.ts.map +0 -1
  113. package/lib/extension.js +0 -187
  114. package/lib/extension.js.map +0 -1
  115. package/lib/languageServerClient.d.ts +0 -4
  116. package/lib/languageServerClient.d.ts.map +0 -1
  117. package/lib/languageServerClient.js +0 -57
  118. package/lib/languageServerClient.js.map +0 -1
  119. package/lib/statusBar.d.ts +0 -24
  120. package/lib/statusBar.d.ts.map +0 -1
  121. package/lib/statusBar.js +0 -46
  122. package/lib/statusBar.js.map +0 -1
  123. package/lib/testRunner/index.d.ts +0 -3
  124. package/lib/testRunner/index.d.ts.map +0 -1
  125. package/lib/testRunner/index.js +0 -49
  126. package/lib/testRunner/index.js.map +0 -1
  127. package/lib/testRunner/jest-config.d.ts +0 -14
  128. package/lib/testRunner/jest-config.d.ts.map +0 -1
  129. package/lib/testRunner/jest-config.js +0 -18
  130. package/lib/testRunner/jest-config.js.map +0 -1
  131. package/lib/testRunner/jest-vscode-environment.d.ts +0 -2
  132. package/lib/testRunner/jest-vscode-environment.d.ts.map +0 -1
  133. package/lib/testRunner/jest-vscode-environment.js +0 -19
  134. package/lib/testRunner/jest-vscode-environment.js.map +0 -1
  135. package/lib/testRunner/jest-vscode-framework-setup.d.ts +0 -1
  136. package/lib/testRunner/jest-vscode-framework-setup.d.ts.map +0 -1
  137. package/lib/testRunner/jest-vscode-framework-setup.js +0 -3
  138. package/lib/testRunner/jest-vscode-framework-setup.js.map +0 -1
  139. package/lib/testRunner/vscode-test-script.d.ts +0 -2
  140. package/lib/testRunner/vscode-test-script.d.ts.map +0 -1
  141. package/lib/testRunner/vscode-test-script.js +0 -23
  142. package/lib/testRunner/vscode-test-script.js.map +0 -1
  143. package/lib/utils.d.ts +0 -18
  144. package/lib/utils.d.ts.map +0 -1
  145. package/lib/utils.js +0 -52
  146. package/lib/utils.js.map +0 -1
  147. package/src/testRunner/README.md +0 -23
  148. package/src/testRunner/index.ts +0 -72
  149. package/src/testRunner/jest-config.ts +0 -17
  150. package/src/testRunner/jest-vscode-environment.ts +0 -25
  151. package/src/testRunner/jest-vscode-framework-setup.ts +0 -10
  152. package/src/testRunner/jest.d.ts +0 -37
  153. package/src/testRunner/vscode-test-script.ts +0 -38
  154. package/tsconfig.test.json +0 -4
  155. package/tsconfig.tsbuildinfo +0 -2486
@@ -0,0 +1,86 @@
1
+ import { Source, buildClientSchema } from "graphql";
2
+ import { GraphQLDocument } from "../document";
3
+ import { collectExecutableDefinitionDiagnositics } from "../diagnostics";
4
+ import { starwarsSchema } from "./fixtures/starwarsSchema";
5
+
6
+ const schema = buildClientSchema(starwarsSchema);
7
+
8
+ const validDocument = new GraphQLDocument(
9
+ new Source(`
10
+ query HeroAndFriendsNames {
11
+ hero {
12
+ name
13
+ friends {
14
+ name
15
+ }
16
+ }
17
+ }`)
18
+ );
19
+ const invalidDocument = new GraphQLDocument(
20
+ new Source(`
21
+ query HeroAndFriendsNames {
22
+ hero {
23
+ nam # Missing letter 'e'
24
+ friend { # Missing letter 's'
25
+ name
26
+ }
27
+ }
28
+ }`)
29
+ );
30
+ const documentWithTypes = new GraphQLDocument(
31
+ new Source(`
32
+ type SomeType {
33
+ thing: String
34
+ }
35
+ enum SomeEnum {
36
+ THING_ONE
37
+ THING_TWO
38
+ }
39
+ query HeroAndFriendsNames {
40
+ hero {
41
+ name
42
+ friends {
43
+ name
44
+ }
45
+ }
46
+ }`)
47
+ );
48
+ const documentWithOffset = new GraphQLDocument(
49
+ new Source(`query QueryWithOffset { hero { nam } }`, "testDocument", {
50
+ line: 5,
51
+ column: 10,
52
+ })
53
+ );
54
+ describe("Language server diagnostics", () => {
55
+ describe("#collectExecutableDefinitionDiagnositics", () => {
56
+ it("returns no diagnostics for a correct document", () => {
57
+ const diagnostics = collectExecutableDefinitionDiagnositics(
58
+ schema,
59
+ validDocument
60
+ );
61
+ expect(diagnostics.length).toEqual(0);
62
+ });
63
+ it("returns two diagnostics for a document with two errors", () => {
64
+ const diagnostics = collectExecutableDefinitionDiagnositics(
65
+ schema,
66
+ invalidDocument
67
+ );
68
+ expect(diagnostics.length).toEqual(2);
69
+ });
70
+ it("returns no diagnostics for a document that includes type definitions", () => {
71
+ const diagnostics = collectExecutableDefinitionDiagnositics(
72
+ schema,
73
+ documentWithTypes
74
+ );
75
+ expect(diagnostics.length).toEqual(0);
76
+ });
77
+ it("correctly offsets locations", () => {
78
+ const diagnostics = collectExecutableDefinitionDiagnositics(
79
+ schema,
80
+ documentWithOffset
81
+ );
82
+ expect(diagnostics.length).toEqual(1);
83
+ expect(diagnostics[0].range.start.character).toEqual(40);
84
+ });
85
+ });
86
+ });
@@ -0,0 +1,187 @@
1
+ import { extractGraphQLDocuments } from "../document";
2
+ import { TextDocument, Position } from "vscode-languageserver";
3
+
4
+ describe("extractGraphQLDocuments", () => {
5
+ describe("extracting documents from JavaScript template literals", () => {
6
+ const mockTextDocument = (text: string): TextDocument => ({
7
+ getText: jest.fn().mockReturnValue(text),
8
+ offsetAt(): number {
9
+ return 0;
10
+ },
11
+ positionAt(): Position {
12
+ return {
13
+ character: 0,
14
+ line: 0,
15
+ };
16
+ },
17
+ languageId: "javascript",
18
+ lineCount: 0,
19
+ uri: "",
20
+ version: 1,
21
+ });
22
+
23
+ it("works with placeholders that span multiple rows", () => {
24
+ const textDocument = mockTextDocument(`
25
+ gql\`
26
+ {
27
+ hero {
28
+ ...Hero_character
29
+ }
30
+ }
31
+
32
+ \${Hero.fragments
33
+ .character}
34
+ \`
35
+ `);
36
+ const documents = extractGraphQLDocuments(textDocument);
37
+
38
+ expect(documents?.length).toEqual(1);
39
+ expect(documents?.[0].syntaxErrors.length).toBe(0);
40
+ expect(documents?.[0].ast?.definitions.length).toBe(1);
41
+ });
42
+
43
+ it("works with multiple placeholders in a document", () => {
44
+ const textDocument = mockTextDocument(`
45
+ gql\`
46
+ {
47
+ hero {
48
+ ...Hero_character
49
+ }
50
+ }
51
+
52
+ \${Hero.fragments.character}
53
+
54
+ {
55
+ reviews(episode: NEWHOPE) {
56
+ ...ReviewList_reviews
57
+ }
58
+ }
59
+
60
+ \${ReviewList.fragments.reviews}
61
+ \`
62
+ `);
63
+ const documents = extractGraphQLDocuments(textDocument);
64
+
65
+ expect(documents?.length).toEqual(1);
66
+ expect(documents?.[0].syntaxErrors.length).toBe(0);
67
+ expect(documents?.[0].ast?.definitions.length).toBe(2);
68
+ });
69
+
70
+ it("works with a custom tagname", () => {
71
+ const textDocument = mockTextDocument(`
72
+ gqltag\`
73
+ {
74
+ hero {
75
+ ...Hero_character
76
+ }
77
+ }
78
+
79
+ \${Hero.fragments.character}
80
+
81
+ {
82
+ reviews(episode: NEWHOPE) {
83
+ ...ReviewList_reviews
84
+ }
85
+ }
86
+
87
+ \${ReviewList.fragments.reviews}
88
+ \`
89
+ `);
90
+ const documents = extractGraphQLDocuments(textDocument, "gqltag");
91
+
92
+ expect(documents?.length).toEqual(1);
93
+ expect(documents?.[0].syntaxErrors.length).toBe(0);
94
+ expect(documents?.[0].ast?.definitions.length).toBe(2);
95
+ });
96
+
97
+ it("works with parens", () => {
98
+ const textDocument = mockTextDocument(`
99
+ gql(\`
100
+ {
101
+ hero {
102
+ ...Hero_character
103
+ }
104
+ }
105
+
106
+ \${Hero.fragments.character}
107
+
108
+ {
109
+ reviews(episode: NEWHOPE) {
110
+ ...ReviewList_reviews
111
+ }
112
+ }
113
+
114
+ \${ReviewList.fragments.reviews}
115
+ \`)
116
+ `);
117
+ const documents = extractGraphQLDocuments(textDocument);
118
+
119
+ expect(documents?.length).toEqual(1);
120
+ expect(documents?.[0].syntaxErrors.length).toBe(0);
121
+ expect(documents?.[0].ast?.definitions.length).toBe(2);
122
+ });
123
+ });
124
+
125
+ describe("extracting documents from ReasonML extension nodes", () => {
126
+ const mockTextDocument = (text: string): TextDocument => ({
127
+ getText: jest.fn().mockReturnValue(text),
128
+ offsetAt(): number {
129
+ return 0;
130
+ },
131
+ positionAt(): Position {
132
+ return {
133
+ character: 0,
134
+ line: 0,
135
+ };
136
+ },
137
+ languageId: "reason",
138
+ lineCount: 0,
139
+ uri: "",
140
+ version: 1,
141
+ });
142
+
143
+ it("works with ReasonRelay nodes", () => {
144
+ const textDocument = mockTextDocument(`
145
+ module Query = [%relay.query
146
+ {|
147
+ query SomeQuery {
148
+ id
149
+ }
150
+ |}
151
+ ];
152
+
153
+ module Fragment = [%relay.fragment
154
+ {|
155
+ fragment X on Hero {
156
+ id
157
+ }
158
+ |}
159
+ ];
160
+ `);
161
+ const documents = extractGraphQLDocuments(textDocument);
162
+
163
+ expect(documents?.length).toEqual(2);
164
+ expect(documents?.[0].syntaxErrors.length).toBe(0);
165
+ expect(documents?.[1].syntaxErrors.length).toBe(0);
166
+ expect(documents?.[0].ast?.definitions.length).toBe(1);
167
+ expect(documents?.[1].ast?.definitions.length).toBe(1);
168
+ });
169
+
170
+ it("works with graphql_ppx style node", () => {
171
+ const textDocument = mockTextDocument(`
172
+ module Query = [%graphql
173
+ {|
174
+ query SomeQuery {
175
+ id
176
+ }
177
+ |}
178
+ ];
179
+ `);
180
+ const documents = extractGraphQLDocuments(textDocument);
181
+
182
+ expect(documents?.length).toEqual(1);
183
+ expect(documents?.[0].syntaxErrors.length).toBe(0);
184
+ expect(documents?.[0].ast?.definitions.length).toBe(1);
185
+ });
186
+ });
187
+ });
@@ -0,0 +1,46 @@
1
+ import { FileSet } from "../fileSet";
2
+ import URI from "vscode-uri";
3
+
4
+ describe("fileSet", () => {
5
+ describe("includesFile", () => {
6
+ it("matches includes starting with ./", () => {
7
+ const fileSet = new FileSet({
8
+ excludes: [],
9
+ includes: ["./src/**/*.tsx"],
10
+ rootURI: URI.parse("/project"),
11
+ });
12
+ const file = "file:///project/src/Component.tsx";
13
+ expect(fileSet.includesFile(file)).toBe(true);
14
+ });
15
+
16
+ it("matches includes not starting with ./", () => {
17
+ const fileSet = new FileSet({
18
+ excludes: [],
19
+ includes: ["src/**/*.tsx"],
20
+ rootURI: URI.parse("/project"),
21
+ });
22
+ const file = "file:///project/src/Component.tsx";
23
+ expect(fileSet.includesFile(file)).toBe(true);
24
+ });
25
+
26
+ it("does not match excludes starting with ./", () => {
27
+ const fileSet = new FileSet({
28
+ excludes: ["./src/Component.tsx"],
29
+ includes: ["./src/**/*.tsx"],
30
+ rootURI: URI.parse("/project"),
31
+ });
32
+ const file = "file:///project/src/Component.tsx";
33
+ expect(fileSet.includesFile(file)).toBe(false);
34
+ });
35
+
36
+ it("does not match excludes not starting with ./", () => {
37
+ const fileSet = new FileSet({
38
+ excludes: ["src/Component.tsx"],
39
+ includes: ["src/**/*.tsx"],
40
+ rootURI: URI.parse("/project"),
41
+ });
42
+ const file = "file:///project/src/Component.tsx";
43
+ expect(fileSet.includesFile(file)).toBe(false);
44
+ });
45
+ });
46
+ });