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,75 @@
1
+ import {
2
+ GraphQLSchemaProvider,
3
+ SchemaChangeUnsubscribeHandler,
4
+ SchemaResolveConfig,
5
+ } from "./base";
6
+ import {
7
+ ApolloConfig,
8
+ isClientConfig,
9
+ isServiceConfig,
10
+ isLocalServiceConfig,
11
+ ClientConfig,
12
+ } from "../../config";
13
+
14
+ import { EndpointSchemaProvider } from "./endpoint";
15
+ import { EngineSchemaProvider } from "./engine";
16
+ import { FileSchemaProvider } from "./file";
17
+ import { ClientIdentity } from "../../engine";
18
+
19
+ export {
20
+ GraphQLSchemaProvider,
21
+ SchemaChangeUnsubscribeHandler,
22
+ SchemaResolveConfig,
23
+ };
24
+
25
+ export function schemaProviderFromConfig(
26
+ config: ApolloConfig,
27
+ clientIdentity?: ClientIdentity // engine provider needs this
28
+ ): GraphQLSchemaProvider {
29
+ // we need this to be first because there will pretty much always be a
30
+ // url (since it's a default). If there is a localSchemaFile, we need to
31
+ // use that instead of the url.
32
+ if (config.service && config.service.localSchemaFile) {
33
+ const isListOfSchemaFiles = Array.isArray(config.service.localSchemaFile);
34
+ return new FileSchemaProvider(
35
+ isListOfSchemaFiles
36
+ ? { paths: config.service.localSchemaFile as string[] }
37
+ : { path: config.service.localSchemaFile as string }
38
+ );
39
+ }
40
+
41
+ if (config.service && config.service.endpoint) {
42
+ return new EndpointSchemaProvider(config.service.endpoint);
43
+ }
44
+
45
+ if (isClientConfig(config)) {
46
+ if (typeof config.client.service === "string") {
47
+ return new EngineSchemaProvider(config, clientIdentity);
48
+ }
49
+
50
+ if (config.client.service) {
51
+ if (isLocalServiceConfig(config.client.service)) {
52
+ const isListOfSchemaFiles = Array.isArray(
53
+ config.client.service.localSchemaFile
54
+ );
55
+ return new FileSchemaProvider(
56
+ isListOfSchemaFiles
57
+ ? { paths: config.client.service.localSchemaFile as string[] }
58
+ : {
59
+ path: config.client.service.localSchemaFile as string,
60
+ }
61
+ );
62
+ }
63
+
64
+ return new EndpointSchemaProvider(config.client.service);
65
+ }
66
+ }
67
+
68
+ if (config.graph && config.engine) {
69
+ return new EngineSchemaProvider(config as ClientConfig, clientIdentity);
70
+ }
71
+
72
+ throw new Error(
73
+ "No schema provider was created, because the project type was unable to be resolved from your config. Please add either a client or service config. For more information, please refer to https://go.apollo.dev/t/config"
74
+ );
75
+ }
@@ -0,0 +1,252 @@
1
+ import "../env";
2
+ // FIXME: The global fetch dependency comes from `apollo-link-http` and should be removed there.
3
+ import "../env/fetch/global";
4
+ import {
5
+ createConnection,
6
+ ProposedFeatures,
7
+ TextDocuments,
8
+ FileChangeType,
9
+ ServerCapabilities,
10
+ } from "vscode-languageserver";
11
+ import type { QuickPickItem } from "vscode";
12
+ import { GraphQLWorkspace } from "./workspace";
13
+ import { GraphQLLanguageProvider } from "./languageProvider";
14
+ import { LanguageServerLoadingHandler } from "./loadingHandler";
15
+ import { debounceHandler, Debug } from "./utilities";
16
+ import type { Connection } from "src/messages";
17
+ import URI from "vscode-uri";
18
+
19
+ const connection: Connection = createConnection(ProposedFeatures.all);
20
+ Debug.SetConnection(connection);
21
+
22
+ let hasWorkspaceFolderCapability = false;
23
+
24
+ // Awaitable promise for sending messages before the connection is initialized
25
+ let initializeConnection: () => void;
26
+ const whenConnectionInitialized: Promise<void> = new Promise(
27
+ (resolve) => (initializeConnection = resolve)
28
+ );
29
+
30
+ const workspace = new GraphQLWorkspace(
31
+ new LanguageServerLoadingHandler(connection),
32
+ {
33
+ clientIdentity: {
34
+ name: process.env["APOLLO_CLIENT_NAME"],
35
+ version: process.env["APOLLO_CLIENT_VERSION"],
36
+ referenceID: process.env["APOLLO_CLIENT_REFERENCE_ID"],
37
+ },
38
+ }
39
+ );
40
+
41
+ workspace.onDiagnostics((params) => {
42
+ connection.sendDiagnostics(params);
43
+ });
44
+
45
+ workspace.onDecorations((params) => {
46
+ connection.sendNotification("apollographql/engineDecorations", {
47
+ decorations: params,
48
+ });
49
+ });
50
+
51
+ workspace.onSchemaTags((params) => {
52
+ connection.sendNotification(
53
+ "apollographql/tagsLoaded",
54
+ JSON.stringify(params)
55
+ );
56
+ });
57
+
58
+ workspace.onConfigFilesFound(async (params) => {
59
+ await whenConnectionInitialized;
60
+
61
+ connection.sendNotification(
62
+ "apollographql/configFilesFound",
63
+ params instanceof Error
64
+ ? // Can't stringify Errors, just results in "{}"
65
+ JSON.stringify({ message: params.message, stack: params.stack })
66
+ : JSON.stringify(params)
67
+ );
68
+ });
69
+
70
+ connection.onInitialize(async ({ capabilities, workspaceFolders }) => {
71
+ hasWorkspaceFolderCapability = !!(
72
+ capabilities.workspace && capabilities.workspace.workspaceFolders
73
+ );
74
+
75
+ if (workspaceFolders) {
76
+ // We wait until all projects are added, because after `initialize` returns we can get additional requests
77
+ // like `textDocument/codeLens`, and that way these can await `GraphQLProject#whenReady` to make sure
78
+ // we provide them eventually.
79
+ await Promise.all(
80
+ workspaceFolders.map((folder) => workspace.addProjectsInFolder(folder))
81
+ );
82
+ }
83
+
84
+ return {
85
+ capabilities: {
86
+ hoverProvider: true,
87
+ completionProvider: {
88
+ resolveProvider: false,
89
+ triggerCharacters: ["...", "@"],
90
+ },
91
+ definitionProvider: true,
92
+ referencesProvider: true,
93
+ documentSymbolProvider: true,
94
+ workspaceSymbolProvider: true,
95
+ codeLensProvider: {
96
+ resolveProvider: false,
97
+ },
98
+ codeActionProvider: true,
99
+ executeCommandProvider: {
100
+ commands: [],
101
+ },
102
+ textDocumentSync: documents.syncKind,
103
+ } as ServerCapabilities,
104
+ };
105
+ });
106
+
107
+ connection.onInitialized(async () => {
108
+ initializeConnection();
109
+ if (hasWorkspaceFolderCapability) {
110
+ connection.workspace.onDidChangeWorkspaceFolders(async (event) => {
111
+ await Promise.all([
112
+ ...event.removed.map((folder) =>
113
+ workspace.removeProjectsInFolder(folder)
114
+ ),
115
+ ...event.added.map((folder) => workspace.addProjectsInFolder(folder)),
116
+ ]);
117
+ });
118
+ }
119
+ });
120
+
121
+ const documents: TextDocuments = new TextDocuments();
122
+
123
+ // Make the text document manager listen on the connection
124
+ // for open, change and close text document events
125
+ documents.listen(connection);
126
+
127
+ function isFile(uri: string) {
128
+ return URI.parse(uri).scheme === "file";
129
+ }
130
+
131
+ documents.onDidChangeContent(
132
+ debounceHandler((params) => {
133
+ const project = workspace.projectForFile(params.document.uri);
134
+ if (!project) return;
135
+
136
+ // Only watch changes to files
137
+ if (!isFile(params.document.uri)) {
138
+ return;
139
+ }
140
+
141
+ project.documentDidChange(params.document);
142
+ })
143
+ );
144
+
145
+ connection.onDidChangeWatchedFiles((params) => {
146
+ for (const { uri, type } of params.changes) {
147
+ if (
148
+ uri.endsWith("apollo.config.js") ||
149
+ uri.endsWith("apollo.config.cjs") ||
150
+ uri.endsWith(".env")
151
+ ) {
152
+ workspace.reloadProjectForConfig(uri);
153
+ }
154
+
155
+ // Don't respond to changes in files that are currently open,
156
+ // because we'll get content change notifications instead
157
+ if (type === FileChangeType.Changed) {
158
+ continue;
159
+ }
160
+
161
+ // Only watch changes to files
162
+ if (!isFile(uri)) {
163
+ continue;
164
+ }
165
+
166
+ const project = workspace.projectForFile(uri);
167
+ if (!project) continue;
168
+
169
+ switch (type) {
170
+ case FileChangeType.Created:
171
+ project.fileDidChange(uri);
172
+ break;
173
+ case FileChangeType.Deleted:
174
+ project.fileWasDeleted(uri);
175
+ break;
176
+ }
177
+ }
178
+ });
179
+
180
+ const languageProvider = new GraphQLLanguageProvider(workspace);
181
+
182
+ connection.onHover((params, token) =>
183
+ languageProvider.provideHover(params.textDocument.uri, params.position, token)
184
+ );
185
+
186
+ connection.onDefinition((params, token) =>
187
+ languageProvider.provideDefinition(
188
+ params.textDocument.uri,
189
+ params.position,
190
+ token
191
+ )
192
+ );
193
+
194
+ connection.onReferences((params, token) =>
195
+ languageProvider.provideReferences(
196
+ params.textDocument.uri,
197
+ params.position,
198
+ params.context,
199
+ token
200
+ )
201
+ );
202
+
203
+ connection.onDocumentSymbol((params, token) =>
204
+ languageProvider.provideDocumentSymbol(params.textDocument.uri, token)
205
+ );
206
+
207
+ connection.onWorkspaceSymbol((params, token) =>
208
+ languageProvider.provideWorkspaceSymbol(params.query, token)
209
+ );
210
+
211
+ connection.onCompletion(
212
+ debounceHandler((params, token) =>
213
+ languageProvider.provideCompletionItems(
214
+ params.textDocument.uri,
215
+ params.position,
216
+ token
217
+ )
218
+ )
219
+ );
220
+
221
+ connection.onCodeLens(
222
+ debounceHandler((params, token) =>
223
+ languageProvider.provideCodeLenses(params.textDocument.uri, token)
224
+ )
225
+ );
226
+
227
+ connection.onCodeAction(
228
+ debounceHandler((params, token) =>
229
+ languageProvider.provideCodeAction(
230
+ params.textDocument.uri,
231
+ params.range,
232
+ token
233
+ )
234
+ )
235
+ );
236
+
237
+ connection.onNotification("apollographql/reloadService", () =>
238
+ workspace.reloadService()
239
+ );
240
+
241
+ connection.onNotification(
242
+ "apollographql/tagSelected",
243
+ (selection: QuickPickItem) => workspace.updateSchemaTag(selection)
244
+ );
245
+
246
+ connection.onNotification("apollographql/getStats", async ({ uri }) => {
247
+ const status = await languageProvider.provideStats(uri);
248
+ connection.sendNotification("apollographql/statsLoaded", status);
249
+ });
250
+
251
+ // Listen on the connection
252
+ connection.listen();
@@ -0,0 +1,4 @@
1
+ // `codemirror` types have some issues, and this isn't really being used anyways
2
+ declare module "codemirror" {
3
+ type Token = any;
4
+ }
@@ -0,0 +1,27 @@
1
+ import {
2
+ ASTNode,
3
+ TypeSystemDefinitionNode,
4
+ TypeSystemExtensionNode,
5
+ FragmentDefinitionNode,
6
+ OperationDefinitionNode,
7
+ } from "graphql";
8
+
9
+ // FIXME: We should add proper type guards for these predicate functions
10
+ // to `@types/graphql`.
11
+ declare module "graphql/language/predicates" {
12
+ function isExecutableDefinitionNode(
13
+ node: ASTNode
14
+ ): node is OperationDefinitionNode | FragmentDefinitionNode;
15
+ function isTypeSystemDefinitionNode(
16
+ node: ASTNode
17
+ ): node is TypeSystemDefinitionNode;
18
+ function isTypeSystemExtensionNode(
19
+ node: ASTNode
20
+ ): node is TypeSystemExtensionNode;
21
+ }
22
+
23
+ declare module "graphql/validation/validate" {
24
+ interface ValidationContext {
25
+ _fragments: { [fragmentName: string]: FragmentDefinitionNode };
26
+ }
27
+ }