vscode-apollo 1.19.3 → 2.0.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 +91 -0
- package/.eslintrc.js +10 -0
- package/.git-blame-ignore-revs +2 -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 +66 -0
- package/.vscode/settings.json +16 -0
- package/.vscode/tasks.json +60 -0
- package/.vscodeignore +28 -1
- package/CHANGELOG.md +250 -1
- package/CODEOWNERS +4 -0
- package/LICENSE +2 -2
- package/README.md +104 -55
- package/codegen.yml +12 -0
- package/graphql.configuration.json +5 -1
- package/images/IconRun.svg +8 -0
- package/images/marketplace/apollo-wordmark.png +0 -0
- package/jest.config.ts +21 -0
- package/jest.e2e.config.js +17 -0
- package/package.json +102 -23
- package/renovate.json +30 -0
- package/sampleWorkspace/clientSchema/apollo.config.cjs +10 -0
- package/sampleWorkspace/clientSchema/src/clientSchema.js +16 -0
- package/sampleWorkspace/clientSchema/src/test.js +18 -0
- package/sampleWorkspace/fixtures/starwarsSchema.graphql +299 -0
- package/sampleWorkspace/httpSchema/apollo.config.ts +8 -0
- package/sampleWorkspace/httpSchema/src/test.js +9 -0
- package/sampleWorkspace/localSchema/apollo.config.js +8 -0
- package/sampleWorkspace/localSchema/src/test.js +8 -0
- package/sampleWorkspace/localSchemaArray/apollo.config.js +12 -0
- package/sampleWorkspace/localSchemaArray/planets.graphql +20 -0
- package/sampleWorkspace/localSchemaArray/src/test.js +12 -0
- package/sampleWorkspace/sampleWorkspace.code-workspace +20 -0
- package/sampleWorkspace/spotifyGraph/apollo.config.mjs +5 -0
- package/sampleWorkspace/spotifyGraph/src/test.js +11 -0
- package/src/__e2e__/mockServer.js +117 -0
- package/src/__e2e__/mocks.js +13094 -0
- package/src/__e2e__/run.js +23 -0
- package/src/__e2e__/runTests.js +44 -0
- package/src/__e2e__/setup.js +1 -0
- package/src/__e2e__/vscode-environment.js +16 -0
- package/src/__e2e__/vscode.js +1 -0
- package/src/__mocks__/fs.js +3 -0
- package/src/__tests__/statusBar.test.ts +8 -7
- package/src/build.js +57 -0
- package/src/debug.ts +2 -5
- package/src/env/index.ts +1 -0
- package/src/env/typescript-utility-types.ts +2 -0
- package/src/extension.ts +265 -170
- package/src/language-server/__e2e__/clientSchema.e2e.ts +147 -0
- package/src/language-server/__e2e__/httpSchema.e2e.ts +21 -0
- package/src/language-server/__e2e__/localSchema.e2e.ts +25 -0
- package/src/language-server/__e2e__/localSchemaArray.e2e.ts +31 -0
- package/src/language-server/__e2e__/studioGraph.e2e.ts +65 -0
- package/src/language-server/__e2e__/utils.ts +151 -0
- 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 +54 -0
- package/src/language-server/config/__tests__/loadConfig.ts +384 -0
- package/src/language-server/config/__tests__/utils.ts +99 -0
- package/src/language-server/config/config.ts +284 -0
- package/src/language-server/config/index.ts +3 -0
- package/src/language-server/config/loadConfig.ts +101 -0
- package/src/language-server/config/utils.ts +45 -0
- package/src/language-server/diagnostics.ts +118 -0
- package/src/language-server/document.ts +277 -0
- package/src/language-server/engine/index.ts +123 -0
- package/src/language-server/engine/operations/frontendUrlRoot.ts +15 -0
- package/src/language-server/engine/operations/schemaTagsAndFieldStats.ts +32 -0
- package/src/language-server/errors/__tests__/NoMissingClientDirectives.test.ts +225 -0
- package/src/language-server/errors/logger.ts +58 -0
- package/src/language-server/errors/validation.ts +274 -0
- package/src/language-server/fileSet.ts +63 -0
- package/src/language-server/format.ts +48 -0
- package/src/language-server/graphqlTypes.ts +16741 -0
- package/src/language-server/index.ts +28 -0
- package/src/language-server/languageProvider.ts +795 -0
- package/src/language-server/loadingHandler.ts +47 -0
- package/src/language-server/project/base.ts +406 -0
- package/src/language-server/project/client.ts +568 -0
- package/src/language-server/project/defaultClientSchema.ts +70 -0
- package/src/language-server/providers/schema/__tests__/file.ts +191 -0
- package/src/language-server/providers/schema/base.ts +15 -0
- package/src/language-server/providers/schema/endpoint.ts +138 -0
- package/src/language-server/providers/schema/engine.ts +204 -0
- package/src/language-server/providers/schema/file.ts +176 -0
- package/src/language-server/providers/schema/index.ts +59 -0
- package/src/language-server/server.ts +274 -0
- package/src/language-server/typings/graphql.d.ts +27 -0
- package/src/language-server/utilities/__tests__/graphql.test.ts +399 -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 +90 -0
- package/src/language-server/utilities/graphql.ts +433 -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 +254 -0
- package/src/languageServerClient.ts +22 -15
- package/src/messages.ts +75 -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 +7 -21
- package/syntaxes/graphql.dart.json +2 -4
- package/syntaxes/graphql.ex.json +1 -4
- 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 +11 -0
- package/tsconfig.json +22 -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,254 @@
|
|
|
1
|
+
import {
|
|
2
|
+
WorkspaceFolder,
|
|
3
|
+
NotificationHandler,
|
|
4
|
+
PublishDiagnosticsParams,
|
|
5
|
+
} from "vscode-languageserver/node";
|
|
6
|
+
import { QuickPickItem } from "vscode";
|
|
7
|
+
import { GraphQLProject, DocumentUri } from "./project/base";
|
|
8
|
+
import { dirname } from "path";
|
|
9
|
+
import { globSync } from "glob";
|
|
10
|
+
import { loadConfig, ApolloConfig, isClientConfig } from "./config";
|
|
11
|
+
import { LanguageServerLoadingHandler } from "./loadingHandler";
|
|
12
|
+
import { ServiceID, SchemaTag, ClientIdentity } from "./engine";
|
|
13
|
+
import { GraphQLClientProject, isClientProject } from "./project/client";
|
|
14
|
+
import { URI } from "vscode-uri";
|
|
15
|
+
import { Debug } from "./utilities";
|
|
16
|
+
import type { EngineDecoration } from "../messages";
|
|
17
|
+
import { equal } from "@wry/equality";
|
|
18
|
+
|
|
19
|
+
export interface WorkspaceConfig {
|
|
20
|
+
clientIdentity: ClientIdentity;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export class GraphQLWorkspace {
|
|
24
|
+
private _onDiagnostics?: NotificationHandler<PublishDiagnosticsParams>;
|
|
25
|
+
private _onDecorations?: NotificationHandler<EngineDecoration[]>;
|
|
26
|
+
private _onSchemaTags?: NotificationHandler<[ServiceID, SchemaTag[]]>;
|
|
27
|
+
private _onConfigFilesFound?: NotificationHandler<(ApolloConfig | Error)[]>;
|
|
28
|
+
private _projectForFileCache: Map<string, GraphQLProject> = new Map();
|
|
29
|
+
|
|
30
|
+
private projectsByFolderUri: Map<string, GraphQLProject[]> = new Map();
|
|
31
|
+
|
|
32
|
+
constructor(
|
|
33
|
+
private LanguageServerLoadingHandler: LanguageServerLoadingHandler,
|
|
34
|
+
private config: WorkspaceConfig,
|
|
35
|
+
) {}
|
|
36
|
+
|
|
37
|
+
onDiagnostics(handler: NotificationHandler<PublishDiagnosticsParams>) {
|
|
38
|
+
this._onDiagnostics = handler;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
onDecorations(handler: NotificationHandler<EngineDecoration[]>) {
|
|
42
|
+
this._onDecorations = handler;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
onSchemaTags(handler: NotificationHandler<[ServiceID, SchemaTag[]]>) {
|
|
46
|
+
this._onSchemaTags = handler;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
onConfigFilesFound(handler: NotificationHandler<(ApolloConfig | Error)[]>) {
|
|
50
|
+
this._onConfigFilesFound = handler;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private createProject({
|
|
54
|
+
config,
|
|
55
|
+
folder,
|
|
56
|
+
}: {
|
|
57
|
+
config: ApolloConfig;
|
|
58
|
+
folder: WorkspaceFolder;
|
|
59
|
+
}) {
|
|
60
|
+
const { clientIdentity } = this.config;
|
|
61
|
+
const project = isClientConfig(config)
|
|
62
|
+
? new GraphQLClientProject({
|
|
63
|
+
config,
|
|
64
|
+
loadingHandler: this.LanguageServerLoadingHandler,
|
|
65
|
+
configFolderURI: URI.parse(folder.uri),
|
|
66
|
+
clientIdentity,
|
|
67
|
+
})
|
|
68
|
+
: (() => {
|
|
69
|
+
throw new Error("TODO rover project");
|
|
70
|
+
})();
|
|
71
|
+
|
|
72
|
+
project.onDiagnostics((params) => {
|
|
73
|
+
this._onDiagnostics && this._onDiagnostics(params);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
if (isClientProject(project)) {
|
|
77
|
+
project.onDecorations((params) => {
|
|
78
|
+
this._onDecorations && this._onDecorations(params);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
project.onSchemaTags((tags) => {
|
|
82
|
+
this._onSchemaTags && this._onSchemaTags(tags);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// after a project has loaded, we do an initial validation to surface errors
|
|
87
|
+
// on the start of the language server. Instead of doing this in the
|
|
88
|
+
// base class which is used by codegen and other tools
|
|
89
|
+
project.whenReady.then(() => project.validate());
|
|
90
|
+
|
|
91
|
+
return project;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async addProjectsInFolder(folder: WorkspaceFolder) {
|
|
95
|
+
// load all possible workspace projects (contains possible config)
|
|
96
|
+
// see if we can move this detection to cosmiconfig
|
|
97
|
+
/*
|
|
98
|
+
|
|
99
|
+
- monorepo (GraphQLWorkspace) as WorkspaceFolder
|
|
100
|
+
-- engine-api (GraphQLProject)
|
|
101
|
+
-- engine-frontend (GraphQLProject)
|
|
102
|
+
|
|
103
|
+
OR
|
|
104
|
+
|
|
105
|
+
- vscode workspace (fullstack)
|
|
106
|
+
-- ~/:user/client (GraphQLProject) as WorkspaceFolder
|
|
107
|
+
-- ~/:user/server (GraphQLProject) as WorkspaceFolder
|
|
108
|
+
|
|
109
|
+
*/
|
|
110
|
+
const apolloConfigFiles: string[] = globSync(
|
|
111
|
+
"**/apollo.config.@(js|ts|cjs|mjs)",
|
|
112
|
+
{
|
|
113
|
+
cwd: URI.parse(folder.uri).fsPath,
|
|
114
|
+
absolute: true,
|
|
115
|
+
ignore: "**/node_modules/**",
|
|
116
|
+
},
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
// only have unique possible folders
|
|
120
|
+
const apolloConfigFolders = new Set<string>(apolloConfigFiles.map(dirname));
|
|
121
|
+
|
|
122
|
+
// go from possible folders to known array of configs
|
|
123
|
+
let foundConfigs: (ApolloConfig | Error)[] = [];
|
|
124
|
+
|
|
125
|
+
const projectConfigs = Array.from(apolloConfigFolders).map((configFolder) =>
|
|
126
|
+
loadConfig({ configPath: configFolder })
|
|
127
|
+
.then((config) => {
|
|
128
|
+
if (config) {
|
|
129
|
+
foundConfigs.push(config);
|
|
130
|
+
const projectForConfig = this.createProject({ config, folder });
|
|
131
|
+
|
|
132
|
+
const existingProjects =
|
|
133
|
+
this.projectsByFolderUri.get(folder.uri) || [];
|
|
134
|
+
|
|
135
|
+
this.projectsByFolderUri.set(folder.uri, [
|
|
136
|
+
...existingProjects,
|
|
137
|
+
projectForConfig,
|
|
138
|
+
]);
|
|
139
|
+
} else {
|
|
140
|
+
Debug.error(
|
|
141
|
+
`Workspace failed to load config from: ${configFolder}/`,
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
})
|
|
145
|
+
.catch((error) => foundConfigs.push(error)),
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
await Promise.all(projectConfigs);
|
|
149
|
+
|
|
150
|
+
if (this._onConfigFilesFound) {
|
|
151
|
+
this._onConfigFilesFound(foundConfigs);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
reloadService() {
|
|
156
|
+
this._projectForFileCache.clear();
|
|
157
|
+
this.projectsByFolderUri.forEach((projects, uri) => {
|
|
158
|
+
this.projectsByFolderUri.set(
|
|
159
|
+
uri,
|
|
160
|
+
projects.map((project) => {
|
|
161
|
+
project.clearAllDiagnostics();
|
|
162
|
+
return this.createProject({
|
|
163
|
+
config: project.config,
|
|
164
|
+
folder: { uri } as WorkspaceFolder,
|
|
165
|
+
});
|
|
166
|
+
}),
|
|
167
|
+
);
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
async reloadProjectForConfig(configUri: DocumentUri) {
|
|
172
|
+
const configPath = dirname(URI.parse(configUri).fsPath);
|
|
173
|
+
let config: ApolloConfig | null;
|
|
174
|
+
let error;
|
|
175
|
+
try {
|
|
176
|
+
config = await loadConfig({ configPath });
|
|
177
|
+
} catch (e: any) {
|
|
178
|
+
config = null;
|
|
179
|
+
error = e;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const project = this.projectForFile(configUri);
|
|
183
|
+
|
|
184
|
+
if (this._onConfigFilesFound) {
|
|
185
|
+
this._onConfigFilesFound([config || error]);
|
|
186
|
+
}
|
|
187
|
+
// If project exists, update the config
|
|
188
|
+
if (project && config) {
|
|
189
|
+
if (equal(project.config.rawConfig, config.rawConfig)) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
await Promise.all(project.updateConfig(config));
|
|
193
|
+
this.reloadService();
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// If project doesn't exist (new config file), create the project and add to workspace
|
|
197
|
+
if (!project && config) {
|
|
198
|
+
const folderUri = URI.file(configPath).toString();
|
|
199
|
+
|
|
200
|
+
const newProject = this.createProject({
|
|
201
|
+
config,
|
|
202
|
+
folder: { uri: folderUri } as WorkspaceFolder,
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
const existingProjects = this.projectsByFolderUri.get(folderUri) || [];
|
|
206
|
+
this.projectsByFolderUri.set(folderUri, [
|
|
207
|
+
...existingProjects,
|
|
208
|
+
newProject,
|
|
209
|
+
]);
|
|
210
|
+
this.reloadService();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
updateSchemaTag(selection: QuickPickItem) {
|
|
215
|
+
const serviceID = selection.detail;
|
|
216
|
+
if (!serviceID) return;
|
|
217
|
+
|
|
218
|
+
this.projectsByFolderUri.forEach((projects) => {
|
|
219
|
+
projects.forEach((project) => {
|
|
220
|
+
if (isClientProject(project) && project.serviceID === serviceID) {
|
|
221
|
+
project.updateSchemaTag(selection.label);
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
removeProjectsInFolder(folder: WorkspaceFolder) {
|
|
228
|
+
const projects = this.projectsByFolderUri.get(folder.uri);
|
|
229
|
+
if (projects) {
|
|
230
|
+
projects.forEach((project) => project.clearAllDiagnostics());
|
|
231
|
+
this.projectsByFolderUri.delete(folder.uri);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
get projects(): GraphQLProject[] {
|
|
236
|
+
return Array.from(this.projectsByFolderUri.values()).flat();
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
projectForFile(uri: DocumentUri): GraphQLProject | undefined {
|
|
240
|
+
const cachedResult = this._projectForFileCache.get(uri);
|
|
241
|
+
if (cachedResult) {
|
|
242
|
+
return cachedResult;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
for (const projects of this.projectsByFolderUri.values()) {
|
|
246
|
+
const project = projects.find((project) => project.includesFile(uri));
|
|
247
|
+
if (project) {
|
|
248
|
+
this._projectForFileCache.set(uri, project);
|
|
249
|
+
return project;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return undefined;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
@@ -2,26 +2,27 @@ import {
|
|
|
2
2
|
ServerOptions,
|
|
3
3
|
TransportKind,
|
|
4
4
|
LanguageClientOptions,
|
|
5
|
-
LanguageClient
|
|
6
|
-
|
|
5
|
+
LanguageClient,
|
|
6
|
+
RevealOutputChannelOn,
|
|
7
|
+
} from "vscode-languageclient/node";
|
|
7
8
|
import { workspace, OutputChannel } from "vscode";
|
|
8
9
|
|
|
9
10
|
const { version, referenceID } = require("../package.json");
|
|
10
11
|
|
|
11
12
|
export function getLanguageServerClient(
|
|
12
13
|
serverModule: string,
|
|
13
|
-
outputChannel: OutputChannel
|
|
14
|
+
outputChannel: OutputChannel,
|
|
14
15
|
) {
|
|
15
16
|
const env = {
|
|
16
17
|
APOLLO_CLIENT_NAME: "Apollo VS Code",
|
|
17
18
|
APOLLO_CLIENT_VERSION: version,
|
|
18
19
|
APOLLO_CLIENT_REFERENCE_ID: referenceID,
|
|
19
|
-
NODE_TLS_REJECT_UNAUTHORIZED: 0
|
|
20
|
+
NODE_TLS_REJECT_UNAUTHORIZED: 0,
|
|
20
21
|
};
|
|
21
22
|
|
|
22
23
|
const debugOptions = {
|
|
23
24
|
execArgv: ["--nolazy", "--inspect=6009"],
|
|
24
|
-
env
|
|
25
|
+
env,
|
|
25
26
|
};
|
|
26
27
|
|
|
27
28
|
const serverOptions: ServerOptions = {
|
|
@@ -29,14 +30,14 @@ export function getLanguageServerClient(
|
|
|
29
30
|
module: serverModule,
|
|
30
31
|
transport: TransportKind.ipc,
|
|
31
32
|
options: {
|
|
32
|
-
env
|
|
33
|
-
}
|
|
33
|
+
env,
|
|
34
|
+
},
|
|
34
35
|
},
|
|
35
36
|
debug: {
|
|
36
37
|
module: serverModule,
|
|
37
38
|
transport: TransportKind.ipc,
|
|
38
|
-
options: debugOptions
|
|
39
|
-
}
|
|
39
|
+
options: debugOptions,
|
|
40
|
+
},
|
|
40
41
|
};
|
|
41
42
|
|
|
42
43
|
const clientOptions: LanguageClientOptions = {
|
|
@@ -47,27 +48,33 @@ export function getLanguageServerClient(
|
|
|
47
48
|
"javascriptreact",
|
|
48
49
|
"typescriptreact",
|
|
49
50
|
"vue",
|
|
51
|
+
"svelte",
|
|
50
52
|
"python",
|
|
51
53
|
"ruby",
|
|
52
54
|
"dart",
|
|
53
55
|
"reason",
|
|
54
|
-
"elixir"
|
|
56
|
+
"elixir",
|
|
55
57
|
],
|
|
56
58
|
synchronize: {
|
|
57
59
|
fileEvents: [
|
|
58
60
|
workspace.createFileSystemWatcher("**/.env?(.local)"),
|
|
59
61
|
workspace.createFileSystemWatcher(
|
|
60
|
-
"**/*.{graphql,js,ts,jsx,tsx,vue,py,rb,dart,re,ex,exs}"
|
|
61
|
-
)
|
|
62
|
-
]
|
|
62
|
+
"**/*.{graphql,js,ts,cjs,mjs,jsx,tsx,vue,svelte,py,rb,dart,re,ex,exs}",
|
|
63
|
+
),
|
|
64
|
+
],
|
|
63
65
|
},
|
|
64
|
-
outputChannel
|
|
66
|
+
outputChannel,
|
|
67
|
+
revealOutputChannelOn: workspace
|
|
68
|
+
.getConfiguration("apollographql")
|
|
69
|
+
.get("debug.revealOutputOnLanguageServerError")
|
|
70
|
+
? RevealOutputChannelOn.Error
|
|
71
|
+
: RevealOutputChannelOn.Never,
|
|
65
72
|
};
|
|
66
73
|
|
|
67
74
|
return new LanguageClient(
|
|
68
75
|
"apollographql",
|
|
69
76
|
"Apollo GraphQL",
|
|
70
77
|
serverOptions,
|
|
71
|
-
clientOptions
|
|
78
|
+
clientOptions,
|
|
72
79
|
);
|
|
73
80
|
}
|
package/src/messages.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { QuickPickItem } from "vscode";
|
|
2
|
+
import { NotificationType, RequestType } from "vscode-jsonrpc";
|
|
3
|
+
import { Range } from "vscode-languageclient/node";
|
|
4
|
+
|
|
5
|
+
export interface TypeStats {
|
|
6
|
+
service?: number;
|
|
7
|
+
client?: number;
|
|
8
|
+
total?: number;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export type ProjectStats =
|
|
12
|
+
| {
|
|
13
|
+
type: string;
|
|
14
|
+
loaded: true;
|
|
15
|
+
serviceId?: string;
|
|
16
|
+
types?: TypeStats;
|
|
17
|
+
tag?: string;
|
|
18
|
+
lastFetch?: number;
|
|
19
|
+
}
|
|
20
|
+
| { loaded: false };
|
|
21
|
+
|
|
22
|
+
export type EngineDecoration =
|
|
23
|
+
| {
|
|
24
|
+
type: "text";
|
|
25
|
+
document: string;
|
|
26
|
+
message: string;
|
|
27
|
+
range: Range;
|
|
28
|
+
}
|
|
29
|
+
| {
|
|
30
|
+
type: "runGlyph";
|
|
31
|
+
document: string;
|
|
32
|
+
range: Range;
|
|
33
|
+
hoverMessage: string;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export const LanguageServerRequests = {
|
|
37
|
+
FileStats: new RequestType<{ uri: string }, ProjectStats, unknown>(
|
|
38
|
+
"apollographql/fileStats",
|
|
39
|
+
),
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Notifications sent to the language server
|
|
44
|
+
*/
|
|
45
|
+
export const LanguageServerCommands = {
|
|
46
|
+
GetStats: new NotificationType<{ uri: string }>("apollographql/getStats"),
|
|
47
|
+
ReloadService: new NotificationType<void>("apollographql/reloadService"),
|
|
48
|
+
TagSelected: new NotificationType<QuickPickItem>("apollographql/tagSelected"),
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Notifications sent from the language server
|
|
53
|
+
*/
|
|
54
|
+
export const LanguageServerNotifications = {
|
|
55
|
+
StatsLoaded: new NotificationType<ProjectStats>("apollographql/statsLoaded"),
|
|
56
|
+
ConfigFilesFound: new NotificationType<string>(
|
|
57
|
+
"apollographql/configFilesFound",
|
|
58
|
+
),
|
|
59
|
+
TagsLoaded: new NotificationType<string>("apollographql/tagsLoaded"),
|
|
60
|
+
LoadingComplete: new NotificationType<number>(
|
|
61
|
+
"apollographql/loadingComplete",
|
|
62
|
+
),
|
|
63
|
+
Loading: new NotificationType<{
|
|
64
|
+
message: string;
|
|
65
|
+
token: number;
|
|
66
|
+
}>("apollographql/loading"),
|
|
67
|
+
EngineDecorations: new NotificationType<{
|
|
68
|
+
decorations: EngineDecoration[];
|
|
69
|
+
}>("apollographql/engineDecorations"),
|
|
70
|
+
ServerDebugMessage: new NotificationType<{
|
|
71
|
+
type: "info" | "warning" | "error" | "errorTelemetry";
|
|
72
|
+
message: string;
|
|
73
|
+
stack?: string;
|
|
74
|
+
}>("serverDebugMessage"),
|
|
75
|
+
};
|
package/src/statusBar.ts
CHANGED
|
@@ -24,7 +24,7 @@ export default class ApolloStatusBar {
|
|
|
24
24
|
protected changeState({
|
|
25
25
|
hasActiveTextEditor,
|
|
26
26
|
text,
|
|
27
|
-
tooltip
|
|
27
|
+
tooltip,
|
|
28
28
|
}: StateChangeInput) {
|
|
29
29
|
if (!hasActiveTextEditor) {
|
|
30
30
|
this.statusBarItem.hide();
|
|
@@ -39,25 +39,25 @@ export default class ApolloStatusBar {
|
|
|
39
39
|
public showLoadingState({ hasActiveTextEditor }: LoadingInput) {
|
|
40
40
|
this.changeState({
|
|
41
41
|
hasActiveTextEditor,
|
|
42
|
-
text: ApolloStatusBar.loadingStateText
|
|
42
|
+
text: ApolloStatusBar.loadingStateText,
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
public showLoadedState({ hasActiveTextEditor }: LoadingInput) {
|
|
47
47
|
this.changeState({
|
|
48
48
|
hasActiveTextEditor,
|
|
49
|
-
text: ApolloStatusBar.loadedStateText
|
|
49
|
+
text: ApolloStatusBar.loadedStateText,
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
public showWarningState({
|
|
54
54
|
hasActiveTextEditor,
|
|
55
|
-
tooltip
|
|
55
|
+
tooltip,
|
|
56
56
|
}: LoadingInput & { tooltip: string }) {
|
|
57
57
|
this.changeState({
|
|
58
58
|
hasActiveTextEditor,
|
|
59
59
|
text: ApolloStatusBar.warningText,
|
|
60
|
-
tooltip
|
|
60
|
+
tooltip,
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
63
|
|