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.
Files changed (179) hide show
  1. package/.changeset/README.md +8 -0
  2. package/.changeset/config.json +14 -0
  3. package/.circleci/config.yml +91 -0
  4. package/.eslintrc.js +10 -0
  5. package/.git-blame-ignore-revs +2 -0
  6. package/.gitattributes +1 -0
  7. package/.github/workflows/release.yml +95 -0
  8. package/.gitleaks.toml +26 -0
  9. package/.nvmrc +1 -0
  10. package/.prettierrc +5 -0
  11. package/.vscode/launch.json +66 -0
  12. package/.vscode/settings.json +16 -0
  13. package/.vscode/tasks.json +60 -0
  14. package/.vscodeignore +28 -1
  15. package/CHANGELOG.md +250 -1
  16. package/CODEOWNERS +4 -0
  17. package/LICENSE +2 -2
  18. package/README.md +104 -55
  19. package/codegen.yml +12 -0
  20. package/graphql.configuration.json +5 -1
  21. package/images/IconRun.svg +8 -0
  22. package/images/marketplace/apollo-wordmark.png +0 -0
  23. package/jest.config.ts +21 -0
  24. package/jest.e2e.config.js +17 -0
  25. package/package.json +102 -23
  26. package/renovate.json +30 -0
  27. package/sampleWorkspace/clientSchema/apollo.config.cjs +10 -0
  28. package/sampleWorkspace/clientSchema/src/clientSchema.js +16 -0
  29. package/sampleWorkspace/clientSchema/src/test.js +18 -0
  30. package/sampleWorkspace/fixtures/starwarsSchema.graphql +299 -0
  31. package/sampleWorkspace/httpSchema/apollo.config.ts +8 -0
  32. package/sampleWorkspace/httpSchema/src/test.js +9 -0
  33. package/sampleWorkspace/localSchema/apollo.config.js +8 -0
  34. package/sampleWorkspace/localSchema/src/test.js +8 -0
  35. package/sampleWorkspace/localSchemaArray/apollo.config.js +12 -0
  36. package/sampleWorkspace/localSchemaArray/planets.graphql +20 -0
  37. package/sampleWorkspace/localSchemaArray/src/test.js +12 -0
  38. package/sampleWorkspace/sampleWorkspace.code-workspace +20 -0
  39. package/sampleWorkspace/spotifyGraph/apollo.config.mjs +5 -0
  40. package/sampleWorkspace/spotifyGraph/src/test.js +11 -0
  41. package/src/__e2e__/mockServer.js +117 -0
  42. package/src/__e2e__/mocks.js +13094 -0
  43. package/src/__e2e__/run.js +23 -0
  44. package/src/__e2e__/runTests.js +44 -0
  45. package/src/__e2e__/setup.js +1 -0
  46. package/src/__e2e__/vscode-environment.js +16 -0
  47. package/src/__e2e__/vscode.js +1 -0
  48. package/src/__mocks__/fs.js +3 -0
  49. package/src/__tests__/statusBar.test.ts +8 -7
  50. package/src/build.js +57 -0
  51. package/src/debug.ts +2 -5
  52. package/src/env/index.ts +1 -0
  53. package/src/env/typescript-utility-types.ts +2 -0
  54. package/src/extension.ts +265 -170
  55. package/src/language-server/__e2e__/clientSchema.e2e.ts +147 -0
  56. package/src/language-server/__e2e__/httpSchema.e2e.ts +21 -0
  57. package/src/language-server/__e2e__/localSchema.e2e.ts +25 -0
  58. package/src/language-server/__e2e__/localSchemaArray.e2e.ts +31 -0
  59. package/src/language-server/__e2e__/studioGraph.e2e.ts +65 -0
  60. package/src/language-server/__e2e__/utils.ts +151 -0
  61. package/src/language-server/__tests__/diagnostics.test.ts +86 -0
  62. package/src/language-server/__tests__/document.test.ts +187 -0
  63. package/src/language-server/__tests__/fileSet.test.ts +46 -0
  64. package/src/language-server/__tests__/fixtures/starwarsSchema.ts +1917 -0
  65. package/src/language-server/config/__tests__/config.ts +54 -0
  66. package/src/language-server/config/__tests__/loadConfig.ts +384 -0
  67. package/src/language-server/config/__tests__/utils.ts +99 -0
  68. package/src/language-server/config/config.ts +284 -0
  69. package/src/language-server/config/index.ts +3 -0
  70. package/src/language-server/config/loadConfig.ts +101 -0
  71. package/src/language-server/config/utils.ts +45 -0
  72. package/src/language-server/diagnostics.ts +118 -0
  73. package/src/language-server/document.ts +277 -0
  74. package/src/language-server/engine/index.ts +123 -0
  75. package/src/language-server/engine/operations/frontendUrlRoot.ts +15 -0
  76. package/src/language-server/engine/operations/schemaTagsAndFieldStats.ts +32 -0
  77. package/src/language-server/errors/__tests__/NoMissingClientDirectives.test.ts +225 -0
  78. package/src/language-server/errors/logger.ts +58 -0
  79. package/src/language-server/errors/validation.ts +274 -0
  80. package/src/language-server/fileSet.ts +63 -0
  81. package/src/language-server/format.ts +48 -0
  82. package/src/language-server/graphqlTypes.ts +16741 -0
  83. package/src/language-server/index.ts +28 -0
  84. package/src/language-server/languageProvider.ts +795 -0
  85. package/src/language-server/loadingHandler.ts +47 -0
  86. package/src/language-server/project/base.ts +406 -0
  87. package/src/language-server/project/client.ts +568 -0
  88. package/src/language-server/project/defaultClientSchema.ts +70 -0
  89. package/src/language-server/providers/schema/__tests__/file.ts +191 -0
  90. package/src/language-server/providers/schema/base.ts +15 -0
  91. package/src/language-server/providers/schema/endpoint.ts +138 -0
  92. package/src/language-server/providers/schema/engine.ts +204 -0
  93. package/src/language-server/providers/schema/file.ts +176 -0
  94. package/src/language-server/providers/schema/index.ts +59 -0
  95. package/src/language-server/server.ts +274 -0
  96. package/src/language-server/typings/graphql.d.ts +27 -0
  97. package/src/language-server/utilities/__tests__/graphql.test.ts +399 -0
  98. package/src/language-server/utilities/__tests__/uri.ts +55 -0
  99. package/src/language-server/utilities/debouncer.ts +8 -0
  100. package/src/language-server/utilities/debug.ts +90 -0
  101. package/src/language-server/utilities/graphql.ts +433 -0
  102. package/src/language-server/utilities/index.ts +3 -0
  103. package/src/language-server/utilities/source.ts +182 -0
  104. package/src/language-server/utilities/uri.ts +19 -0
  105. package/src/language-server/workspace.ts +254 -0
  106. package/src/languageServerClient.ts +22 -15
  107. package/src/messages.ts +75 -0
  108. package/src/statusBar.ts +5 -5
  109. package/src/tools/__tests__/buildServiceDefinition.test.ts +491 -0
  110. package/src/tools/__tests__/snapshotSerializers/astSerializer.ts +19 -0
  111. package/src/tools/__tests__/snapshotSerializers/graphQLTypeSerializer.ts +14 -0
  112. package/src/tools/buildServiceDefinition.ts +241 -0
  113. package/src/tools/index.ts +6 -0
  114. package/src/tools/schema/index.ts +2 -0
  115. package/src/tools/schema/resolveObject.ts +18 -0
  116. package/src/tools/schema/resolverMap.ts +23 -0
  117. package/src/tools/utilities/graphql.ts +22 -0
  118. package/src/tools/utilities/index.ts +3 -0
  119. package/src/tools/utilities/invariant.ts +5 -0
  120. package/src/tools/utilities/predicates.ts +5 -0
  121. package/src/utils.ts +7 -21
  122. package/syntaxes/graphql.dart.json +2 -4
  123. package/syntaxes/graphql.ex.json +1 -4
  124. package/syntaxes/graphql.js.json +3 -3
  125. package/syntaxes/graphql.json +13 -9
  126. package/syntaxes/graphql.lua.json +51 -0
  127. package/syntaxes/graphql.rb.json +1 -1
  128. package/tsconfig.build.json +11 -0
  129. package/tsconfig.json +22 -7
  130. package/create-server-symlink.js +0 -8
  131. package/lib/debug.d.ts +0 -11
  132. package/lib/debug.d.ts.map +0 -1
  133. package/lib/debug.js +0 -48
  134. package/lib/debug.js.map +0 -1
  135. package/lib/extension.d.ts +0 -4
  136. package/lib/extension.d.ts.map +0 -1
  137. package/lib/extension.js +0 -187
  138. package/lib/extension.js.map +0 -1
  139. package/lib/languageServerClient.d.ts +0 -4
  140. package/lib/languageServerClient.d.ts.map +0 -1
  141. package/lib/languageServerClient.js +0 -57
  142. package/lib/languageServerClient.js.map +0 -1
  143. package/lib/statusBar.d.ts +0 -24
  144. package/lib/statusBar.d.ts.map +0 -1
  145. package/lib/statusBar.js +0 -46
  146. package/lib/statusBar.js.map +0 -1
  147. package/lib/testRunner/index.d.ts +0 -3
  148. package/lib/testRunner/index.d.ts.map +0 -1
  149. package/lib/testRunner/index.js +0 -49
  150. package/lib/testRunner/index.js.map +0 -1
  151. package/lib/testRunner/jest-config.d.ts +0 -14
  152. package/lib/testRunner/jest-config.d.ts.map +0 -1
  153. package/lib/testRunner/jest-config.js +0 -18
  154. package/lib/testRunner/jest-config.js.map +0 -1
  155. package/lib/testRunner/jest-vscode-environment.d.ts +0 -2
  156. package/lib/testRunner/jest-vscode-environment.d.ts.map +0 -1
  157. package/lib/testRunner/jest-vscode-environment.js +0 -19
  158. package/lib/testRunner/jest-vscode-environment.js.map +0 -1
  159. package/lib/testRunner/jest-vscode-framework-setup.d.ts +0 -1
  160. package/lib/testRunner/jest-vscode-framework-setup.d.ts.map +0 -1
  161. package/lib/testRunner/jest-vscode-framework-setup.js +0 -3
  162. package/lib/testRunner/jest-vscode-framework-setup.js.map +0 -1
  163. package/lib/testRunner/vscode-test-script.d.ts +0 -2
  164. package/lib/testRunner/vscode-test-script.d.ts.map +0 -1
  165. package/lib/testRunner/vscode-test-script.js +0 -23
  166. package/lib/testRunner/vscode-test-script.js.map +0 -1
  167. package/lib/utils.d.ts +0 -18
  168. package/lib/utils.d.ts.map +0 -1
  169. package/lib/utils.js +0 -52
  170. package/lib/utils.js.map +0 -1
  171. package/src/testRunner/README.md +0 -23
  172. package/src/testRunner/index.ts +0 -72
  173. package/src/testRunner/jest-config.ts +0 -17
  174. package/src/testRunner/jest-vscode-environment.ts +0 -25
  175. package/src/testRunner/jest-vscode-framework-setup.ts +0 -10
  176. package/src/testRunner/jest.d.ts +0 -37
  177. package/src/testRunner/vscode-test-script.ts +0 -38
  178. package/tsconfig.test.json +0 -4
  179. package/tsconfig.tsbuildinfo +0 -2486
