vscode-apollo 1.19.3 → 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,262 @@
|
|
|
1
|
+
import {
|
|
2
|
+
WorkspaceFolder,
|
|
3
|
+
NotificationHandler,
|
|
4
|
+
PublishDiagnosticsParams,
|
|
5
|
+
} from "vscode-languageserver";
|
|
6
|
+
import { QuickPickItem } from "vscode";
|
|
7
|
+
import { GraphQLProject, DocumentUri } from "./project/base";
|
|
8
|
+
import { dirname } from "path";
|
|
9
|
+
import fg from "glob";
|
|
10
|
+
import {
|
|
11
|
+
loadConfig,
|
|
12
|
+
ApolloConfig,
|
|
13
|
+
isClientConfig,
|
|
14
|
+
ServiceConfig,
|
|
15
|
+
} from "./config";
|
|
16
|
+
import { LanguageServerLoadingHandler } from "./loadingHandler";
|
|
17
|
+
import { ServiceID, SchemaTag, ClientIdentity } from "./engine";
|
|
18
|
+
import { GraphQLClientProject, isClientProject } from "./project/client";
|
|
19
|
+
import { GraphQLServiceProject } from "./project/service";
|
|
20
|
+
import URI from "vscode-uri";
|
|
21
|
+
import { Debug } from "./utilities";
|
|
22
|
+
import type { EngineDecoration } from "src/messages";
|
|
23
|
+
|
|
24
|
+
export interface WorkspaceConfig {
|
|
25
|
+
clientIdentity?: ClientIdentity;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export class GraphQLWorkspace {
|
|
29
|
+
private _onDiagnostics?: NotificationHandler<PublishDiagnosticsParams>;
|
|
30
|
+
private _onDecorations?: NotificationHandler<EngineDecoration[]>;
|
|
31
|
+
private _onSchemaTags?: NotificationHandler<[ServiceID, SchemaTag[]]>;
|
|
32
|
+
private _onConfigFilesFound?: NotificationHandler<ApolloConfig[]>;
|
|
33
|
+
private _projectForFileCache: Map<string, GraphQLProject> = new Map();
|
|
34
|
+
|
|
35
|
+
private projectsByFolderUri: Map<string, GraphQLProject[]> = new Map();
|
|
36
|
+
|
|
37
|
+
constructor(
|
|
38
|
+
private LanguageServerLoadingHandler: LanguageServerLoadingHandler,
|
|
39
|
+
private config: WorkspaceConfig
|
|
40
|
+
) {}
|
|
41
|
+
|
|
42
|
+
onDiagnostics(handler: NotificationHandler<PublishDiagnosticsParams>) {
|
|
43
|
+
this._onDiagnostics = handler;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
onDecorations(handler: NotificationHandler<EngineDecoration[]>) {
|
|
47
|
+
this._onDecorations = handler;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
onSchemaTags(handler: NotificationHandler<[ServiceID, SchemaTag[]]>) {
|
|
51
|
+
this._onSchemaTags = handler;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
onConfigFilesFound(handler: NotificationHandler<ApolloConfig[]>) {
|
|
55
|
+
this._onConfigFilesFound = handler;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private createProject({
|
|
59
|
+
config,
|
|
60
|
+
folder,
|
|
61
|
+
}: {
|
|
62
|
+
config: ApolloConfig;
|
|
63
|
+
folder: WorkspaceFolder;
|
|
64
|
+
}) {
|
|
65
|
+
const { clientIdentity } = this.config;
|
|
66
|
+
const project = isClientConfig(config)
|
|
67
|
+
? new GraphQLClientProject({
|
|
68
|
+
config,
|
|
69
|
+
loadingHandler: this.LanguageServerLoadingHandler,
|
|
70
|
+
configFolderURI: URI.parse(folder.uri),
|
|
71
|
+
clientIdentity,
|
|
72
|
+
})
|
|
73
|
+
: new GraphQLServiceProject({
|
|
74
|
+
config: config as ServiceConfig,
|
|
75
|
+
loadingHandler: this.LanguageServerLoadingHandler,
|
|
76
|
+
configFolderURI: URI.parse(folder.uri),
|
|
77
|
+
clientIdentity,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
project.onDiagnostics((params) => {
|
|
81
|
+
this._onDiagnostics && this._onDiagnostics(params);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
if (isClientProject(project)) {
|
|
85
|
+
project.onDecorations((params) => {
|
|
86
|
+
this._onDecorations && this._onDecorations(params);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
project.onSchemaTags((tags) => {
|
|
90
|
+
this._onSchemaTags && this._onSchemaTags(tags);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// after a project has loaded, we do an initial validation to surface errors
|
|
95
|
+
// on the start of the language server. Instead of doing this in the
|
|
96
|
+
// base class which is used by codegen and other tools
|
|
97
|
+
project.whenReady.then(() => project.validate());
|
|
98
|
+
|
|
99
|
+
return project;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async addProjectsInFolder(folder: WorkspaceFolder) {
|
|
103
|
+
// load all possible workspace projects (contains possible config)
|
|
104
|
+
// see if we can move this detection to cosmiconfig
|
|
105
|
+
/*
|
|
106
|
+
|
|
107
|
+
- monorepo (GraphQLWorkspace) as WorkspaceFolder
|
|
108
|
+
-- engine-api (GraphQLProject)
|
|
109
|
+
-- engine-frontend (GraphQLProject)
|
|
110
|
+
|
|
111
|
+
OR
|
|
112
|
+
|
|
113
|
+
- vscode workspace (fullstack)
|
|
114
|
+
-- ~/:user/client (GraphQLProject) as WorkspaceFolder
|
|
115
|
+
-- ~/:user/server (GraphQLProject) as WorkspaceFolder
|
|
116
|
+
|
|
117
|
+
*/
|
|
118
|
+
const apolloConfigFiles: string[] = fg.sync(
|
|
119
|
+
"**/apollo.config.@(js|ts|cjs)",
|
|
120
|
+
{
|
|
121
|
+
cwd: URI.parse(folder.uri).fsPath,
|
|
122
|
+
absolute: true,
|
|
123
|
+
ignore: "**/node_modules/**",
|
|
124
|
+
}
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
// only have unique possible folders
|
|
128
|
+
const apolloConfigFolders = new Set<string>(apolloConfigFiles.map(dirname));
|
|
129
|
+
|
|
130
|
+
// go from possible folders to known array of configs
|
|
131
|
+
let foundConfigs: ApolloConfig[] = [];
|
|
132
|
+
|
|
133
|
+
const projectConfigs = Array.from(apolloConfigFolders).map((configFolder) =>
|
|
134
|
+
loadConfig({ configPath: configFolder, requireConfig: true })
|
|
135
|
+
.then((config) => {
|
|
136
|
+
if (config) {
|
|
137
|
+
foundConfigs.push(config);
|
|
138
|
+
const projectsForConfig = config.projects.map((projectConfig) =>
|
|
139
|
+
this.createProject({ config, folder })
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
const existingProjects =
|
|
143
|
+
this.projectsByFolderUri.get(folder.uri) || [];
|
|
144
|
+
|
|
145
|
+
this.projectsByFolderUri.set(folder.uri, [
|
|
146
|
+
...existingProjects,
|
|
147
|
+
...projectsForConfig,
|
|
148
|
+
]);
|
|
149
|
+
} else {
|
|
150
|
+
Debug.error(
|
|
151
|
+
`Workspace failed to load config from: ${configFolder}/`
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
})
|
|
155
|
+
.catch((error) => Debug.error(error))
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
await Promise.all(projectConfigs);
|
|
159
|
+
|
|
160
|
+
if (this._onConfigFilesFound) {
|
|
161
|
+
this._onConfigFilesFound(foundConfigs);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
reloadService() {
|
|
166
|
+
this._projectForFileCache.clear();
|
|
167
|
+
this.projectsByFolderUri.forEach((projects, uri) => {
|
|
168
|
+
this.projectsByFolderUri.set(
|
|
169
|
+
uri,
|
|
170
|
+
projects.map((project) => {
|
|
171
|
+
project.clearAllDiagnostics();
|
|
172
|
+
return this.createProject({
|
|
173
|
+
config: project.config,
|
|
174
|
+
folder: { uri } as WorkspaceFolder,
|
|
175
|
+
});
|
|
176
|
+
})
|
|
177
|
+
);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
async reloadProjectForConfig(configUri: DocumentUri) {
|
|
182
|
+
const configPath = dirname(URI.parse(configUri).fsPath);
|
|
183
|
+
|
|
184
|
+
let config: ApolloConfig | null;
|
|
185
|
+
let error;
|
|
186
|
+
try {
|
|
187
|
+
config = await loadConfig({ configPath, requireConfig: true });
|
|
188
|
+
} catch (e: any) {
|
|
189
|
+
config = null;
|
|
190
|
+
error = e;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const project = this.projectForFile(configUri);
|
|
194
|
+
|
|
195
|
+
if (!config && this._onConfigFilesFound) {
|
|
196
|
+
this._onConfigFilesFound(error);
|
|
197
|
+
}
|
|
198
|
+
// If project exists, update the config
|
|
199
|
+
if (project && config) {
|
|
200
|
+
await Promise.all(project.updateConfig(config));
|
|
201
|
+
this.reloadService();
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// If project doesn't exist (new config file), create the project and add to workspace
|
|
205
|
+
if (!project && config) {
|
|
206
|
+
const folderUri = URI.file(configPath).toString();
|
|
207
|
+
|
|
208
|
+
const newProject = this.createProject({
|
|
209
|
+
config,
|
|
210
|
+
folder: { uri: folderUri } as WorkspaceFolder,
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
const existingProjects = this.projectsByFolderUri.get(folderUri) || [];
|
|
214
|
+
this.projectsByFolderUri.set(folderUri, [
|
|
215
|
+
...existingProjects,
|
|
216
|
+
newProject,
|
|
217
|
+
]);
|
|
218
|
+
this.reloadService();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
updateSchemaTag(selection: QuickPickItem) {
|
|
223
|
+
const serviceID = selection.detail;
|
|
224
|
+
if (!serviceID) return;
|
|
225
|
+
|
|
226
|
+
this.projectsByFolderUri.forEach((projects) => {
|
|
227
|
+
projects.forEach((project) => {
|
|
228
|
+
if (isClientProject(project) && project.serviceID === serviceID) {
|
|
229
|
+
project.updateSchemaTag(selection.label);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
removeProjectsInFolder(folder: WorkspaceFolder) {
|
|
236
|
+
const projects = this.projectsByFolderUri.get(folder.uri);
|
|
237
|
+
if (projects) {
|
|
238
|
+
projects.forEach((project) => project.clearAllDiagnostics());
|
|
239
|
+
this.projectsByFolderUri.delete(folder.uri);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
get projects(): GraphQLProject[] {
|
|
244
|
+
return Array.from(this.projectsByFolderUri.values()).flat();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
projectForFile(uri: DocumentUri): GraphQLProject | undefined {
|
|
248
|
+
const cachedResult = this._projectForFileCache.get(uri);
|
|
249
|
+
if (cachedResult) {
|
|
250
|
+
return cachedResult;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
for (const projects of this.projectsByFolderUri.values()) {
|
|
254
|
+
const project = projects.find((project) => project.includesFile(uri));
|
|
255
|
+
if (project) {
|
|
256
|
+
this._projectForFileCache.set(uri, project);
|
|
257
|
+
return project;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return undefined;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
@@ -2,7 +2,8 @@ import {
|
|
|
2
2
|
ServerOptions,
|
|
3
3
|
TransportKind,
|
|
4
4
|
LanguageClientOptions,
|
|
5
|
-
LanguageClient
|
|
5
|
+
LanguageClient,
|
|
6
|
+
RevealOutputChannelOn,
|
|
6
7
|
} from "vscode-languageclient";
|
|
7
8
|
import { workspace, OutputChannel } from "vscode";
|
|
8
9
|
|
|
@@ -16,12 +17,12 @@ export function getLanguageServerClient(
|
|
|
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,21 +48,27 @@ 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,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(
|
package/src/messages.ts
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { MarkdownString } from "vscode";
|
|
2
|
+
import type {
|
|
3
|
+
LanguageClient as GenericLanguageClient,
|
|
4
|
+
NotificationHandler,
|
|
5
|
+
NotificationHandler0,
|
|
6
|
+
NotificationType,
|
|
7
|
+
NotificationType0,
|
|
8
|
+
Range,
|
|
9
|
+
} from "vscode-languageclient";
|
|
10
|
+
import type { IConnection as GenericConnection } from "vscode-languageserver";
|
|
11
|
+
|
|
12
|
+
export interface TypeStats {
|
|
13
|
+
service?: number;
|
|
14
|
+
client?: number;
|
|
15
|
+
total?: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export type ProjectStats =
|
|
19
|
+
| {
|
|
20
|
+
type: string;
|
|
21
|
+
loaded: true;
|
|
22
|
+
serviceId?: string;
|
|
23
|
+
types?: TypeStats;
|
|
24
|
+
tag?: string;
|
|
25
|
+
lastFetch?: number;
|
|
26
|
+
}
|
|
27
|
+
| { loaded: false };
|
|
28
|
+
|
|
29
|
+
export type EngineDecoration =
|
|
30
|
+
| {
|
|
31
|
+
type: "text";
|
|
32
|
+
document: string;
|
|
33
|
+
message: string;
|
|
34
|
+
range: Range;
|
|
35
|
+
}
|
|
36
|
+
| {
|
|
37
|
+
type: "runGlyph";
|
|
38
|
+
document: string;
|
|
39
|
+
range: Range;
|
|
40
|
+
hoverMessage: string;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
type Messages = {
|
|
44
|
+
"apollographql/statsLoaded": ProjectStats;
|
|
45
|
+
"apollographql/configFilesFound": string;
|
|
46
|
+
"apollographql/tagsLoaded": string;
|
|
47
|
+
"apollographql/loadingComplete": number;
|
|
48
|
+
"apollographql/loading": { message: string; token: number };
|
|
49
|
+
"apollographql/engineDecorations": { decorations: EngineDecoration[] };
|
|
50
|
+
serverDebugMessage: {
|
|
51
|
+
type: "info" | "warning" | "error" | "errorTelemetry";
|
|
52
|
+
message: string;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export type LanguageClient = Omit<GenericLanguageClient, "onNotification"> & {
|
|
57
|
+
// Don't allow passing of generic string messages, restrict to only those
|
|
58
|
+
// listed in the Message type
|
|
59
|
+
onNotification<MessageType extends keyof Messages>(
|
|
60
|
+
messageType: MessageType,
|
|
61
|
+
handler: (value: Messages[MessageType]) => void
|
|
62
|
+
): void;
|
|
63
|
+
// Allow other notification types
|
|
64
|
+
onNotification<RO>(
|
|
65
|
+
type: NotificationType0<RO>,
|
|
66
|
+
handler: NotificationHandler0
|
|
67
|
+
): void;
|
|
68
|
+
onNotification<P, RO>(
|
|
69
|
+
type: NotificationType<P, RO>,
|
|
70
|
+
handler: NotificationHandler<P>
|
|
71
|
+
): void;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export type Connection = Omit<GenericConnection, "sendNotification"> & {
|
|
75
|
+
// Don't allow passing of generic string messages, restrict to only those
|
|
76
|
+
// listed in the Message type
|
|
77
|
+
sendNotification<MessageType extends keyof Messages>(
|
|
78
|
+
messageType: MessageType,
|
|
79
|
+
value: Messages[MessageType]
|
|
80
|
+
): void;
|
|
81
|
+
// Allow other notification types
|
|
82
|
+
sendNotification<RO>(type: NotificationType0<RO>): void;
|
|
83
|
+
sendNotification<P, RO>(type: NotificationType<P, RO>, params: P): void;
|
|
84
|
+
};
|
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
|
|