@@ -0,0 +1,399 @@
1
+ import gql from "graphql-tag";
2
+ import { parse, print } from "graphql";
3
+ import {
4
+ withTypenameFieldAddedWhereNeeded,
5
+ removeDirectiveAnnotatedFields,
6
+ } from "../graphql";
7
+
8
+ describe("withTypenameFieldAddedWhereNeeded", () => {
9
+ it("properly adds __typename to each selectionSet", () => {
10
+ const query = gql`
11
+ query Product {
12
+ product {
13
+ sku
14
+ color {
15
+ id
16
+ value
17
+ }
18
+ }
19
+ }
20
+ `;
21
+
22
+ const withTypenames = withTypenameFieldAddedWhereNeeded(query);
23
+
24
+ expect(print(withTypenames)).toMatchInlineSnapshot(`
25
+ "query Product {
26
+ product {
27
+ __typename
28
+ sku
29
+ color {
30
+ __typename
31
+ id
32
+ value
33
+ }
34
+ }
35
+ }"
36
+ `);
37
+ });
38
+
39
+ it("adds __typename to InlineFragment nodes (as ApolloClient does)", () => {
40
+ const query = gql`
41
+ query CartItems {
42
+ product {
43
+ items {
44
+ ... on Table {
45
+ material
46
+ }
47
+ ... on Paint {
48
+ color
49
+ }
50
+ }
51
+ }
52
+ }
53
+ `;
54
+
55
+ const withTypenames = withTypenameFieldAddedWhereNeeded(query);
56
+
57
+ expect(print(withTypenames)).toMatchInlineSnapshot(`
58
+ "query CartItems {
59
+ product {
60
+ __typename
61
+ items {
62
+ __typename
63
+ ... on Table {
64
+ __typename
65
+ material
66
+ }
67
+ ... on Paint {
68
+ __typename
69
+ color
70
+ }
71
+ }
72
+ }
73
+ }"
74
+ `);
75
+ });
76
+ });
77
+
78
+ describe("removeDirectiveAnnotatedFields", () => {
79
+ it("should remove fields with matching directives", () => {
80
+ expect(
81
+ print(
82
+ removeDirectiveAnnotatedFields(
83
+ parse(`query Query { fieldToKeep fieldToRemove @client }`),
84
+ ["client"],
85
+ ),
86
+ ),
87
+ ).toMatchInlineSnapshot(`
88
+ "query Query {
89
+ fieldToKeep
90
+ }"
91
+ `);
92
+ });
93
+
94
+ it("trim selections sets that are client only", () => {
95
+ expect(
96
+ print(
97
+ removeDirectiveAnnotatedFields(
98
+ parse(`
99
+ query Query {
100
+ fieldToKeep
101
+ fieldToRemove @client {
102
+ childField
103
+ }
104
+ }
105
+ `),
106
+ ["client"],
107
+ ),
108
+ ),
109
+ ).toMatchInlineSnapshot(`
110
+ "query Query {
111
+ fieldToKeep
112
+ }"
113
+ `);
114
+ });
115
+
116
+ it("should remove fragments when a directive is used on a fragment spread", () => {
117
+ expect(
118
+ print(
119
+ removeDirectiveAnnotatedFields(
120
+ parse(`
121
+ {
122
+ me { name }
123
+ ...ClientFields @client
124
+ }
125
+ fragment ClientFields on Query {
126
+ hello
127
+ }
128
+ `),
129
+ ["client"],
130
+ ),
131
+ ),
132
+ ).toMatchInlineSnapshot(`
133
+ "{
134
+ me {
135
+ name
136
+ }
137
+ }"
138
+ `);
139
+ });
140
+
141
+ it("should remove fragments when client directive is used inline", () => {
142
+ expect(
143
+ print(
144
+ removeDirectiveAnnotatedFields(
145
+ parse(`
146
+ {
147
+ me { name }
148
+ ... on Query @client {
149
+ hello
150
+ }
151
+ }
152
+ `),
153
+ ["client"],
154
+ ),
155
+ ),
156
+ ).toMatchInlineSnapshot(`
157
+ "{
158
+ me {
159
+ name
160
+ }
161
+ }"
162
+ `);
163
+ });
164
+
165
+ it("should remove fragments when the client directive is on the definition", () => {
166
+ expect(
167
+ print(
168
+ removeDirectiveAnnotatedFields(
169
+ parse(`
170
+ fragment ClientObject on Query @client {
171
+ hello
172
+ }
173
+ {
174
+ me { name }
175
+ ... ClientObject
176
+ }
177
+ `),
178
+ ["client"],
179
+ ),
180
+ ),
181
+ ).toMatchInlineSnapshot(`
182
+ "{
183
+ me {
184
+ name
185
+ }
186
+ }"
187
+ `);
188
+ });
189
+
190
+ it("should remove fragments that become unused when antecendant directives are removed", () => {
191
+ expect(
192
+ print(
193
+ removeDirectiveAnnotatedFields(
194
+ parse(`
195
+ fragment ClientObjectFragment on ClientObject {
196
+ string
197
+ number
198
+ }
199
+
200
+ fragment LaunchTile on Launch {
201
+ __typename
202
+ id
203
+ isBooked
204
+ rocket {
205
+ id
206
+ name
207
+ }
208
+ mission {
209
+ name
210
+ missionPatch
211
+ }
212
+ }
213
+
214
+ query LaunchDetails($launchId: ID!) {
215
+ launch(id: $launchId) {
216
+ isInCart @client
217
+ clientObject @client {
218
+ ...ClientObjectFragment
219
+ }
220
+ site
221
+ rocket {
222
+ type
223
+ }
224
+ ...LaunchTile
225
+ }
226
+ }
227
+ `),
228
+ ["client"],
229
+ ),
230
+ ),
231
+ ).toMatchInlineSnapshot(`
232
+ "fragment LaunchTile on Launch {
233
+ __typename
234
+ id
235
+ isBooked
236
+ rocket {
237
+ id
238
+ name
239
+ }
240
+ mission {
241
+ name
242
+ missionPatch
243
+ }
244
+ }
245
+
246
+ query LaunchDetails($launchId: ID!) {
247
+ launch(id: $launchId) {
248
+ site
249
+ rocket {
250
+ type
251
+ }
252
+ ...LaunchTile
253
+ }
254
+ }"
255
+ `);
256
+ });
257
+
258
+ it("should recursively remove fragments that become unused when antecendant directives are removed", () => {
259
+ expect(
260
+ print(
261
+ removeDirectiveAnnotatedFields(
262
+ parse(`
263
+ fragment One on Node {
264
+ ...Two
265
+ user {
266
+ friends {
267
+ name
268
+ ...Two @client
269
+ }
270
+ }
271
+ }
272
+ fragment Two on Node {
273
+ id
274
+ }
275
+
276
+ query {
277
+ me {
278
+ ...One
279
+ }
280
+ }
281
+ `),
282
+ ["client"],
283
+ ),
284
+ ),
285
+ ).toMatchInlineSnapshot(`
286
+ "fragment One on Node {
287
+ ...Two
288
+ user {
289
+ friends {
290
+ name
291
+ }
292
+ }
293
+ }
294
+
295
+ fragment Two on Node {
296
+ id
297
+ }
298
+
299
+ {
300
+ me {
301
+ ...One
302
+ }
303
+ }"
304
+ `);
305
+ });
306
+
307
+ it("should remove fragment spreads from @client fragment definitions", () => {
308
+ expect(
309
+ print(
310
+ removeDirectiveAnnotatedFields(
311
+ parse(`
312
+ fragment One on Node @client {
313
+ ...Two
314
+ }
315
+
316
+ fragment Two on Node {
317
+ id
318
+ }
319
+
320
+ query {
321
+ me {
322
+ name
323
+ ...One
324
+ }
325
+ }
326
+ `),
327
+ ["client"],
328
+ ),
329
+ ),
330
+ ).toMatchInlineSnapshot(`
331
+ "{
332
+ me {
333
+ name
334
+ }
335
+ }"
336
+ `);
337
+ });
338
+
339
+ it("should remove all operations that have no selection set after fragments are removed", () => {
340
+ expect(
341
+ print(
342
+ removeDirectiveAnnotatedFields(
343
+ parse(`
344
+ fragment One on Node @client {
345
+ ...Two
346
+ }
347
+
348
+ fragment Two on Node {
349
+ id
350
+ }
351
+
352
+ {
353
+ name
354
+ me {
355
+ ...One
356
+ }
357
+ }
358
+ `),
359
+ ["client"],
360
+ ),
361
+ ),
362
+ ).toMatchInlineSnapshot(`
363
+ "{
364
+ name
365
+ }"
366
+ `);
367
+ });
368
+
369
+ it("should not remove fragment definitions that weren't removed by `removeDirectiveAnnotatedFields`", () => {
370
+ expect(
371
+ print(
372
+ removeDirectiveAnnotatedFields(
373
+ parse(`
374
+ fragment One on Node {
375
+ id
376
+ }
377
+
378
+ {
379
+ me {
380
+ name
381
+ }
382
+ }
383
+ `),
384
+ ["client"],
385
+ ),
386
+ ),
387
+ ).toMatchInlineSnapshot(`
388
+ "fragment One on Node {
389
+ id
390
+ }
391
+
392
+ {
393
+ me {
394
+ name
395
+ }
396
+ }"
397
+ `);
398
+ });
399
+ });
@@ -0,0 +1,55 @@
1
+ import { normalizeURI } from "../uri";
2
+
3
+ describe("Unix URIs", () => {
4
+ // this is the format that `glob` returns on unix
5
+ const uriToMatchForUnix = "/test/myFile.js";
6
+
7
+ // single forward slash (unix)
8
+ it("handles /Users/me URIs", () => {
9
+ const uri = "/test/myFile.js";
10
+ const parsed = normalizeURI(uri);
11
+ expect(parsed).toEqual(uriToMatchForUnix);
12
+ });
13
+
14
+ // single escaped backslash
15
+ // treat these as forward slashes?
16
+ it("handles \\Users\\me URIs", () => {
17
+ const uri = "\\test\\myFile.js";
18
+ const parsed = normalizeURI(uri);
19
+ expect(parsed).toEqual(uriToMatchForUnix);
20
+ });
21
+ });
22
+
23
+ describe("Windows URIs", () => {
24
+ // this is the format that `glob` returns for windows
25
+ const uriToMatchForWindows = "c:/test/myFile.js";
26
+
27
+ // this format is sent by the native extension notification system on windows
28
+ it("handles file:///c%3A/ URIs", () => {
29
+ const uri = "file:///c%3A/test/myFile.js";
30
+ const parsed = normalizeURI(uri);
31
+ expect(parsed).toEqual(uriToMatchForWindows);
32
+ });
33
+
34
+ // same as above without URI encoded :
35
+ it("handles handles file:///c:/ URIs", () => {
36
+ const uri = "file:///c:/test/myFile.js";
37
+ const parsed = normalizeURI(uri);
38
+ expect(parsed).toEqual(uriToMatchForWindows);
39
+ });
40
+
41
+ // result of glob.sync
42
+ it("handles c:/ URIs", () => {
43
+ const uri = "c:/test/myFile.js";
44
+ const parsed = normalizeURI(uri);
45
+ expect(parsed).toEqual(uriToMatchForWindows);
46
+ });
47
+
48
+ // from status bar notification
49
+ // single (escaped) backslash
50
+ it("handles c:\\ URIs", () => {
51
+ const uri = "c:\\test\\myFile.js";
52
+ const parsed = normalizeURI(uri);
53
+ expect(parsed).toEqual(uriToMatchForWindows);
54
+ });
55
+ });
@@ -0,0 +1,8 @@
1
+ import debounce from "lodash.debounce";
2
+
3
+ export function debounceHandler(
4
+ handler: (...args: any[]) => any,
5
+ leading: boolean = true,
6
+ ) {
7
+ return debounce(handler, 250, { leading });
8
+ }
@@ -0,0 +1,90 @@
1
+ import { LanguageServerNotifications as Notifications } from "../../messages";
2
+ import { Connection } from "vscode-languageserver/node";
3
+
4
+ /**
5
+ * for errors (and other logs in debug mode) we want to print
6
+ * a stack trace showing where they were thrown. This uses an
7
+ * Error's stack trace, removes the three frames regarding
8
+ * this file (since they're useless) and returns the rest of the trace.
9
+ */
10
+ const createAndTrimStackTrace = () => {
11
+ let stack: string | undefined = new Error().stack;
12
+ // remove the lines in the stack from _this_ function and the caller (in this file) and shorten the trace
13
+ return stack && stack.split("\n").length > 2
14
+ ? stack.split("\n").slice(3, 7).join("\n")
15
+ : stack;
16
+ };
17
+
18
+ type Logger = (message?: any) => void;
19
+
20
+ export class Debug {
21
+ private static connection?: Connection;
22
+ private static infoLogger: Logger = (message) =>
23
+ console.log("[INFO] " + message);
24
+ private static warningLogger: Logger = (message) =>
25
+ console.warn("[WARNING] " + message);
26
+ private static errorLogger: Logger = (message) =>
27
+ console.error("[ERROR] " + message);
28
+
29
+ /**
30
+ * Setting a connection overrides the default info/warning/error
31
+ * loggers to pass a notification to the connection
32
+ */
33
+ public static SetConnection(conn: Connection) {
34
+ Debug.connection = conn;
35
+ Debug.infoLogger = (message) =>
36
+ Debug.connection!.sendNotification(Notifications.ServerDebugMessage, {
37
+ type: "info",
38
+ message: message,
39
+ });
40
+ Debug.warningLogger = (message) =>
41
+ Debug.connection!.sendNotification(Notifications.ServerDebugMessage, {
42
+ type: "warning",
43
+ message: message,
44
+ });
45
+ Debug.errorLogger = (message) =>
46
+ Debug.connection!.sendNotification(Notifications.ServerDebugMessage, {
47
+ type: "error",
48
+ message: message,
49
+ });
50
+ }
51
+
52
+ /**
53
+ * Allow callers to set their own error logging utils.
54
+ * These will default to console.log/warn/error
55
+ */
56
+ public static SetLoggers({
57
+ info,
58
+ warning,
59
+ error,
60
+ }: {
61
+ info?: Logger;
62
+ warning?: Logger;
63
+ error?: Logger;
64
+ }) {
65
+ if (info) Debug.infoLogger = info;
66
+ if (warning) Debug.warningLogger = warning;
67
+ if (error) Debug.errorLogger = error;
68
+ }
69
+
70
+ public static info(message: string) {
71
+ Debug.infoLogger(message);
72
+ }
73
+
74
+ public static error(message: string) {
75
+ const stack = createAndTrimStackTrace();
76
+ Debug.errorLogger(`${message}\n${stack}`);
77
+ }
78
+
79
+ public static warning(message: string) {
80
+ Debug.warningLogger(message);
81
+ }
82
+
83
+ public static sendErrorTelemetry(message: string) {
84
+ Debug.connection &&
85
+ Debug.connection.sendNotification(Notifications.ServerDebugMessage, {
86
+ type: "errorTelemetry",
87
+ message: message,
88
+ });
89
+ }
90
+ }