@lvce-editor/extension-host-worker 8.16.0 → 8.17.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 (63) hide show
  1. package/dist/extension-api/index.js +1360 -0
  2. package/dist/extension-api/parts/Activation/Activation.js +13 -0
  3. package/dist/extension-api/parts/AssertCompletionProvider/AssertCompletionProvider.js +25 -0
  4. package/dist/extension-api/parts/AssertFormattingProvider/AssertFormattingProvider.js +22 -0
  5. package/dist/extension-api/parts/AssertStatusBarItemProvider/AssertStatusBarItemProvider.js +19 -0
  6. package/dist/extension-api/parts/Command/Command.js +0 -0
  7. package/dist/extension-api/parts/CommandCallback/CommandCallback.js +0 -0
  8. package/dist/extension-api/parts/CommandMap/CommandMap.js +14 -0
  9. package/dist/extension-api/parts/CommandRegistry/CommandRegistry.js +53 -0
  10. package/dist/extension-api/parts/CommandRegistrySnapshot/CommandRegistrySnapshot.js +0 -0
  11. package/dist/extension-api/parts/Completion/Completion.js +11 -0
  12. package/dist/extension-api/parts/CompletionItem/CompletionItem.js +0 -0
  13. package/dist/extension-api/parts/CompletionProvider/CompletionProvider.js +0 -0
  14. package/dist/extension-api/parts/CompletionProviderRegistry/CompletionProviderRegistry.js +78 -0
  15. package/dist/extension-api/parts/CompletionProviderRegistrySnapshot/CompletionProviderRegistrySnapshot.js +0 -0
  16. package/dist/extension-api/parts/CompletionProviderState/CompletionProviderState.js +10 -0
  17. package/dist/extension-api/parts/CompletionTextDocument/CompletionTextDocument.js +0 -0
  18. package/dist/extension-api/parts/Disposable/Disposable.js +0 -0
  19. package/dist/extension-api/parts/ExecuteCommand/ExecuteCommand.js +7 -0
  20. package/dist/extension-api/parts/ExecuteCompletionProvider/ExecuteCompletionProvider.js +5 -0
  21. package/dist/extension-api/parts/ExecuteFormattingProvider/ExecuteFormattingProvider.js +4 -0
  22. package/dist/extension-api/parts/ExtensionApiCommandMap/ExtensionApiCommandMap.js +17 -0
  23. package/dist/extension-api/parts/ExtensionApiError/ExtensionApiError.js +9 -0
  24. package/dist/extension-api/parts/ExtensionApiWorkerCommandMap/ExtensionApiWorkerCommandMap.js +15 -0
  25. package/dist/extension-api/parts/ExtensionApiWorkerHandleMessagePort/ExtensionApiWorkerHandleMessagePort.js +21 -0
  26. package/dist/extension-api/parts/ExtensionApiWorkerListen/ExtensionApiWorkerListen.js +11 -0
  27. package/dist/extension-api/parts/Formatting/Formatting.js +10 -0
  28. package/dist/extension-api/parts/FormattingEdit/FormattingEdit.js +0 -0
  29. package/dist/extension-api/parts/FormattingProvider/FormattingProvider.js +0 -0
  30. package/dist/extension-api/parts/FormattingProviderRegistry/FormattingProviderRegistry.js +42 -0
  31. package/dist/extension-api/parts/FormattingProviderRegistrySnapshot/FormattingProviderRegistrySnapshot.js +0 -0
  32. package/dist/extension-api/parts/FormattingProviderState/FormattingProviderState.js +10 -0
  33. package/dist/extension-api/parts/FormattingTextDocument/FormattingTextDocument.js +0 -0
  34. package/dist/extension-api/parts/GetCompletionProviderRegistrySnapshot/GetCompletionProviderRegistrySnapshot.js +4 -0
  35. package/dist/extension-api/parts/GetFormattingProviderRegistrySnapshot/GetFormattingProviderRegistrySnapshot.js +4 -0
  36. package/dist/extension-api/parts/GetStatusBarItemProviderRegistrySnapshot/GetStatusBarItemProviderRegistrySnapshot.js +4 -0
  37. package/dist/extension-api/parts/GetStatusBarItems/GetStatusBarItems.js +4 -0
  38. package/dist/extension-api/parts/HandleExtensionManagementMessagePort/HandleExtensionManagementMessagePort.js +17 -0
  39. package/dist/extension-api/parts/NotifyStatusBarChange/NotifyStatusBarChange.js +7 -0
  40. package/dist/extension-api/parts/ProviderRegistry/ProviderRegistry.js +95 -0
  41. package/dist/extension-api/parts/QuickPick/QuickPick.js +7 -0
  42. package/dist/extension-api/parts/QuickPickItem/QuickPickItem.js +0 -0
  43. package/dist/extension-api/parts/RegisterCompletionProvider/RegisterCompletionProvider.js +4 -0
  44. package/dist/extension-api/parts/RegisterFormattingProvider/RegisterFormattingProvider.js +4 -0
  45. package/dist/extension-api/parts/RegisterStatusBarItemProvider/RegisterStatusBarItemProvider.js +4 -0
  46. package/dist/extension-api/parts/RegisteredCommand/RegisteredCommand.js +0 -0
  47. package/dist/extension-api/parts/RegisteredCompletionProvider/RegisteredCompletionProvider.js +0 -0
  48. package/dist/extension-api/parts/RegisteredFormattingProvider/RegisteredFormattingProvider.js +0 -0
  49. package/dist/extension-api/parts/RegisteredStatusBarItemProvider/RegisteredStatusBarItemProvider.js +0 -0
  50. package/dist/extension-api/parts/ResetCompletionProviderRegistry/ResetCompletionProviderRegistry.js +4 -0
  51. package/dist/extension-api/parts/ResetFormattingProviderRegistry/ResetFormattingProviderRegistry.js +4 -0
  52. package/dist/extension-api/parts/ResetStatusBarItemProviderRegistry/ResetStatusBarItemProviderRegistry.js +4 -0
  53. package/dist/extension-api/parts/Rpc/Rpc.js +14 -0
  54. package/dist/extension-api/parts/ShowQuickPickOptions/ShowQuickPickOptions.js +0 -0
  55. package/dist/extension-api/parts/StatusBar/StatusBar.js +8 -0
  56. package/dist/extension-api/parts/StatusBarItem/StatusBarItem.js +0 -0
  57. package/dist/extension-api/parts/StatusBarItemProvider/StatusBarItemProvider.js +0 -0
  58. package/dist/extension-api/parts/StatusBarItemProviderHandle/StatusBarItemProviderHandle.js +0 -0
  59. package/dist/extension-api/parts/StatusBarItemProviderRegistry/StatusBarItemProviderRegistry.js +52 -0
  60. package/dist/extension-api/parts/StatusBarItemProviderRegistrySnapshot/StatusBarItemProviderRegistrySnapshot.js +0 -0
  61. package/dist/extension-api/parts/StatusBarItemProviderState/StatusBarItemProviderState.js +10 -0
  62. package/dist/extensionHostWorkerMain.js +1327 -1177
  63. package/package.json +1 -1
@@ -19,31 +19,61 @@ const EditorCompletionType = {
19
19
  Variable
20
20
  };
21
21
 
22
- class DepecratedError extends Error {
23
- constructor(message) {
24
- super(message);
25
- this.name = 'DeprecatedError';
22
+ const normalizeLine = line => {
23
+ if (line.startsWith('Error: ')) {
24
+ return line.slice('Error: '.length);
26
25
  }
27
- }
28
-
29
- const getJson$1 = async url => {
30
- throw new DepecratedError(`vscode.getJson is deprecated, use createNodeRpc instead`);
26
+ if (line.startsWith('VError: ')) {
27
+ return line.slice('VError: '.length);
28
+ }
29
+ return line;
31
30
  };
32
-
33
- class NonError extends Error {
34
- name = 'NonError';
35
- constructor(message) {
36
- super(message);
31
+ const getCombinedMessage = (error, message) => {
32
+ const stringifiedError = normalizeLine(`${error}`);
33
+ if (message) {
34
+ return `${message}: ${stringifiedError}`;
37
35
  }
38
- }
39
-
40
- // ensureError based on https://github.com/sindresorhus/ensure-error/blob/main/index.ts (License MIT)
41
- const ensureError = input => {
42
- if (!(input instanceof Error)) {
43
- return new NonError(input);
36
+ return stringifiedError;
37
+ };
38
+ const NewLine$3 = '\n';
39
+ const getNewLineIndex$1 = (string, startIndex = undefined) => {
40
+ return string.indexOf(NewLine$3, startIndex);
41
+ };
42
+ const mergeStacks = (parent, child) => {
43
+ if (!child) {
44
+ return parent;
44
45
  }
45
- return input;
46
+ const parentNewLineIndex = getNewLineIndex$1(parent);
47
+ const childNewLineIndex = getNewLineIndex$1(child);
48
+ if (childNewLineIndex === -1) {
49
+ return parent;
50
+ }
51
+ const parentFirstLine = parent.slice(0, parentNewLineIndex);
52
+ const childRest = child.slice(childNewLineIndex);
53
+ const childFirstLine = normalizeLine(child.slice(0, childNewLineIndex));
54
+ if (parentFirstLine.includes(childFirstLine)) {
55
+ return parentFirstLine + childRest;
56
+ }
57
+ return child;
46
58
  };
59
+ class VError extends Error {
60
+ constructor(error, message) {
61
+ const combinedMessage = getCombinedMessage(error, message);
62
+ super(combinedMessage);
63
+ this.name = 'VError';
64
+ if (error instanceof Error) {
65
+ this.stack = mergeStacks(this.stack, error.stack);
66
+ }
67
+ if (error.codeFrame) {
68
+ // @ts-ignore
69
+ this.codeFrame = error.codeFrame;
70
+ }
71
+ if (error.code) {
72
+ // @ts-ignore
73
+ this.code = error.code;
74
+ }
75
+ }
76
+ }
47
77
 
48
78
  class AssertionError extends Error {
49
79
  constructor(message) {
@@ -112,1180 +142,515 @@ const fn = value => {
112
142
  }
113
143
  };
114
144
 
115
- const state$b = {
116
- /** @type{any[]} */
117
- onDidChangeTextDocumentListeners: [],
118
- /** @type{any[]} */
119
- onDidSaveTextDocumentListeners: [],
120
- /** @type{any[]} */
121
- onWillChangeEditorListeners: [],
122
- textDocuments: Object.create(null)
123
- };
124
- const setDocument = (textDocumentId, textDocument) => {
125
- state$b.textDocuments[textDocumentId] = textDocument;
126
- };
127
- const getDidOpenListeners = () => {
128
- return state$b.onDidSaveTextDocumentListeners;
145
+ const isMessagePort = value => {
146
+ return value && value instanceof MessagePort;
129
147
  };
130
- const getWillChangeListeners = () => {
131
- return state$b.onWillChangeEditorListeners;
148
+ const isMessagePortMain = value => {
149
+ return value && value.constructor && value.constructor.name === 'MessagePortMain';
132
150
  };
133
- const getDidChangeListeners = () => {
134
- return state$b.onDidChangeTextDocumentListeners;
151
+ const isOffscreenCanvas = value => {
152
+ return typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas;
135
153
  };
136
- const getDocument = textDocumentId => {
137
- return state$b.textDocuments[textDocumentId];
154
+ const isInstanceOf = (value, constructorName) => {
155
+ return value?.constructor?.name === constructorName;
138
156
  };
139
-
140
- const getOffset$1 = (textDocument, position) => {
141
- let offset = 0;
142
- let rowIndex = 0;
143
- while (rowIndex++ < position.rowIndex) {
144
- const newLineIndex = textDocument.text.indexOf('\n', offset);
145
- offset = newLineIndex + 1;
146
- }
147
- offset += position.columnIndex;
148
- return offset;
157
+ const isSocket = value => {
158
+ return isInstanceOf(value, 'Socket');
149
159
  };
150
-
151
- // const toOffsetBasedEdit = (textDocument, documentEdit) => {
152
- // switch (documentEdit.type) {
153
- // case /* singleLineEdit */ 1: {
154
- // const offset = getOffset(textDocument, documentEdit)
155
- // return {
156
- // offset,
157
- // inserted: documentEdit.inserted,
158
- // deleted: documentEdit.deleted,
159
- // // type: /* singleLineEdit */ 1
160
- // }
161
- // }
162
- // case /* splice */ 2:
163
- // const offset = getOffset(textDocument, {
164
- // rowIndex: documentEdit.rowIndex,
165
- // columnIndex: textDocument.lines[documentEdit.rowIndex - 1].length,
166
- // })
167
- // const inserted = '\n' + documentEdit.newLines.join('\n')
168
- // return {
169
- // offset,
170
- // inserted,
171
- // deleted: 0 /* TODO */,
172
- // }
173
- // }
174
- // }
175
-
176
- // TODO incremental edits, don't send full text
177
- // export const applyEdit = (id, text, edits) => {
178
- // const textDocument = get(id)
179
- // textDocument.lines = text.split('\n')
180
- // const offsetBasedEdits = edits.map((edit) =>
181
- // toOffsetBasedEdit(textDocument, edit)
182
- // )
183
- // for (const listener of state.onDidChangeTextDocumentListeners) {
184
- // // TODO avoid extra object allocation
185
- // listener(textDocument, offsetBasedEdits)
186
- // }
187
- // }
188
-
189
- // TODO data oriented vs object oriented
190
- // data -> simpler, exposes internals, sometimes weird/long (vscode.TextDocument.getText(textDocument))
191
- // object oriented -> hides internals, banana problem (textDocument.getText())
192
-
193
- // TODO send to shared process, which sends it to renderer worker
194
- // renderer worker sends back the edit
195
- // export const applyEdit2 = (textDocument, edit) => {
196
- // if (VALIDATION_ENABLED) {
197
- // assert(typeof textDocument === 'object')
198
- // assert(textDocument !== null)
199
- // assert(typeof textDocument.id === 'number')
200
- // assert(textDocument.id > 0)
201
- // assert(typeof textDocument.getText === 'function')
202
- // assert(typeof edit === 'object')
203
- // assert(typeof edit.offset === 'number')
204
- // assert(typeof edit.inserted === 'string')
205
- // assert(typeof edit.deleted === 'number')
206
- // }
207
-
208
- // let rowIndex = 0
209
- // let offset = 0
210
- // const lines = textDocument.getText().split('\n')
211
- // while (offset < edit.offset) {
212
- // offset += lines[rowIndex++].length + 1
213
- // }
214
- // rowIndex--
215
- // offset -= lines[rowIndex].length + 1
216
- // const edit2 = {
217
- // rowIndex,
218
- // inserted: edit.inserted,
219
- // deleted: edit.deleted,
220
- // columnIndex: edit.offset - offset + edit.deleted,
221
- // type: 1,
222
- // }
223
-
224
- // // // TODO should be invoke and return boolean whether edit was applied or not
225
- // SharedProcess.send({
226
- // event: 'TextDocument.applyEdit',
227
- // args: [/* id */ textDocument.id, /* edits */ edit2],
228
- // })
229
- // }
230
-
231
- // export const create = (textDocumentId, languageId, content) => {
232
- // const textDocument = {
233
- // languageId,
234
- // lines: content.split('\n'),
235
- // }
236
- // state.textDocuments[textDocumentId] = textDocument
237
- // }
238
-
239
- // const createTextDocument = (uri, languageId, text) => {
240
- // if (VALIDATION_ENABLED) {
241
- // assert(typeof uri === 'string')
242
- // assert(typeof languageId === 'string')
243
- // assert(typeof text === 'string')
244
- // }
245
- // const state = {
246
- // /** @internal */
247
- // lines: text.split('\n'),
248
- // uri,
249
- // languageId,
250
- // getText() {
251
- // return state.lines.join('\n')
252
- // },
253
- // }
254
- // return state
255
- // }
256
-
257
- // export const sync = (documentId, languageId, text) => {
258
- // const textDocument = get(documentId)
259
- // if (!textDocument) {
260
- // console.warn(`textDocument is undefined ${languageId}`)
261
- // return
262
- // }
263
- // textDocument.languageId = languageId
264
- // textDocument.lines = text.split('\n')
265
- // // console.log('sync', JSON.stringify(text))
266
- // }
267
-
268
- const runListenerSafe = async (listener, ...args) => {
269
- try {
270
- await listener(...args);
271
- } catch (error) {
272
- // @ts-ignore
273
- if (error && error.message) {
274
- // @ts-ignore
275
- error.message = 'Failed to run open listener: ' + error.message;
160
+ const transferrables = [isMessagePort, isMessagePortMain, isOffscreenCanvas, isSocket];
161
+ const isTransferrable = value => {
162
+ for (const fn of transferrables) {
163
+ if (fn(value)) {
164
+ return true;
276
165
  }
277
- console.error(error);
278
166
  }
167
+ return false;
279
168
  };
280
- const runListenersSafe = (listeners, ...args) => {
281
- for (const listener of listeners) {
282
- runListenerSafe(listener, ...args);
169
+ const walkValue = (value, transferrables, isTransferrable) => {
170
+ if (!value) {
171
+ return;
283
172
  }
284
- };
285
- const syncFull = (uri, textDocumentId, languageId, text) => {
286
- const textDocument = {
287
- documentId: textDocumentId,
288
- languageId,
289
- text,
290
- uri
291
- };
292
- setDocument(textDocumentId, textDocument);
293
- runListenersSafe(getDidOpenListeners(), textDocument);
294
- };
295
- const getSyntheticChanges = (textDocument, changes) => {
296
- // console.log({ textDocument, changes })
297
- object(textDocument);
298
- array(changes);
299
- const change = changes[0];
300
- const startOffset = getOffset$1(textDocument, change.start);
301
- const endOffset = getOffset$1(textDocument, change.end);
302
- const inserted = change.inserted.join('\n');
303
- const syntheticChanges = [{
304
- endOffset,
305
- inserted,
306
- startOffset
307
- }];
308
- return syntheticChanges;
309
- };
310
- const syncIncremental = (textDocumentId, changes) => {
311
- number(textDocumentId);
312
- array(changes);
313
- const textDocument = getDocument(textDocumentId);
314
- if (!textDocument) {
315
- console.warn(`sync not possible, no matching textDocument with id ${textDocumentId}`);
173
+ if (isTransferrable(value)) {
174
+ transferrables.push(value);
175
+ return;
176
+ }
177
+ if (Array.isArray(value)) {
178
+ for (const item of value) {
179
+ walkValue(item, transferrables, isTransferrable);
180
+ }
181
+ return;
182
+ }
183
+ if (typeof value === 'object') {
184
+ for (const property of Object.values(value)) {
185
+ walkValue(property, transferrables, isTransferrable);
186
+ }
316
187
  return;
317
188
  }
318
- const syntheticChanges = getSyntheticChanges(textDocument, changes);
319
- runListenersSafe(getWillChangeListeners(), textDocument, syntheticChanges);
320
- const syntheticChange = syntheticChanges[0];
321
- const oldText = textDocument.text;
322
- const before = oldText.slice(0, syntheticChange.startOffset);
323
- const after = oldText.slice(syntheticChange.endOffset);
324
- textDocument.text = before + syntheticChange.inserted + after;
325
- runListenersSafe(getDidChangeListeners(), textDocument, syntheticChanges);
326
- };
327
- const get$c = textDocumentId => {
328
- const textDocument = getDocument(textDocumentId);
329
- return textDocument;
330
189
  };
331
- const getText$2 = textDocument => {
332
- return textDocument.text;
190
+ const getTransferrables = value => {
191
+ const transferrables = [];
192
+ walkValue(value, transferrables, isTransferrable);
193
+ return transferrables;
333
194
  };
334
- const setLanguageId = (textDocumentId, languageId) => {
335
- const newTextDocument = {
336
- ...getDocument(textDocumentId),
337
- languageId
195
+ const attachEvents = that => {
196
+ const handleMessage = (...args) => {
197
+ const data = that.getData(...args);
198
+ that.dispatchEvent(new MessageEvent('message', {
199
+ data
200
+ }));
338
201
  };
339
- setDocument(textDocumentId, newTextDocument);
340
- runListenersSafe(getDidOpenListeners(), newTextDocument);
202
+ that.onMessage(handleMessage);
203
+ const handleClose = event => {
204
+ that.dispatchEvent(new Event('close'));
205
+ };
206
+ that.onClose(handleClose);
341
207
  };
342
-
343
- const E_NO_PROVIDER_FOUND = 'E_NO_PROVIDER_FOUND';
344
- const BABEL_PARSER_SYNTAX_ERROR = 'BABEL_PARSER_SYNTAX_ERROR';
345
-
346
- class NoProviderFoundError extends Error {
347
- constructor(message) {
348
- super(message);
349
- // @ts-ignore
350
- this.code = E_NO_PROVIDER_FOUND;
208
+ class Ipc extends EventTarget {
209
+ constructor(rawIpc) {
210
+ super();
211
+ this._rawIpc = rawIpc;
212
+ attachEvents(this);
351
213
  }
352
214
  }
353
-
354
- const getType$1 = value => {
355
- switch (typeof value) {
356
- case 'boolean':
357
- return 'boolean';
358
- case 'function':
359
- return 'function';
360
- case 'number':
361
- return 'number';
362
- case 'object':
363
- if (value === null) {
364
- return 'null';
365
- }
366
- if (Array.isArray(value)) {
367
- return 'array';
368
- }
369
- return 'object';
370
- case 'string':
371
- return 'string';
372
- case 'undefined':
373
- return 'undefined';
374
- default:
375
- return 'unknown';
376
- }
215
+ const E_INCOMPATIBLE_NATIVE_MODULE = 'E_INCOMPATIBLE_NATIVE_MODULE';
216
+ const E_MODULES_NOT_SUPPORTED_IN_ELECTRON = 'E_MODULES_NOT_SUPPORTED_IN_ELECTRON';
217
+ const ERR_MODULE_NOT_FOUND = 'ERR_MODULE_NOT_FOUND';
218
+ const NewLine$2 = '\n';
219
+ const joinLines$1 = lines => {
220
+ return lines.join(NewLine$2);
377
221
  };
378
-
379
- const validateResultObject = (result, resultShape) => {
380
- if (!resultShape.properties) {
381
- return undefined;
222
+ const RE_AT = /^\s+at/;
223
+ const RE_AT_PROMISE_INDEX = /^\s*at async Promise.all \(index \d+\)$/;
224
+ const isNormalStackLine = line => {
225
+ return RE_AT.test(line) && !RE_AT_PROMISE_INDEX.test(line);
226
+ };
227
+ const getDetails = lines => {
228
+ const index = lines.findIndex(isNormalStackLine);
229
+ if (index === -1) {
230
+ return {
231
+ actualMessage: joinLines$1(lines),
232
+ rest: []
233
+ };
382
234
  }
383
- for (const [key, value] of Object.entries(resultShape.properties)) {
384
- // @ts-ignore
385
- const expectedType = value.type;
386
- const actualType = getType$1(result[key]);
387
- if (expectedType !== actualType) {
388
- return `item.${key} must be of type ${expectedType}`;
235
+ let lastIndex = index - 1;
236
+ while (++lastIndex < lines.length) {
237
+ if (!isNormalStackLine(lines[lastIndex])) {
238
+ break;
389
239
  }
390
240
  }
391
- return undefined;
241
+ return {
242
+ actualMessage: lines[index - 1],
243
+ rest: lines.slice(index, lastIndex)
244
+ };
392
245
  };
393
- const validateResultArray = (result, resultShape) => {
394
- for (const item of result) {
395
- const actualType = getType$1(item);
396
- const expectedType = resultShape.items.type;
397
- if (actualType !== expectedType) {
398
- return `expected result to be of type ${expectedType} but was of type ${actualType}`;
399
- }
400
- }
401
- return undefined;
246
+ const splitLines$2 = lines => {
247
+ return lines.split(NewLine$2);
402
248
  };
403
- const getPreviewObject = item => {
404
- return 'object';
249
+ const RE_MESSAGE_CODE_BLOCK_START = /^Error: The module '.*'$/;
250
+ const RE_MESSAGE_CODE_BLOCK_END = /^\s* at/;
251
+ const isMessageCodeBlockStartIndex = line => {
252
+ return RE_MESSAGE_CODE_BLOCK_START.test(line);
405
253
  };
406
- const getPreviewArray = item => {
407
- if (item.length === 0) {
408
- return '[]';
409
- }
410
- return 'array';
254
+ const isMessageCodeBlockEndIndex = line => {
255
+ return RE_MESSAGE_CODE_BLOCK_END.test(line);
411
256
  };
412
- const getPreviewString = item => {
413
- return `"${item}"`;
257
+ const getMessageCodeBlock = stderr => {
258
+ const lines = splitLines$2(stderr);
259
+ const startIndex = lines.findIndex(isMessageCodeBlockStartIndex);
260
+ const endIndex = startIndex + lines.slice(startIndex).findIndex(isMessageCodeBlockEndIndex, startIndex);
261
+ const relevantLines = lines.slice(startIndex, endIndex);
262
+ const relevantMessage = relevantLines.join(' ').slice('Error: '.length);
263
+ return relevantMessage;
414
264
  };
415
- const getPreview = item => {
416
- const type = getType$1(item);
417
- switch (type) {
418
- case 'array':
419
- return getPreviewArray(item);
420
- case 'object':
421
- return getPreviewObject();
422
- case 'string':
423
- return getPreviewString(item);
424
- default:
425
- return `${item}`;
426
- }
265
+ const isModuleNotFoundMessage = line => {
266
+ return line.includes('[ERR_MODULE_NOT_FOUND]');
427
267
  };
428
- const validate = (item, schema) => {
429
- if (typeof schema === 'function') {
430
- return schema(item);
431
- }
432
- const actualType = getType$1(item);
433
- const expectedType = schema.type;
434
- if (actualType !== expectedType) {
435
- if (schema.allowUndefined && (item === undefined || item === null)) {
436
- return item;
437
- }
438
- const preview = getPreview(item);
439
- return `item must be of type ${expectedType} but is ${preview}`;
440
- }
441
- switch (actualType) {
442
- case 'array':
443
- return validateResultArray(item, schema);
444
- case 'object':
445
- return validateResultObject(item, schema);
446
- }
447
- // TODO use json schema to validate result
448
- return undefined;
268
+ const getModuleNotFoundError = stderr => {
269
+ const lines = splitLines$2(stderr);
270
+ const messageIndex = lines.findIndex(isModuleNotFoundMessage);
271
+ const message = lines[messageIndex];
272
+ return {
273
+ code: ERR_MODULE_NOT_FOUND,
274
+ message
275
+ };
449
276
  };
450
-
451
- const normalizeLine = line => {
452
- if (line.startsWith('Error: ')) {
453
- return line.slice('Error: '.length);
454
- }
455
- if (line.startsWith('VError: ')) {
456
- return line.slice('VError: '.length);
277
+ const isModuleNotFoundError = stderr => {
278
+ if (!stderr) {
279
+ return false;
457
280
  }
458
- return line;
281
+ return stderr.includes('ERR_MODULE_NOT_FOUND');
459
282
  };
460
- const getCombinedMessage = (error, message) => {
461
- const stringifiedError = normalizeLine(`${error}`);
462
- if (message) {
463
- return `${message}: ${stringifiedError}`;
283
+ const isModulesSyntaxError = stderr => {
284
+ if (!stderr) {
285
+ return false;
464
286
  }
465
- return stringifiedError;
287
+ return stderr.includes('SyntaxError: Cannot use import statement outside a module');
466
288
  };
467
- const NewLine$3 = '\n';
468
- const getNewLineIndex$1 = (string, startIndex = undefined) => {
469
- return string.indexOf(NewLine$3, startIndex);
289
+ const RE_NATIVE_MODULE_ERROR = /^innerError Error: Cannot find module '.*.node'/;
290
+ const RE_NATIVE_MODULE_ERROR_2 = /was compiled against a different Node.js version/;
291
+ const isUnhelpfulNativeModuleError = stderr => {
292
+ return RE_NATIVE_MODULE_ERROR.test(stderr) && RE_NATIVE_MODULE_ERROR_2.test(stderr);
470
293
  };
471
- const mergeStacks = (parent, child) => {
472
- if (!child) {
473
- return parent;
474
- }
475
- const parentNewLineIndex = getNewLineIndex$1(parent);
476
- const childNewLineIndex = getNewLineIndex$1(child);
477
- if (childNewLineIndex === -1) {
478
- return parent;
294
+ const getNativeModuleErrorMessage = stderr => {
295
+ const message = getMessageCodeBlock(stderr);
296
+ return {
297
+ code: E_INCOMPATIBLE_NATIVE_MODULE,
298
+ message: `Incompatible native node module: ${message}`
299
+ };
300
+ };
301
+ const getModuleSyntaxError = () => {
302
+ return {
303
+ code: E_MODULES_NOT_SUPPORTED_IN_ELECTRON,
304
+ message: `ES Modules are not supported in electron`
305
+ };
306
+ };
307
+ const getHelpfulChildProcessError = (stdout, stderr) => {
308
+ if (isUnhelpfulNativeModuleError(stderr)) {
309
+ return getNativeModuleErrorMessage(stderr);
479
310
  }
480
- const parentFirstLine = parent.slice(0, parentNewLineIndex);
481
- const childRest = child.slice(childNewLineIndex);
482
- const childFirstLine = normalizeLine(child.slice(0, childNewLineIndex));
483
- if (parentFirstLine.includes(childFirstLine)) {
484
- return parentFirstLine + childRest;
311
+ if (isModulesSyntaxError(stderr)) {
312
+ return getModuleSyntaxError();
485
313
  }
486
- return child;
314
+ if (isModuleNotFoundError(stderr)) {
315
+ return getModuleNotFoundError(stderr);
316
+ }
317
+ const lines = splitLines$2(stderr);
318
+ const {
319
+ actualMessage,
320
+ rest
321
+ } = getDetails(lines);
322
+ return {
323
+ code: '',
324
+ message: actualMessage,
325
+ stack: rest
326
+ };
487
327
  };
488
- class VError extends Error {
489
- constructor(error, message) {
490
- const combinedMessage = getCombinedMessage(error, message);
491
- super(combinedMessage);
492
- this.name = 'VError';
493
- if (error instanceof Error) {
494
- this.stack = mergeStacks(this.stack, error.stack);
495
- }
496
- if (error.codeFrame) {
328
+ class IpcError extends VError {
329
+ // @ts-ignore
330
+ constructor(betterMessage, stdout = '', stderr = '') {
331
+ if (stdout || stderr) {
497
332
  // @ts-ignore
498
- this.codeFrame = error.codeFrame;
499
- }
500
- if (error.code) {
333
+ const {
334
+ code,
335
+ message,
336
+ stack
337
+ } = getHelpfulChildProcessError(stdout, stderr);
338
+ const cause = new Error(message);
501
339
  // @ts-ignore
502
- this.code = error.code;
340
+ cause.code = code;
341
+ cause.stack = stack;
342
+ super(cause, betterMessage);
343
+ } else {
344
+ super(betterMessage);
503
345
  }
346
+ // @ts-ignore
347
+ this.name = 'IpcError';
348
+ // @ts-ignore
349
+ this.stdout = stdout;
350
+ // @ts-ignore
351
+ this.stderr = stderr;
504
352
  }
505
353
  }
506
-
507
- const RE_UPPERCASE_LETTER = /[A-Z]/g;
508
- const RE_PROPERTY = /item\..*must be of type/;
509
- const spaceOut = camelCaseWord => {
510
- return camelCaseWord.replaceAll(RE_UPPERCASE_LETTER, (character, index) => {
511
- if (index === 0) {
512
- return character.toLowerCase();
513
- }
514
- return ' ' + character.toLowerCase();
515
- });
354
+ const readyMessage = 'ready';
355
+ const getData$2 = event => {
356
+ return event.data;
516
357
  };
517
- const toCamelCase = string => {
518
- return string[0].toLowerCase() + string.slice(1);
358
+ const listen$8 = ({
359
+ port
360
+ }) => {
361
+ return port;
519
362
  };
520
- const improveValidationErrorPostMessage = (validationError, camelCaseName) => {
521
- if (validationError.startsWith('item must be of type')) {
522
- return validationError.replace('item', camelCaseName);
363
+ const signal$9 = port => {
364
+ port.postMessage(readyMessage);
365
+ };
366
+ class IpcChildWithMessagePort extends Ipc {
367
+ getData(event) {
368
+ return getData$2(event);
523
369
  }
524
- if (validationError.startsWith('expected result to be')) {
525
- return validationError.replace('result', `${camelCaseName} item`);
370
+ send(message) {
371
+ this._rawIpc.postMessage(message);
526
372
  }
527
- if (RE_PROPERTY.test(validationError)) {
528
- return validationError.replace('item', camelCaseName);
373
+ sendAndTransfer(message) {
374
+ const transfer = getTransferrables(message);
375
+ this._rawIpc.postMessage(message, transfer);
529
376
  }
530
- return validationError;
377
+ dispose() {
378
+ // ignore
379
+ }
380
+ onClose(callback) {
381
+ // ignore
382
+ }
383
+ onMessage(callback) {
384
+ this._rawIpc.addEventListener('message', callback);
385
+ this._rawIpc.start();
386
+ }
387
+ }
388
+ const wrap$g = port => {
389
+ return new IpcChildWithMessagePort(port);
531
390
  };
532
- const improveValidationError = (name, validationError) => {
533
- const camelCaseName = toCamelCase(name);
534
- const spacedOutName = spaceOut(name);
535
- const pre = `invalid ${spacedOutName} result`;
536
- const post = improveValidationErrorPostMessage(validationError, camelCaseName);
537
- return pre + ': ' + post;
391
+ const IpcChildWithMessagePort$1 = {
392
+ __proto__: null,
393
+ listen: listen$8,
394
+ signal: signal$9,
395
+ wrap: wrap$g
538
396
  };
539
- const registerMethod = ({
540
- context,
541
- methodName,
542
- name,
543
- providers,
544
- resultShape,
545
- returnUndefinedWhenNoProviderFound
546
- }) => {
547
- context[`execute${name}Provider`] = async function (textDocumentId, ...params) {
548
- try {
549
- const textDocument = get$c(textDocumentId);
550
- if (!textDocument) {
551
- throw new Error(`textDocument with id ${textDocumentId} not found`);
552
- }
553
- const provider = providers[textDocument.languageId];
554
- if (!provider) {
555
- if (returnUndefinedWhenNoProviderFound) {
556
- return undefined;
557
- }
558
- const spacedOutName = spaceOut(name);
559
- throw new NoProviderFoundError(`No ${spacedOutName} provider found for ${textDocument.languageId}`);
560
- }
561
- const result = await provider[methodName](textDocument, ...params);
562
- const error = validate(result, resultShape);
563
- if (error) {
564
- const improvedError = improveValidationError(name, error);
565
- throw new VError(improvedError);
566
- }
567
- return result;
568
- } catch (error) {
569
- const actualError = ensureError(error);
570
- const spacedOutName = spaceOut(name);
571
- if (actualError && actualError.message) {
572
- if (actualError.message === 'provider[methodName] is not a function') {
573
- const camelCaseName = toCamelCase(name);
574
- throw new VError(`Failed to execute ${spacedOutName} provider: VError: ${camelCaseName}Provider.${methodName} is not a function`);
575
- }
576
- throw new VError(actualError, `Failed to execute ${spacedOutName} provider`);
577
- }
578
- throw actualError;
579
- }
580
- };
397
+ const listen$7 = () => {
398
+ // @ts-ignore
399
+ if (typeof WorkerGlobalScope === 'undefined') {
400
+ throw new TypeError('module is not in web worker scope');
401
+ }
402
+ return globalThis;
581
403
  };
582
- const create$k = ({
583
- additionalMethodNames = [],
584
- executeKey = '',
585
- name,
586
- resultShape,
587
- returnUndefinedWhenNoProviderFound = false
588
- }) => {
589
- const multipleResults = resultShape.type === 'array';
590
- const methodName = executeKey || (multipleResults ? `provide${name}s` : `provide${name}`);
591
- const providers = Object.create(null);
592
- const context = {
593
- [`register${name}Provider`](provider) {
594
- providers[provider.languageId] = provider;
595
- },
596
- getProvider(languageId) {
597
- return providers[languageId];
598
- },
599
- reset() {
600
- for (const key in providers) {
601
- delete providers[key];
602
- }
603
- }
604
- };
605
- registerMethod({
606
- context,
607
- methodName,
608
- name,
609
- providers,
610
- resultShape,
611
- returnUndefinedWhenNoProviderFound
612
- });
613
- for (const method of additionalMethodNames) {
404
+ const signal$8 = global => {
405
+ global.postMessage(readyMessage);
406
+ };
407
+ class IpcChildWithModuleWorker extends Ipc {
408
+ getData(event) {
409
+ return getData$2(event);
410
+ }
411
+ send(message) {
614
412
  // @ts-ignore
615
- registerMethod({
616
- context,
617
- providers,
618
- ...method
619
- });
413
+ this._rawIpc.postMessage(message);
620
414
  }
621
- const finalContext = {
622
- ...context
623
- };
624
- return finalContext;
625
- };
626
-
627
- const Array$1 = 'array';
628
- const Boolean$1 = 'boolean';
629
- const Number = 'number';
630
- const Object$1 = 'object';
631
- const String$1 = 'string';
632
-
633
- const {
634
- executeBraceCompletionProvider,
635
- registerBraceCompletionProvider} = create$k({
636
- name: 'BraceCompletion',
637
- resultShape: {
638
- type: Boolean$1
415
+ sendAndTransfer(message) {
416
+ const transfer = getTransferrables(message);
417
+ // @ts-ignore
418
+ this._rawIpc.postMessage(message, transfer);
639
419
  }
640
- });
641
-
642
- const {
643
- executeClosingTagProvider,
644
- registerClosingTagProvider
645
- } = create$k({
646
- name: 'ClosingTag',
647
- resultShape: {
648
- allowUndefined: true,
649
- type: Object$1
650
- },
651
- returnUndefinedWhenNoProviderFound: true
652
- });
653
-
654
- const {
655
- executeCodeActionProvider,
656
- registerCodeActionProvider
657
- } = create$k({
658
- name: 'CodeAction',
659
- resultShape: {
660
- items: {
661
- type: Object$1
662
- },
663
- type: Array$1
420
+ dispose() {
421
+ // ignore
664
422
  }
665
- });
666
- const isOrganizeImports = action => {
667
- return action.kind === 'source.organizeImports';
668
- };
669
-
670
- // TODO handle case when multiple organize imports providers are registered
671
- const executeOrganizeImports = async uid => {
672
- const actions = await executeCodeActionProvider(uid);
673
- // @ts-ignore
674
- if (!actions || actions.length === 0) {
675
- return [];
423
+ onClose(callback) {
424
+ // ignore
676
425
  }
677
- // @ts-ignore
678
- const organizeImportsAction = actions.find(isOrganizeImports);
679
- if (!organizeImportsAction) {
680
- return [];
426
+ onMessage(callback) {
427
+ this._rawIpc.addEventListener('message', callback);
681
428
  }
682
- const textDocument = get$c(uid);
683
- const edits = await organizeImportsAction.execute(textDocument);
684
- return edits;
429
+ }
430
+ const wrap$f = global => {
431
+ return new IpcChildWithModuleWorker(global);
685
432
  };
686
-
687
- const state$a = {
688
- commands: Object.create(null)
433
+ const waitForFirstMessage = async port => {
434
+ const {
435
+ promise,
436
+ resolve
437
+ } = Promise.withResolvers();
438
+ port.addEventListener('message', resolve, {
439
+ once: true
440
+ });
441
+ const event = await promise;
442
+ // @ts-ignore
443
+ return event.data;
689
444
  };
690
- const getCommandDisplay = command => {
691
- if (command && command.id && typeof command.id === 'string') {
692
- return ` ${command.id}`;
445
+ const listen$6 = async () => {
446
+ const parentIpcRaw = listen$7();
447
+ signal$8(parentIpcRaw);
448
+ const parentIpc = wrap$f(parentIpcRaw);
449
+ const firstMessage = await waitForFirstMessage(parentIpc);
450
+ if (firstMessage.method !== 'initialize') {
451
+ throw new IpcError('unexpected first message');
693
452
  }
694
- return '';
695
- };
696
- const registerCommand = command => {
697
- try {
698
- if (!command) {
699
- if (command === null) {
700
- throw new Error(`command is null`);
701
- }
702
- throw new Error('command is not defined');
703
- }
704
- if (!command.id) {
705
- throw new Error('command is missing id');
706
- }
707
- if (!command.execute) {
708
- throw new Error('command is missing execute function');
709
- }
710
- if (command.id in state$a.commands) {
711
- throw new Error(`command cannot be registered multiple times`);
712
- }
713
- state$a.commands[command.id] = command;
714
- } catch (error) {
715
- const commandDisplayId = getCommandDisplay(command);
716
- throw new VError(error, `Failed to register command${commandDisplayId}`);
453
+ const type = firstMessage.params[0];
454
+ if (type === 'message-port') {
455
+ parentIpc.send({
456
+ id: firstMessage.id,
457
+ jsonrpc: '2.0',
458
+ result: null
459
+ });
460
+ parentIpc.dispose();
461
+ const port = firstMessage.params[1];
462
+ return port;
717
463
  }
464
+ return globalThis;
718
465
  };
719
- const executeCommand$1 = async (id, ...args) => {
720
- try {
721
- const command = state$a.commands[id];
722
- if (!command) {
723
- throw new Error(`command ${id} not found`);
724
- }
725
- const results = await command.execute(...args);
726
- return results;
727
- } catch (error) {
728
- // @ts-ignore
729
- if (error && error.isExpected) {
730
- throw error;
731
- }
732
- throw new VError(error, 'Failed to execute command');
466
+ class IpcChildWithModuleWorkerAndMessagePort extends Ipc {
467
+ getData(event) {
468
+ return getData$2(event);
733
469
  }
734
- };
735
-
736
- const {
737
- executeCommentProvider,
738
- registerCommentProvider
739
- } = create$k({
740
- name: 'Comment',
741
- resultShape() {
742
- return '';
470
+ send(message) {
471
+ this._rawIpc.postMessage(message);
743
472
  }
744
- });
745
-
746
- const {
747
- executeCompletionProvider,
748
- executeresolveCompletionItemProvider,
749
- registerCompletionProvider
750
- } = create$k({
751
- additionalMethodNames: [
752
- // @ts-ignore
753
- {
754
- methodName: 'resolveCompletionItem',
755
- name: 'resolveCompletionItem',
756
- resultShape: {
757
- allowUndefined: true,
758
- type: Object$1
473
+ sendAndTransfer(message) {
474
+ const transfer = getTransferrables(message);
475
+ this._rawIpc.postMessage(message, transfer);
476
+ }
477
+ dispose() {
478
+ if (this._rawIpc.close) {
479
+ this._rawIpc.close();
759
480
  }
760
- }],
761
- name: 'Completion',
762
- resultShape: {
763
- items: {
764
- type: Object$1
765
- },
766
- type: Array$1
767
481
  }
768
- });
769
-
770
- const state$9 = {
771
- configuration: Object.create(null)
772
- };
773
- const getConfiguration = key => {
774
- return state$9.configuration[key] ?? '';
775
- };
776
- const setConfigurations = preferences => {
777
- state$9.configuration = preferences;
778
- };
779
-
780
- const isMessagePort = value => {
781
- return value && value instanceof MessagePort;
782
- };
783
- const isMessagePortMain = value => {
784
- return value && value.constructor && value.constructor.name === 'MessagePortMain';
482
+ onClose(callback) {
483
+ // ignore
484
+ }
485
+ onMessage(callback) {
486
+ this._rawIpc.addEventListener('message', callback);
487
+ this._rawIpc.start();
488
+ }
489
+ }
490
+ const wrap$e = port => {
491
+ return new IpcChildWithModuleWorkerAndMessagePort(port);
785
492
  };
786
- const isOffscreenCanvas = value => {
787
- return typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas;
493
+ const IpcChildWithModuleWorkerAndMessagePort$1 = {
494
+ __proto__: null,
495
+ listen: listen$6,
496
+ wrap: wrap$e
788
497
  };
789
- const isInstanceOf = (value, constructorName) => {
790
- return value?.constructor?.name === constructorName;
498
+ const Error$3 = 1;
499
+ const Open = 2;
500
+ const Close = 3;
501
+ const addListener = (emitter, type, callback) => {
502
+ if ('addEventListener' in emitter) {
503
+ emitter.addEventListener(type, callback);
504
+ } else {
505
+ emitter.on(type, callback);
506
+ }
791
507
  };
792
- const isSocket = value => {
793
- return isInstanceOf(value, 'Socket');
508
+ const removeListener = (emitter, type, callback) => {
509
+ if ('removeEventListener' in emitter) {
510
+ emitter.removeEventListener(type, callback);
511
+ } else {
512
+ emitter.off(type, callback);
513
+ }
794
514
  };
795
- const transferrables = [isMessagePort, isMessagePortMain, isOffscreenCanvas, isSocket];
796
- const isTransferrable = value => {
797
- for (const fn of transferrables) {
798
- if (fn(value)) {
799
- return true;
515
+ const getFirstEvent = (eventEmitter, eventMap) => {
516
+ const {
517
+ promise,
518
+ resolve
519
+ } = Promise.withResolvers();
520
+ const listenerMap = Object.create(null);
521
+ const cleanup = value => {
522
+ for (const event of Object.keys(eventMap)) {
523
+ removeListener(eventEmitter, event, listenerMap[event]);
800
524
  }
525
+ resolve(value);
526
+ };
527
+ for (const [event, type] of Object.entries(eventMap)) {
528
+ const listener = event => {
529
+ cleanup({
530
+ event,
531
+ type
532
+ });
533
+ };
534
+ addListener(eventEmitter, event, listener);
535
+ listenerMap[event] = listener;
801
536
  }
802
- return false;
537
+ return promise;
803
538
  };
804
- const walkValue = (value, transferrables, isTransferrable) => {
805
- if (!value) {
806
- return;
807
- }
808
- if (isTransferrable(value)) {
809
- transferrables.push(value);
810
- return;
539
+ const Message$1 = 3;
540
+ const create$5$1 = async ({
541
+ isMessagePortOpen,
542
+ messagePort
543
+ }) => {
544
+ if (!isMessagePort(messagePort)) {
545
+ throw new IpcError('port must be of type MessagePort');
811
546
  }
812
- if (Array.isArray(value)) {
813
- for (const item of value) {
814
- walkValue(item, transferrables, isTransferrable);
815
- }
816
- return;
547
+ if (isMessagePortOpen) {
548
+ return messagePort;
817
549
  }
818
- if (typeof value === 'object') {
819
- for (const property of Object.values(value)) {
820
- walkValue(property, transferrables, isTransferrable);
821
- }
822
- return;
550
+ const eventPromise = getFirstEvent(messagePort, {
551
+ message: Message$1
552
+ });
553
+ messagePort.start();
554
+ const {
555
+ event,
556
+ type
557
+ } = await eventPromise;
558
+ if (type !== Message$1) {
559
+ throw new IpcError('Failed to wait for ipc message');
823
560
  }
824
- };
825
- const getTransferrables = value => {
826
- const transferrables = [];
827
- walkValue(value, transferrables, isTransferrable);
828
- return transferrables;
829
- };
830
- const attachEvents = that => {
831
- const handleMessage = (...args) => {
832
- const data = that.getData(...args);
833
- that.dispatchEvent(new MessageEvent('message', {
834
- data
835
- }));
836
- };
837
- that.onMessage(handleMessage);
838
- const handleClose = event => {
839
- that.dispatchEvent(new Event('close'));
840
- };
841
- that.onClose(handleClose);
842
- };
843
- class Ipc extends EventTarget {
844
- constructor(rawIpc) {
845
- super();
846
- this._rawIpc = rawIpc;
847
- attachEvents(this);
561
+ if (event.data !== readyMessage) {
562
+ throw new IpcError('unexpected first message');
848
563
  }
849
- }
850
- const E_INCOMPATIBLE_NATIVE_MODULE = 'E_INCOMPATIBLE_NATIVE_MODULE';
851
- const E_MODULES_NOT_SUPPORTED_IN_ELECTRON = 'E_MODULES_NOT_SUPPORTED_IN_ELECTRON';
852
- const ERR_MODULE_NOT_FOUND = 'ERR_MODULE_NOT_FOUND';
853
- const NewLine$2 = '\n';
854
- const joinLines$1 = lines => {
855
- return lines.join(NewLine$2);
564
+ return messagePort;
856
565
  };
857
- const RE_AT = /^\s+at/;
858
- const RE_AT_PROMISE_INDEX = /^\s*at async Promise.all \(index \d+\)$/;
859
- const isNormalStackLine = line => {
860
- return RE_AT.test(line) && !RE_AT_PROMISE_INDEX.test(line);
566
+ const signal$1 = messagePort => {
567
+ messagePort.start();
861
568
  };
862
- const getDetails = lines => {
863
- const index = lines.findIndex(isNormalStackLine);
864
- if (index === -1) {
865
- return {
866
- actualMessage: joinLines$1(lines),
867
- rest: []
868
- };
569
+ class IpcParentWithMessagePort extends Ipc {
570
+ getData = getData$2;
571
+ send(message) {
572
+ this._rawIpc.postMessage(message);
869
573
  }
870
- let lastIndex = index - 1;
871
- while (++lastIndex < lines.length) {
872
- if (!isNormalStackLine(lines[lastIndex])) {
873
- break;
874
- }
574
+ sendAndTransfer(message) {
575
+ const transfer = getTransferrables(message);
576
+ this._rawIpc.postMessage(message, transfer);
875
577
  }
876
- return {
877
- actualMessage: lines[index - 1],
878
- rest: lines.slice(index, lastIndex)
879
- };
880
- };
881
- const splitLines$2 = lines => {
882
- return lines.split(NewLine$2);
883
- };
884
- const RE_MESSAGE_CODE_BLOCK_START = /^Error: The module '.*'$/;
885
- const RE_MESSAGE_CODE_BLOCK_END = /^\s* at/;
886
- const isMessageCodeBlockStartIndex = line => {
887
- return RE_MESSAGE_CODE_BLOCK_START.test(line);
888
- };
889
- const isMessageCodeBlockEndIndex = line => {
890
- return RE_MESSAGE_CODE_BLOCK_END.test(line);
891
- };
892
- const getMessageCodeBlock = stderr => {
893
- const lines = splitLines$2(stderr);
894
- const startIndex = lines.findIndex(isMessageCodeBlockStartIndex);
895
- const endIndex = startIndex + lines.slice(startIndex).findIndex(isMessageCodeBlockEndIndex, startIndex);
896
- const relevantLines = lines.slice(startIndex, endIndex);
897
- const relevantMessage = relevantLines.join(' ').slice('Error: '.length);
898
- return relevantMessage;
899
- };
900
- const isModuleNotFoundMessage = line => {
901
- return line.includes('[ERR_MODULE_NOT_FOUND]');
902
- };
903
- const getModuleNotFoundError = stderr => {
904
- const lines = splitLines$2(stderr);
905
- const messageIndex = lines.findIndex(isModuleNotFoundMessage);
906
- const message = lines[messageIndex];
907
- return {
908
- code: ERR_MODULE_NOT_FOUND,
909
- message
910
- };
911
- };
912
- const isModuleNotFoundError = stderr => {
913
- if (!stderr) {
914
- return false;
578
+ dispose() {
579
+ this._rawIpc.close();
915
580
  }
916
- return stderr.includes('ERR_MODULE_NOT_FOUND');
917
- };
918
- const isModulesSyntaxError = stderr => {
919
- if (!stderr) {
920
- return false;
581
+ onMessage(callback) {
582
+ this._rawIpc.addEventListener('message', callback);
921
583
  }
922
- return stderr.includes('SyntaxError: Cannot use import statement outside a module');
923
- };
924
- const RE_NATIVE_MODULE_ERROR = /^innerError Error: Cannot find module '.*.node'/;
925
- const RE_NATIVE_MODULE_ERROR_2 = /was compiled against a different Node.js version/;
926
- const isUnhelpfulNativeModuleError = stderr => {
927
- return RE_NATIVE_MODULE_ERROR.test(stderr) && RE_NATIVE_MODULE_ERROR_2.test(stderr);
584
+ onClose(callback) {}
585
+ }
586
+ const wrap$5 = messagePort => {
587
+ return new IpcParentWithMessagePort(messagePort);
928
588
  };
929
- const getNativeModuleErrorMessage = stderr => {
930
- const message = getMessageCodeBlock(stderr);
931
- return {
932
- code: E_INCOMPATIBLE_NATIVE_MODULE,
933
- message: `Incompatible native node module: ${message}`
934
- };
589
+ const IpcParentWithMessagePort$1 = {
590
+ __proto__: null,
591
+ create: create$5$1,
592
+ signal: signal$1,
593
+ wrap: wrap$5
935
594
  };
936
- const getModuleSyntaxError = () => {
937
- return {
938
- code: E_MODULES_NOT_SUPPORTED_IN_ELECTRON,
939
- message: `ES Modules are not supported in electron`
940
- };
595
+ const stringifyCompact = value => {
596
+ return JSON.stringify(value);
941
597
  };
942
- const getHelpfulChildProcessError = (stdout, stderr) => {
943
- if (isUnhelpfulNativeModuleError(stderr)) {
944
- return getNativeModuleErrorMessage(stderr);
945
- }
946
- if (isModulesSyntaxError(stderr)) {
947
- return getModuleSyntaxError();
598
+ const parse$1 = content => {
599
+ if (content === 'undefined') {
600
+ return null;
948
601
  }
949
- if (isModuleNotFoundError(stderr)) {
950
- return getModuleNotFoundError(stderr);
602
+ try {
603
+ return JSON.parse(content);
604
+ } catch (error) {
605
+ throw new VError(error, 'failed to parse json');
951
606
  }
952
- const lines = splitLines$2(stderr);
953
- const {
954
- actualMessage,
955
- rest
956
- } = getDetails(lines);
957
- return {
958
- code: '',
959
- message: actualMessage,
960
- stack: rest
961
- };
962
607
  };
963
- class IpcError extends VError {
964
- // @ts-ignore
965
- constructor(betterMessage, stdout = '', stderr = '') {
966
- if (stdout || stderr) {
967
- // @ts-ignore
968
- const {
969
- code,
970
- message,
971
- stack
972
- } = getHelpfulChildProcessError(stdout, stderr);
973
- const cause = new Error(message);
974
- // @ts-ignore
975
- cause.code = code;
976
- cause.stack = stack;
977
- super(cause, betterMessage);
978
- } else {
979
- super(betterMessage);
980
- }
981
- // @ts-ignore
982
- this.name = 'IpcError';
983
- // @ts-ignore
984
- this.stdout = stdout;
985
- // @ts-ignore
986
- this.stderr = stderr;
987
- }
988
- }
989
- const readyMessage = 'ready';
990
- const getData$2 = event => {
991
- return event.data;
608
+ const waitForWebSocketToBeOpen = webSocket => {
609
+ return getFirstEvent(webSocket, {
610
+ close: Close,
611
+ error: Error$3,
612
+ open: Open
613
+ });
992
614
  };
993
- const listen$8 = ({
994
- port
615
+ const create$k = async ({
616
+ webSocket
995
617
  }) => {
996
- return port;
997
- };
998
- const signal$9 = port => {
999
- port.postMessage(readyMessage);
618
+ const firstWebSocketEvent = await waitForWebSocketToBeOpen(webSocket);
619
+ if (firstWebSocketEvent.type === Error$3) {
620
+ throw new IpcError(`WebSocket connection error`);
621
+ }
622
+ if (firstWebSocketEvent.type === Close) {
623
+ throw new IpcError('Websocket connection was immediately closed');
624
+ }
625
+ return webSocket;
1000
626
  };
1001
- class IpcChildWithMessagePort extends Ipc {
627
+ let IpcParentWithWebSocket$1 = class IpcParentWithWebSocket extends Ipc {
1002
628
  getData(event) {
1003
- return getData$2(event);
629
+ return parse$1(event.data);
1004
630
  }
1005
631
  send(message) {
1006
- this._rawIpc.postMessage(message);
632
+ this._rawIpc.send(stringifyCompact(message));
1007
633
  }
1008
634
  sendAndTransfer(message) {
1009
- const transfer = getTransferrables(message);
1010
- this._rawIpc.postMessage(message, transfer);
635
+ throw new Error('sendAndTransfer not supported');
1011
636
  }
1012
637
  dispose() {
1013
- // ignore
638
+ this._rawIpc.close();
1014
639
  }
1015
640
  onClose(callback) {
1016
- // ignore
641
+ this._rawIpc.addEventListener('close', callback);
1017
642
  }
1018
643
  onMessage(callback) {
1019
644
  this._rawIpc.addEventListener('message', callback);
1020
- this._rawIpc.start();
1021
645
  }
1022
- }
1023
- const wrap$g = port => {
1024
- return new IpcChildWithMessagePort(port);
1025
646
  };
1026
- const IpcChildWithMessagePort$1 = {
1027
- __proto__: null,
1028
- listen: listen$8,
1029
- signal: signal$9,
1030
- wrap: wrap$g
647
+ const wrap$1 = webSocket => {
648
+ return new IpcParentWithWebSocket$1(webSocket);
1031
649
  };
1032
- const listen$7 = () => {
1033
- // @ts-ignore
1034
- if (typeof WorkerGlobalScope === 'undefined') {
1035
- throw new TypeError('module is not in web worker scope');
1036
- }
1037
- return globalThis;
1038
- };
1039
- const signal$8 = global => {
1040
- global.postMessage(readyMessage);
1041
- };
1042
- class IpcChildWithModuleWorker extends Ipc {
1043
- getData(event) {
1044
- return getData$2(event);
1045
- }
1046
- send(message) {
1047
- // @ts-ignore
1048
- this._rawIpc.postMessage(message);
1049
- }
1050
- sendAndTransfer(message) {
1051
- const transfer = getTransferrables(message);
1052
- // @ts-ignore
1053
- this._rawIpc.postMessage(message, transfer);
1054
- }
1055
- dispose() {
1056
- // ignore
1057
- }
1058
- onClose(callback) {
1059
- // ignore
1060
- }
1061
- onMessage(callback) {
1062
- this._rawIpc.addEventListener('message', callback);
1063
- }
1064
- }
1065
- const wrap$f = global => {
1066
- return new IpcChildWithModuleWorker(global);
1067
- };
1068
- const waitForFirstMessage = async port => {
1069
- const {
1070
- promise,
1071
- resolve
1072
- } = Promise.withResolvers();
1073
- port.addEventListener('message', resolve, {
1074
- once: true
1075
- });
1076
- const event = await promise;
1077
- // @ts-ignore
1078
- return event.data;
1079
- };
1080
- const listen$6 = async () => {
1081
- const parentIpcRaw = listen$7();
1082
- signal$8(parentIpcRaw);
1083
- const parentIpc = wrap$f(parentIpcRaw);
1084
- const firstMessage = await waitForFirstMessage(parentIpc);
1085
- if (firstMessage.method !== 'initialize') {
1086
- throw new IpcError('unexpected first message');
1087
- }
1088
- const type = firstMessage.params[0];
1089
- if (type === 'message-port') {
1090
- parentIpc.send({
1091
- id: firstMessage.id,
1092
- jsonrpc: '2.0',
1093
- result: null
1094
- });
1095
- parentIpc.dispose();
1096
- const port = firstMessage.params[1];
1097
- return port;
1098
- }
1099
- return globalThis;
1100
- };
1101
- class IpcChildWithModuleWorkerAndMessagePort extends Ipc {
1102
- getData(event) {
1103
- return getData$2(event);
1104
- }
1105
- send(message) {
1106
- this._rawIpc.postMessage(message);
1107
- }
1108
- sendAndTransfer(message) {
1109
- const transfer = getTransferrables(message);
1110
- this._rawIpc.postMessage(message, transfer);
1111
- }
1112
- dispose() {
1113
- if (this._rawIpc.close) {
1114
- this._rawIpc.close();
1115
- }
1116
- }
1117
- onClose(callback) {
1118
- // ignore
1119
- }
1120
- onMessage(callback) {
1121
- this._rawIpc.addEventListener('message', callback);
1122
- this._rawIpc.start();
1123
- }
1124
- }
1125
- const wrap$e = port => {
1126
- return new IpcChildWithModuleWorkerAndMessagePort(port);
1127
- };
1128
- const IpcChildWithModuleWorkerAndMessagePort$1 = {
1129
- __proto__: null,
1130
- listen: listen$6,
1131
- wrap: wrap$e
1132
- };
1133
- const Error$3 = 1;
1134
- const Open = 2;
1135
- const Close = 3;
1136
- const addListener = (emitter, type, callback) => {
1137
- if ('addEventListener' in emitter) {
1138
- emitter.addEventListener(type, callback);
1139
- } else {
1140
- emitter.on(type, callback);
1141
- }
1142
- };
1143
- const removeListener = (emitter, type, callback) => {
1144
- if ('removeEventListener' in emitter) {
1145
- emitter.removeEventListener(type, callback);
1146
- } else {
1147
- emitter.off(type, callback);
1148
- }
1149
- };
1150
- const getFirstEvent = (eventEmitter, eventMap) => {
1151
- const {
1152
- promise,
1153
- resolve
1154
- } = Promise.withResolvers();
1155
- const listenerMap = Object.create(null);
1156
- const cleanup = value => {
1157
- for (const event of Object.keys(eventMap)) {
1158
- removeListener(eventEmitter, event, listenerMap[event]);
1159
- }
1160
- resolve(value);
1161
- };
1162
- for (const [event, type] of Object.entries(eventMap)) {
1163
- const listener = event => {
1164
- cleanup({
1165
- event,
1166
- type
1167
- });
1168
- };
1169
- addListener(eventEmitter, event, listener);
1170
- listenerMap[event] = listener;
1171
- }
1172
- return promise;
1173
- };
1174
- const Message$1 = 3;
1175
- const create$5$1 = async ({
1176
- isMessagePortOpen,
1177
- messagePort
1178
- }) => {
1179
- if (!isMessagePort(messagePort)) {
1180
- throw new IpcError('port must be of type MessagePort');
1181
- }
1182
- if (isMessagePortOpen) {
1183
- return messagePort;
1184
- }
1185
- const eventPromise = getFirstEvent(messagePort, {
1186
- message: Message$1
1187
- });
1188
- messagePort.start();
1189
- const {
1190
- event,
1191
- type
1192
- } = await eventPromise;
1193
- if (type !== Message$1) {
1194
- throw new IpcError('Failed to wait for ipc message');
1195
- }
1196
- if (event.data !== readyMessage) {
1197
- throw new IpcError('unexpected first message');
1198
- }
1199
- return messagePort;
1200
- };
1201
- const signal$1 = messagePort => {
1202
- messagePort.start();
1203
- };
1204
- class IpcParentWithMessagePort extends Ipc {
1205
- getData = getData$2;
1206
- send(message) {
1207
- this._rawIpc.postMessage(message);
1208
- }
1209
- sendAndTransfer(message) {
1210
- const transfer = getTransferrables(message);
1211
- this._rawIpc.postMessage(message, transfer);
1212
- }
1213
- dispose() {
1214
- this._rawIpc.close();
1215
- }
1216
- onMessage(callback) {
1217
- this._rawIpc.addEventListener('message', callback);
1218
- }
1219
- onClose(callback) {}
1220
- }
1221
- const wrap$5 = messagePort => {
1222
- return new IpcParentWithMessagePort(messagePort);
1223
- };
1224
- const IpcParentWithMessagePort$1 = {
1225
- __proto__: null,
1226
- create: create$5$1,
1227
- signal: signal$1,
1228
- wrap: wrap$5
1229
- };
1230
- const stringifyCompact = value => {
1231
- return JSON.stringify(value);
1232
- };
1233
- const parse$1 = content => {
1234
- if (content === 'undefined') {
1235
- return null;
1236
- }
1237
- try {
1238
- return JSON.parse(content);
1239
- } catch (error) {
1240
- throw new VError(error, 'failed to parse json');
1241
- }
1242
- };
1243
- const waitForWebSocketToBeOpen = webSocket => {
1244
- return getFirstEvent(webSocket, {
1245
- close: Close,
1246
- error: Error$3,
1247
- open: Open
1248
- });
1249
- };
1250
- const create$j = async ({
1251
- webSocket
1252
- }) => {
1253
- const firstWebSocketEvent = await waitForWebSocketToBeOpen(webSocket);
1254
- if (firstWebSocketEvent.type === Error$3) {
1255
- throw new IpcError(`WebSocket connection error`);
1256
- }
1257
- if (firstWebSocketEvent.type === Close) {
1258
- throw new IpcError('Websocket connection was immediately closed');
1259
- }
1260
- return webSocket;
1261
- };
1262
- let IpcParentWithWebSocket$1 = class IpcParentWithWebSocket extends Ipc {
1263
- getData(event) {
1264
- return parse$1(event.data);
1265
- }
1266
- send(message) {
1267
- this._rawIpc.send(stringifyCompact(message));
1268
- }
1269
- sendAndTransfer(message) {
1270
- throw new Error('sendAndTransfer not supported');
1271
- }
1272
- dispose() {
1273
- this._rawIpc.close();
1274
- }
1275
- onClose(callback) {
1276
- this._rawIpc.addEventListener('close', callback);
1277
- }
1278
- onMessage(callback) {
1279
- this._rawIpc.addEventListener('message', callback);
1280
- }
1281
- };
1282
- const wrap$1 = webSocket => {
1283
- return new IpcParentWithWebSocket$1(webSocket);
1284
- };
1285
- const IpcParentWithWebSocket$1$1 = {
1286
- __proto__: null,
1287
- create: create$j,
1288
- wrap: wrap$1
650
+ const IpcParentWithWebSocket$1$1 = {
651
+ __proto__: null,
652
+ create: create$k,
653
+ wrap: wrap$1
1289
654
  };
1290
655
 
1291
656
  class CommandNotFoundError extends Error {
@@ -1311,7 +676,7 @@ const execute = (command, ...args) => {
1311
676
 
1312
677
  const Two$1 = '2.0';
1313
678
  const callbacks = Object.create(null);
1314
- const get$b = id => {
679
+ const get$c = id => {
1315
680
  return callbacks[id];
1316
681
  };
1317
682
  const remove$5 = id => {
@@ -1460,7 +825,7 @@ const warn$1 = (...args) => {
1460
825
  console.warn(...args);
1461
826
  };
1462
827
  const resolve = (id, response) => {
1463
- const fn = get$b(id);
828
+ const fn = get$c(id);
1464
829
  if (!fn) {
1465
830
  console.log(response);
1466
831
  warn$1(`callback ${id} may already be disposed`);
@@ -1523,7 +888,7 @@ const getErrorResponse = (id, error, preparePrettyError, logError) => {
1523
888
  const errorProperty = getErrorProperty(error, prettyError);
1524
889
  return create$1$1(id, errorProperty);
1525
890
  };
1526
- const create$i = (message, result) => {
891
+ const create$j = (message, result) => {
1527
892
  return {
1528
893
  id: message.id,
1529
894
  jsonrpc: Two$1,
@@ -1532,7 +897,7 @@ const create$i = (message, result) => {
1532
897
  };
1533
898
  const getSuccessResponse = (message, result) => {
1534
899
  const resultProperty = result ?? null;
1535
- return create$i(message, resultProperty);
900
+ return create$j(message, resultProperty);
1536
901
  };
1537
902
  const getErrorResponseSimple = (id, error) => {
1538
903
  return {
@@ -1626,7 +991,7 @@ const handleJsonRpcMessage = async (...args) => {
1626
991
 
1627
992
  const Two = '2.0';
1628
993
 
1629
- const create$h = (method, params) => {
994
+ const create$i = (method, params) => {
1630
995
  return {
1631
996
  jsonrpc: Two,
1632
997
  method,
@@ -1634,7 +999,7 @@ const create$h = (method, params) => {
1634
999
  };
1635
1000
  };
1636
1001
 
1637
- const create$g = (id, method, params) => {
1002
+ const create$h = (id, method, params) => {
1638
1003
  const message = {
1639
1004
  id,
1640
1005
  jsonrpc: Two,
@@ -1645,12 +1010,12 @@ const create$g = (id, method, params) => {
1645
1010
  };
1646
1011
 
1647
1012
  let id$1 = 0;
1648
- const create$f = () => {
1013
+ const create$g = () => {
1649
1014
  return ++id$1;
1650
1015
  };
1651
1016
 
1652
1017
  const registerPromise = map => {
1653
- const id = create$f();
1018
+ const id = create$g();
1654
1019
  const {
1655
1020
  promise,
1656
1021
  resolve
@@ -1667,7 +1032,7 @@ const invokeHelper = async (callbacks, ipc, method, params, useSendAndTransfer)
1667
1032
  id,
1668
1033
  promise
1669
1034
  } = registerPromise(callbacks);
1670
- const message = create$g(id, method, params);
1035
+ const message = create$h(id, method, params);
1671
1036
  if (useSendAndTransfer && ipc.sendAndTransfer) {
1672
1037
  ipc.sendAndTransfer(message);
1673
1038
  } else {
@@ -1703,7 +1068,7 @@ const createRpc$1 = ipc => {
1703
1068
  * @deprecated
1704
1069
  */
1705
1070
  send(method, ...params) {
1706
- const message = create$h(method, params);
1071
+ const message = create$i(method, params);
1707
1072
  ipc.send(message);
1708
1073
  }
1709
1074
  };
@@ -1743,7 +1108,7 @@ const listen$1 = async (module, options) => {
1743
1108
  return ipc;
1744
1109
  };
1745
1110
 
1746
- const create$e = async ({
1111
+ const create$f = async ({
1747
1112
  commandMap,
1748
1113
  isMessagePortOpen = true,
1749
1114
  messagePort
@@ -1761,7 +1126,7 @@ const create$e = async ({
1761
1126
  return rpc;
1762
1127
  };
1763
1128
 
1764
- const create$d = async ({
1129
+ const create$e = async ({
1765
1130
  commandMap,
1766
1131
  isMessagePortOpen,
1767
1132
  send
@@ -1771,7 +1136,7 @@ const create$d = async ({
1771
1136
  port2
1772
1137
  } = new MessageChannel();
1773
1138
  await send(port1);
1774
- return create$e({
1139
+ return create$f({
1775
1140
  commandMap,
1776
1141
  isMessagePortOpen,
1777
1142
  messagePort: port2
@@ -1806,13 +1171,13 @@ const createSharedLazyRpc = factory => {
1806
1171
  };
1807
1172
  };
1808
1173
 
1809
- const create$c = async ({
1174
+ const create$d = async ({
1810
1175
  commandMap,
1811
1176
  isMessagePortOpen,
1812
1177
  send
1813
1178
  }) => {
1814
1179
  return createSharedLazyRpc(() => {
1815
- return create$d({
1180
+ return create$e({
1816
1181
  commandMap,
1817
1182
  isMessagePortOpen,
1818
1183
  send
@@ -1820,7 +1185,7 @@ const create$c = async ({
1820
1185
  });
1821
1186
  };
1822
1187
 
1823
- const create$b = async ({
1188
+ const create$c = async ({
1824
1189
  commandMap,
1825
1190
  webSocket
1826
1191
  }) => {
@@ -1835,7 +1200,7 @@ const create$b = async ({
1835
1200
  return rpc;
1836
1201
  };
1837
1202
 
1838
- const create$a = async ({
1203
+ const create$b = async ({
1839
1204
  commandMap,
1840
1205
  messagePort
1841
1206
  }) => {
@@ -1849,7 +1214,7 @@ const create$a = async ({
1849
1214
  return rpc;
1850
1215
  };
1851
1216
 
1852
- const create$9 = async ({
1217
+ const create$a = async ({
1853
1218
  commandMap,
1854
1219
  isMessagePortOpen,
1855
1220
  messagePort
@@ -1866,17 +1231,17 @@ const create$9 = async ({
1866
1231
  return rpc;
1867
1232
  };
1868
1233
 
1869
- const create$8 = async ({
1234
+ const create$9 = async ({
1870
1235
  commandMap,
1871
1236
  messagePort
1872
1237
  }) => {
1873
- return create$e({
1238
+ return create$f({
1874
1239
  commandMap,
1875
1240
  messagePort
1876
1241
  });
1877
1242
  };
1878
1243
 
1879
- const create$7 = async ({
1244
+ const create$8 = async ({
1880
1245
  commandMap
1881
1246
  }) => {
1882
1247
  // TODO create a commandMap per rpc instance
@@ -1911,7 +1276,7 @@ const rpcs$2 = Object.create(null);
1911
1276
  const set$d = (id, rpc) => {
1912
1277
  rpcs$2[id] = rpc;
1913
1278
  };
1914
- const get$a = id => {
1279
+ const get$b = id => {
1915
1280
  return rpcs$2[id];
1916
1281
  };
1917
1282
  const remove$4 = id => {
@@ -1919,21 +1284,21 @@ const remove$4 = id => {
1919
1284
  };
1920
1285
 
1921
1286
  /* eslint-disable @typescript-eslint/explicit-function-return-type */
1922
- const create$6 = rpcId => {
1287
+ const create$7 = rpcId => {
1923
1288
  return {
1924
1289
  async dispose() {
1925
- const rpc = get$a(rpcId);
1290
+ const rpc = get$b(rpcId);
1926
1291
  await rpc.dispose();
1927
1292
  },
1928
1293
  // @ts-ignore
1929
1294
  invoke(method, ...params) {
1930
- const rpc = get$a(rpcId);
1295
+ const rpc = get$b(rpcId);
1931
1296
  // @ts-ignore
1932
1297
  return rpc.invoke(method, ...params);
1933
1298
  },
1934
1299
  // @ts-ignore
1935
1300
  invokeAndTransfer(method, ...params) {
1936
- const rpc = get$a(rpcId);
1301
+ const rpc = get$b(rpcId);
1937
1302
  // @ts-ignore
1938
1303
  return rpc.invokeAndTransfer(method, ...params);
1939
1304
  },
@@ -1949,57 +1314,715 @@ const create$6 = rpcId => {
1949
1314
  // @ts-ignore
1950
1315
  return mockRpc;
1951
1316
  },
1952
- set(rpc) {
1953
- set$d(rpcId, rpc);
1317
+ set(rpc) {
1318
+ set$d(rpcId, rpc);
1319
+ }
1320
+ };
1321
+ };
1322
+
1323
+ const DebugWorker$1 = 55;
1324
+ const ExtensionManagementWorker = 9006;
1325
+ const RendererWorker$1 = 1;
1326
+
1327
+ const {
1328
+ invoke: invoke$6} = create$7(DebugWorker$1);
1329
+
1330
+ const DebugWorker = {
1331
+ __proto__: null,
1332
+ invoke: invoke$6
1333
+ };
1334
+
1335
+ const {
1336
+ invoke: invoke$5,
1337
+ invokeAndTransfer: invokeAndTransfer$3,
1338
+ set: set$c
1339
+ } = create$7(ExtensionManagementWorker);
1340
+
1341
+ const {
1342
+ set: set$b
1343
+ } = create$7(7013);
1344
+
1345
+ const {
1346
+ invoke: invoke$4,
1347
+ set: set$a
1348
+ } = create$7(10_000);
1349
+
1350
+ const {
1351
+ invoke: invoke$3,
1352
+ invokeAndTransfer: invokeAndTransfer$2} = create$7(RendererWorker$1);
1353
+ const sendMessagePortToFileSearchWorker = async (port, rpcId = 0) => {
1354
+ const command = 'QuickPick.handleMessagePort';
1355
+ await invokeAndTransfer$2('SendMessagePortToExtensionHostWorker.sendMessagePortToFileSearchWorker', port, command, rpcId);
1356
+ };
1357
+ const sendMessagePortToQuickPickWorker = async (port, rpcId = 0) => {
1358
+ const command = 'QuickPick.handleMessagePort';
1359
+ await invokeAndTransfer$2('SendMessagePortToExtensionHostWorker.sendMessagePortToQuickPickWorker', port, command, rpcId);
1360
+ };
1361
+ const sendMessagePortToIframeWorker = async (port, rpcId) => {
1362
+ const command = 'Iframes.handleMessagePort';
1363
+ await invokeAndTransfer$2('SendMessagePortToExtensionHostWorker.sendMessagePortToIframeWorker', port, command, rpcId);
1364
+ };
1365
+ const sendMessagePortToExtensionManagementWorker = async (port, rpcId) => {
1366
+ const command = 'Extensions.handleMessagePort';
1367
+ await invokeAndTransfer$2('SendMessagePortToExtensionHostWorker.sendMessagePortToExtensionManagementWorker', port, command, rpcId);
1368
+ };
1369
+
1370
+ const isCommandNotFoundError = error => {
1371
+ return error instanceof Error && error.name === 'CommandNotFoundError';
1372
+ };
1373
+ const executeCommand$2 = async (id, ...args) => {
1374
+ try {
1375
+ return await invoke$5('Extensions.executeCommand', id, ...args);
1376
+ } catch (error) {
1377
+ if (!isCommandNotFoundError(error)) {
1378
+ throw error;
1379
+ }
1380
+ return invoke$3(id, ...args);
1381
+ }
1382
+ };
1383
+
1384
+ class DepecratedError extends Error {
1385
+ constructor(message) {
1386
+ super(message);
1387
+ this.name = 'DeprecatedError';
1388
+ }
1389
+ }
1390
+
1391
+ const getJson$1 = async url => {
1392
+ throw new DepecratedError(`vscode.getJson is deprecated, use createNodeRpc instead`);
1393
+ };
1394
+
1395
+ class NonError extends Error {
1396
+ name = 'NonError';
1397
+ constructor(message) {
1398
+ super(message);
1399
+ }
1400
+ }
1401
+
1402
+ // ensureError based on https://github.com/sindresorhus/ensure-error/blob/main/index.ts (License MIT)
1403
+ const ensureError = input => {
1404
+ if (!(input instanceof Error)) {
1405
+ return new NonError(input);
1406
+ }
1407
+ return input;
1408
+ };
1409
+
1410
+ const state$b = {
1411
+ /** @type{any[]} */
1412
+ onDidChangeTextDocumentListeners: [],
1413
+ /** @type{any[]} */
1414
+ onDidSaveTextDocumentListeners: [],
1415
+ /** @type{any[]} */
1416
+ onWillChangeEditorListeners: [],
1417
+ textDocuments: Object.create(null)
1418
+ };
1419
+ const setDocument = (textDocumentId, textDocument) => {
1420
+ state$b.textDocuments[textDocumentId] = textDocument;
1421
+ };
1422
+ const getDidOpenListeners = () => {
1423
+ return state$b.onDidSaveTextDocumentListeners;
1424
+ };
1425
+ const getWillChangeListeners = () => {
1426
+ return state$b.onWillChangeEditorListeners;
1427
+ };
1428
+ const getDidChangeListeners = () => {
1429
+ return state$b.onDidChangeTextDocumentListeners;
1430
+ };
1431
+ const getDocument = textDocumentId => {
1432
+ return state$b.textDocuments[textDocumentId];
1433
+ };
1434
+
1435
+ const getOffset$1 = (textDocument, position) => {
1436
+ let offset = 0;
1437
+ let rowIndex = 0;
1438
+ while (rowIndex++ < position.rowIndex) {
1439
+ const newLineIndex = textDocument.text.indexOf('\n', offset);
1440
+ offset = newLineIndex + 1;
1441
+ }
1442
+ offset += position.columnIndex;
1443
+ return offset;
1444
+ };
1445
+
1446
+ // const toOffsetBasedEdit = (textDocument, documentEdit) => {
1447
+ // switch (documentEdit.type) {
1448
+ // case /* singleLineEdit */ 1: {
1449
+ // const offset = getOffset(textDocument, documentEdit)
1450
+ // return {
1451
+ // offset,
1452
+ // inserted: documentEdit.inserted,
1453
+ // deleted: documentEdit.deleted,
1454
+ // // type: /* singleLineEdit */ 1
1455
+ // }
1456
+ // }
1457
+ // case /* splice */ 2:
1458
+ // const offset = getOffset(textDocument, {
1459
+ // rowIndex: documentEdit.rowIndex,
1460
+ // columnIndex: textDocument.lines[documentEdit.rowIndex - 1].length,
1461
+ // })
1462
+ // const inserted = '\n' + documentEdit.newLines.join('\n')
1463
+ // return {
1464
+ // offset,
1465
+ // inserted,
1466
+ // deleted: 0 /* TODO */,
1467
+ // }
1468
+ // }
1469
+ // }
1470
+
1471
+ // TODO incremental edits, don't send full text
1472
+ // export const applyEdit = (id, text, edits) => {
1473
+ // const textDocument = get(id)
1474
+ // textDocument.lines = text.split('\n')
1475
+ // const offsetBasedEdits = edits.map((edit) =>
1476
+ // toOffsetBasedEdit(textDocument, edit)
1477
+ // )
1478
+ // for (const listener of state.onDidChangeTextDocumentListeners) {
1479
+ // // TODO avoid extra object allocation
1480
+ // listener(textDocument, offsetBasedEdits)
1481
+ // }
1482
+ // }
1483
+
1484
+ // TODO data oriented vs object oriented
1485
+ // data -> simpler, exposes internals, sometimes weird/long (vscode.TextDocument.getText(textDocument))
1486
+ // object oriented -> hides internals, banana problem (textDocument.getText())
1487
+
1488
+ // TODO send to shared process, which sends it to renderer worker
1489
+ // renderer worker sends back the edit
1490
+ // export const applyEdit2 = (textDocument, edit) => {
1491
+ // if (VALIDATION_ENABLED) {
1492
+ // assert(typeof textDocument === 'object')
1493
+ // assert(textDocument !== null)
1494
+ // assert(typeof textDocument.id === 'number')
1495
+ // assert(textDocument.id > 0)
1496
+ // assert(typeof textDocument.getText === 'function')
1497
+ // assert(typeof edit === 'object')
1498
+ // assert(typeof edit.offset === 'number')
1499
+ // assert(typeof edit.inserted === 'string')
1500
+ // assert(typeof edit.deleted === 'number')
1501
+ // }
1502
+
1503
+ // let rowIndex = 0
1504
+ // let offset = 0
1505
+ // const lines = textDocument.getText().split('\n')
1506
+ // while (offset < edit.offset) {
1507
+ // offset += lines[rowIndex++].length + 1
1508
+ // }
1509
+ // rowIndex--
1510
+ // offset -= lines[rowIndex].length + 1
1511
+ // const edit2 = {
1512
+ // rowIndex,
1513
+ // inserted: edit.inserted,
1514
+ // deleted: edit.deleted,
1515
+ // columnIndex: edit.offset - offset + edit.deleted,
1516
+ // type: 1,
1517
+ // }
1518
+
1519
+ // // // TODO should be invoke and return boolean whether edit was applied or not
1520
+ // SharedProcess.send({
1521
+ // event: 'TextDocument.applyEdit',
1522
+ // args: [/* id */ textDocument.id, /* edits */ edit2],
1523
+ // })
1524
+ // }
1525
+
1526
+ // export const create = (textDocumentId, languageId, content) => {
1527
+ // const textDocument = {
1528
+ // languageId,
1529
+ // lines: content.split('\n'),
1530
+ // }
1531
+ // state.textDocuments[textDocumentId] = textDocument
1532
+ // }
1533
+
1534
+ // const createTextDocument = (uri, languageId, text) => {
1535
+ // if (VALIDATION_ENABLED) {
1536
+ // assert(typeof uri === 'string')
1537
+ // assert(typeof languageId === 'string')
1538
+ // assert(typeof text === 'string')
1539
+ // }
1540
+ // const state = {
1541
+ // /** @internal */
1542
+ // lines: text.split('\n'),
1543
+ // uri,
1544
+ // languageId,
1545
+ // getText() {
1546
+ // return state.lines.join('\n')
1547
+ // },
1548
+ // }
1549
+ // return state
1550
+ // }
1551
+
1552
+ // export const sync = (documentId, languageId, text) => {
1553
+ // const textDocument = get(documentId)
1554
+ // if (!textDocument) {
1555
+ // console.warn(`textDocument is undefined ${languageId}`)
1556
+ // return
1557
+ // }
1558
+ // textDocument.languageId = languageId
1559
+ // textDocument.lines = text.split('\n')
1560
+ // // console.log('sync', JSON.stringify(text))
1561
+ // }
1562
+
1563
+ const runListenerSafe = async (listener, ...args) => {
1564
+ try {
1565
+ await listener(...args);
1566
+ } catch (error) {
1567
+ // @ts-ignore
1568
+ if (error && error.message) {
1569
+ // @ts-ignore
1570
+ error.message = 'Failed to run open listener: ' + error.message;
1571
+ }
1572
+ console.error(error);
1573
+ }
1574
+ };
1575
+ const runListenersSafe = (listeners, ...args) => {
1576
+ for (const listener of listeners) {
1577
+ runListenerSafe(listener, ...args);
1578
+ }
1579
+ };
1580
+ const syncFull = (uri, textDocumentId, languageId, text) => {
1581
+ const textDocument = {
1582
+ documentId: textDocumentId,
1583
+ languageId,
1584
+ text,
1585
+ uri
1586
+ };
1587
+ setDocument(textDocumentId, textDocument);
1588
+ runListenersSafe(getDidOpenListeners(), textDocument);
1589
+ };
1590
+ const getSyntheticChanges = (textDocument, changes) => {
1591
+ // console.log({ textDocument, changes })
1592
+ object(textDocument);
1593
+ array(changes);
1594
+ const change = changes[0];
1595
+ const startOffset = getOffset$1(textDocument, change.start);
1596
+ const endOffset = getOffset$1(textDocument, change.end);
1597
+ const inserted = change.inserted.join('\n');
1598
+ const syntheticChanges = [{
1599
+ endOffset,
1600
+ inserted,
1601
+ startOffset
1602
+ }];
1603
+ return syntheticChanges;
1604
+ };
1605
+ const syncIncremental = (textDocumentId, changes) => {
1606
+ number(textDocumentId);
1607
+ array(changes);
1608
+ const textDocument = getDocument(textDocumentId);
1609
+ if (!textDocument) {
1610
+ console.warn(`sync not possible, no matching textDocument with id ${textDocumentId}`);
1611
+ return;
1612
+ }
1613
+ const syntheticChanges = getSyntheticChanges(textDocument, changes);
1614
+ runListenersSafe(getWillChangeListeners(), textDocument, syntheticChanges);
1615
+ const syntheticChange = syntheticChanges[0];
1616
+ const oldText = textDocument.text;
1617
+ const before = oldText.slice(0, syntheticChange.startOffset);
1618
+ const after = oldText.slice(syntheticChange.endOffset);
1619
+ textDocument.text = before + syntheticChange.inserted + after;
1620
+ runListenersSafe(getDidChangeListeners(), textDocument, syntheticChanges);
1621
+ };
1622
+ const get$a = textDocumentId => {
1623
+ const textDocument = getDocument(textDocumentId);
1624
+ return textDocument;
1625
+ };
1626
+ const getText$2 = textDocument => {
1627
+ return textDocument.text;
1628
+ };
1629
+ const setLanguageId = (textDocumentId, languageId) => {
1630
+ const newTextDocument = {
1631
+ ...getDocument(textDocumentId),
1632
+ languageId
1633
+ };
1634
+ setDocument(textDocumentId, newTextDocument);
1635
+ runListenersSafe(getDidOpenListeners(), newTextDocument);
1636
+ };
1637
+
1638
+ const E_NO_PROVIDER_FOUND = 'E_NO_PROVIDER_FOUND';
1639
+ const BABEL_PARSER_SYNTAX_ERROR = 'BABEL_PARSER_SYNTAX_ERROR';
1640
+
1641
+ class NoProviderFoundError extends Error {
1642
+ constructor(message) {
1643
+ super(message);
1644
+ // @ts-ignore
1645
+ this.code = E_NO_PROVIDER_FOUND;
1646
+ }
1647
+ }
1648
+
1649
+ const getType$1 = value => {
1650
+ switch (typeof value) {
1651
+ case 'boolean':
1652
+ return 'boolean';
1653
+ case 'function':
1654
+ return 'function';
1655
+ case 'number':
1656
+ return 'number';
1657
+ case 'object':
1658
+ if (value === null) {
1659
+ return 'null';
1660
+ }
1661
+ if (Array.isArray(value)) {
1662
+ return 'array';
1663
+ }
1664
+ return 'object';
1665
+ case 'string':
1666
+ return 'string';
1667
+ case 'undefined':
1668
+ return 'undefined';
1669
+ default:
1670
+ return 'unknown';
1671
+ }
1672
+ };
1673
+
1674
+ const validateResultObject = (result, resultShape) => {
1675
+ if (!resultShape.properties) {
1676
+ return undefined;
1677
+ }
1678
+ for (const [key, value] of Object.entries(resultShape.properties)) {
1679
+ // @ts-ignore
1680
+ const expectedType = value.type;
1681
+ const actualType = getType$1(result[key]);
1682
+ if (expectedType !== actualType) {
1683
+ return `item.${key} must be of type ${expectedType}`;
1684
+ }
1685
+ }
1686
+ return undefined;
1687
+ };
1688
+ const validateResultArray = (result, resultShape) => {
1689
+ for (const item of result) {
1690
+ const actualType = getType$1(item);
1691
+ const expectedType = resultShape.items.type;
1692
+ if (actualType !== expectedType) {
1693
+ return `expected result to be of type ${expectedType} but was of type ${actualType}`;
1694
+ }
1695
+ }
1696
+ return undefined;
1697
+ };
1698
+ const getPreviewObject = item => {
1699
+ return 'object';
1700
+ };
1701
+ const getPreviewArray = item => {
1702
+ if (item.length === 0) {
1703
+ return '[]';
1704
+ }
1705
+ return 'array';
1706
+ };
1707
+ const getPreviewString = item => {
1708
+ return `"${item}"`;
1709
+ };
1710
+ const getPreview = item => {
1711
+ const type = getType$1(item);
1712
+ switch (type) {
1713
+ case 'array':
1714
+ return getPreviewArray(item);
1715
+ case 'object':
1716
+ return getPreviewObject();
1717
+ case 'string':
1718
+ return getPreviewString(item);
1719
+ default:
1720
+ return `${item}`;
1721
+ }
1722
+ };
1723
+ const validate = (item, schema) => {
1724
+ if (typeof schema === 'function') {
1725
+ return schema(item);
1726
+ }
1727
+ const actualType = getType$1(item);
1728
+ const expectedType = schema.type;
1729
+ if (actualType !== expectedType) {
1730
+ if (schema.allowUndefined && (item === undefined || item === null)) {
1731
+ return item;
1732
+ }
1733
+ const preview = getPreview(item);
1734
+ return `item must be of type ${expectedType} but is ${preview}`;
1735
+ }
1736
+ switch (actualType) {
1737
+ case 'array':
1738
+ return validateResultArray(item, schema);
1739
+ case 'object':
1740
+ return validateResultObject(item, schema);
1741
+ }
1742
+ // TODO use json schema to validate result
1743
+ return undefined;
1744
+ };
1745
+
1746
+ const RE_UPPERCASE_LETTER = /[A-Z]/g;
1747
+ const RE_PROPERTY = /item\..*must be of type/;
1748
+ const spaceOut = camelCaseWord => {
1749
+ return camelCaseWord.replaceAll(RE_UPPERCASE_LETTER, (character, index) => {
1750
+ if (index === 0) {
1751
+ return character.toLowerCase();
1752
+ }
1753
+ return ' ' + character.toLowerCase();
1754
+ });
1755
+ };
1756
+ const toCamelCase = string => {
1757
+ return string[0].toLowerCase() + string.slice(1);
1758
+ };
1759
+ const improveValidationErrorPostMessage = (validationError, camelCaseName) => {
1760
+ if (validationError.startsWith('item must be of type')) {
1761
+ return validationError.replace('item', camelCaseName);
1762
+ }
1763
+ if (validationError.startsWith('expected result to be')) {
1764
+ return validationError.replace('result', `${camelCaseName} item`);
1765
+ }
1766
+ if (RE_PROPERTY.test(validationError)) {
1767
+ return validationError.replace('item', camelCaseName);
1768
+ }
1769
+ return validationError;
1770
+ };
1771
+ const improveValidationError = (name, validationError) => {
1772
+ const camelCaseName = toCamelCase(name);
1773
+ const spacedOutName = spaceOut(name);
1774
+ const pre = `invalid ${spacedOutName} result`;
1775
+ const post = improveValidationErrorPostMessage(validationError, camelCaseName);
1776
+ return pre + ': ' + post;
1777
+ };
1778
+ const registerMethod = ({
1779
+ context,
1780
+ methodName,
1781
+ name,
1782
+ providers,
1783
+ resultShape,
1784
+ returnUndefinedWhenNoProviderFound
1785
+ }) => {
1786
+ context[`execute${name}Provider`] = async function (textDocumentId, ...params) {
1787
+ try {
1788
+ const textDocument = get$a(textDocumentId);
1789
+ if (!textDocument) {
1790
+ throw new Error(`textDocument with id ${textDocumentId} not found`);
1791
+ }
1792
+ const provider = providers[textDocument.languageId];
1793
+ if (!provider) {
1794
+ if (returnUndefinedWhenNoProviderFound) {
1795
+ return undefined;
1796
+ }
1797
+ const spacedOutName = spaceOut(name);
1798
+ throw new NoProviderFoundError(`No ${spacedOutName} provider found for ${textDocument.languageId}`);
1799
+ }
1800
+ const result = await provider[methodName](textDocument, ...params);
1801
+ const error = validate(result, resultShape);
1802
+ if (error) {
1803
+ const improvedError = improveValidationError(name, error);
1804
+ throw new VError(improvedError);
1805
+ }
1806
+ return result;
1807
+ } catch (error) {
1808
+ const actualError = ensureError(error);
1809
+ const spacedOutName = spaceOut(name);
1810
+ if (actualError && actualError.message) {
1811
+ if (actualError.message === 'provider[methodName] is not a function') {
1812
+ const camelCaseName = toCamelCase(name);
1813
+ throw new VError(`Failed to execute ${spacedOutName} provider: VError: ${camelCaseName}Provider.${methodName} is not a function`);
1814
+ }
1815
+ throw new VError(actualError, `Failed to execute ${spacedOutName} provider`);
1816
+ }
1817
+ throw actualError;
1818
+ }
1819
+ };
1820
+ };
1821
+ const create$6 = ({
1822
+ additionalMethodNames = [],
1823
+ executeKey = '',
1824
+ name,
1825
+ resultShape,
1826
+ returnUndefinedWhenNoProviderFound = false
1827
+ }) => {
1828
+ const multipleResults = resultShape.type === 'array';
1829
+ const methodName = executeKey || (multipleResults ? `provide${name}s` : `provide${name}`);
1830
+ const providers = Object.create(null);
1831
+ const context = {
1832
+ [`register${name}Provider`](provider) {
1833
+ providers[provider.languageId] = provider;
1834
+ },
1835
+ getProvider(languageId) {
1836
+ return providers[languageId];
1837
+ },
1838
+ getProviders() {
1839
+ return Object.values(providers);
1840
+ },
1841
+ reset() {
1842
+ for (const key in providers) {
1843
+ delete providers[key];
1844
+ }
1954
1845
  }
1955
1846
  };
1847
+ registerMethod({
1848
+ context,
1849
+ methodName,
1850
+ name,
1851
+ providers,
1852
+ resultShape,
1853
+ returnUndefinedWhenNoProviderFound
1854
+ });
1855
+ for (const method of additionalMethodNames) {
1856
+ // @ts-ignore
1857
+ registerMethod({
1858
+ context,
1859
+ providers,
1860
+ ...method
1861
+ });
1862
+ }
1863
+ const finalContext = {
1864
+ ...context
1865
+ };
1866
+ return finalContext;
1956
1867
  };
1957
1868
 
1958
- const DebugWorker$1 = 55;
1959
- const ExtensionManagementWorker = 9006;
1960
- const RendererWorker$1 = 1;
1869
+ const Array$1 = 'array';
1870
+ const Boolean$1 = 'boolean';
1871
+ const Number = 'number';
1872
+ const Object$1 = 'object';
1873
+ const String$1 = 'string';
1961
1874
 
1962
1875
  const {
1963
- invoke: invoke$6} = create$6(DebugWorker$1);
1964
-
1965
- const DebugWorker = {
1966
- __proto__: null,
1967
- invoke: invoke$6
1968
- };
1876
+ executeBraceCompletionProvider,
1877
+ registerBraceCompletionProvider} = create$6({
1878
+ name: 'BraceCompletion',
1879
+ resultShape: {
1880
+ type: Boolean$1
1881
+ }
1882
+ });
1969
1883
 
1970
1884
  const {
1971
- invoke: invoke$5,
1972
- invokeAndTransfer: invokeAndTransfer$3,
1973
- set: set$c
1974
- } = create$6(ExtensionManagementWorker);
1885
+ executeClosingTagProvider,
1886
+ registerClosingTagProvider
1887
+ } = create$6({
1888
+ name: 'ClosingTag',
1889
+ resultShape: {
1890
+ allowUndefined: true,
1891
+ type: Object$1
1892
+ },
1893
+ returnUndefinedWhenNoProviderFound: true
1894
+ });
1975
1895
 
1976
1896
  const {
1977
- set: set$b
1978
- } = create$6(7013);
1897
+ executeCodeActionProvider,
1898
+ registerCodeActionProvider
1899
+ } = create$6({
1900
+ name: 'CodeAction',
1901
+ resultShape: {
1902
+ items: {
1903
+ type: Object$1
1904
+ },
1905
+ type: Array$1
1906
+ }
1907
+ });
1908
+ const isOrganizeImports = action => {
1909
+ return action.kind === 'source.organizeImports';
1910
+ };
1911
+
1912
+ // TODO handle case when multiple organize imports providers are registered
1913
+ const executeOrganizeImports = async uid => {
1914
+ const actions = await executeCodeActionProvider(uid);
1915
+ // @ts-ignore
1916
+ if (!actions || actions.length === 0) {
1917
+ return [];
1918
+ }
1919
+ // @ts-ignore
1920
+ const organizeImportsAction = actions.find(isOrganizeImports);
1921
+ if (!organizeImportsAction) {
1922
+ return [];
1923
+ }
1924
+ const textDocument = get$a(uid);
1925
+ const edits = await organizeImportsAction.execute(textDocument);
1926
+ return edits;
1927
+ };
1928
+
1929
+ const state$a = {
1930
+ commands: Object.create(null)
1931
+ };
1932
+ const getCommandDisplay = command => {
1933
+ if (command && command.id && typeof command.id === 'string') {
1934
+ return ` ${command.id}`;
1935
+ }
1936
+ return '';
1937
+ };
1938
+ const registerCommand = command => {
1939
+ try {
1940
+ if (!command) {
1941
+ if (command === null) {
1942
+ throw new Error(`command is null`);
1943
+ }
1944
+ throw new Error('command is not defined');
1945
+ }
1946
+ if (!command.id) {
1947
+ throw new Error('command is missing id');
1948
+ }
1949
+ if (!command.execute) {
1950
+ throw new Error('command is missing execute function');
1951
+ }
1952
+ if (command.id in state$a.commands) {
1953
+ throw new Error(`command cannot be registered multiple times`);
1954
+ }
1955
+ state$a.commands[command.id] = command;
1956
+ } catch (error) {
1957
+ const commandDisplayId = getCommandDisplay(command);
1958
+ throw new VError(error, `Failed to register command${commandDisplayId}`);
1959
+ }
1960
+ };
1961
+ const executeCommand$1 = async (id, ...args) => {
1962
+ try {
1963
+ const command = state$a.commands[id];
1964
+ if (!command) {
1965
+ throw new Error(`command ${id} not found`);
1966
+ }
1967
+ const results = await command.execute(...args);
1968
+ return results;
1969
+ } catch (error) {
1970
+ // @ts-ignore
1971
+ if (error && error.isExpected) {
1972
+ throw error;
1973
+ }
1974
+ throw new VError(error, 'Failed to execute command');
1975
+ }
1976
+ };
1977
+ const getRegisteredCommandIds$1 = () => {
1978
+ return Object.values(state$a.commands).map(command => command.id);
1979
+ };
1979
1980
 
1980
1981
  const {
1981
- invoke: invoke$4,
1982
- set: set$a
1983
- } = create$6(10_000);
1982
+ executeCommentProvider,
1983
+ registerCommentProvider
1984
+ } = create$6({
1985
+ name: 'Comment',
1986
+ resultShape() {
1987
+ return '';
1988
+ }
1989
+ });
1984
1990
 
1985
1991
  const {
1986
- invoke: invoke$3,
1987
- invokeAndTransfer: invokeAndTransfer$2} = create$6(RendererWorker$1);
1988
- const sendMessagePortToFileSearchWorker = async (port, rpcId = 0) => {
1989
- const command = 'QuickPick.handleMessagePort';
1990
- await invokeAndTransfer$2('SendMessagePortToExtensionHostWorker.sendMessagePortToFileSearchWorker', port, command, rpcId);
1992
+ executeCompletionProvider,
1993
+ executeresolveCompletionItemProvider,
1994
+ getProviders: getProviders$1,
1995
+ registerCompletionProvider} = create$6({
1996
+ additionalMethodNames: [
1997
+ // @ts-ignore
1998
+ {
1999
+ methodName: 'resolveCompletionItem',
2000
+ name: 'resolveCompletionItem',
2001
+ resultShape: {
2002
+ allowUndefined: true,
2003
+ type: Object$1
2004
+ }
2005
+ }],
2006
+ name: 'Completion',
2007
+ resultShape: {
2008
+ items: {
2009
+ type: Object$1
2010
+ },
2011
+ type: Array$1
2012
+ }
2013
+ });
2014
+ const getRegisteredCompletionProviderIds$1 = () => {
2015
+ return getProviders$1().map(provider => provider.id);
1991
2016
  };
1992
- const sendMessagePortToQuickPickWorker = async (port, rpcId = 0) => {
1993
- const command = 'QuickPick.handleMessagePort';
1994
- await invokeAndTransfer$2('SendMessagePortToExtensionHostWorker.sendMessagePortToQuickPickWorker', port, command, rpcId);
2017
+
2018
+ const state$9 = {
2019
+ configuration: Object.create(null)
1995
2020
  };
1996
- const sendMessagePortToIframeWorker = async (port, rpcId) => {
1997
- const command = 'Iframes.handleMessagePort';
1998
- await invokeAndTransfer$2('SendMessagePortToExtensionHostWorker.sendMessagePortToIframeWorker', port, command, rpcId);
2021
+ const getConfiguration = key => {
2022
+ return state$9.configuration[key] ?? '';
1999
2023
  };
2000
- const sendMessagePortToExtensionManagementWorker = async (port, rpcId) => {
2001
- const command = 'Extensions.handleMessagePort';
2002
- await invokeAndTransfer$2('SendMessagePortToExtensionHostWorker.sendMessagePortToExtensionManagementWorker', port, command, rpcId);
2024
+ const setConfigurations = preferences => {
2025
+ state$9.configuration = preferences;
2003
2026
  };
2004
2027
 
2005
2028
  const {
@@ -2192,7 +2215,7 @@ const setPauseOnExceptions = async (protocol, value) => {
2192
2215
 
2193
2216
  const {
2194
2217
  executeDefinitionProvider,
2195
- registerDefinitionProvider} = create$k({
2218
+ registerDefinitionProvider} = create$6({
2196
2219
  name: 'Definition',
2197
2220
  resultShape: {
2198
2221
  allowUndefined: true,
@@ -2214,7 +2237,7 @@ const {
2214
2237
  const {
2215
2238
  executeDiagnosticProvider,
2216
2239
  registerDiagnosticProvider
2217
- } = create$k({
2240
+ } = create$6({
2218
2241
  name: 'Diagnostic',
2219
2242
  resultShape: {
2220
2243
  items: {
@@ -2227,11 +2250,11 @@ const {
2227
2250
  const RendererWorker = 1;
2228
2251
 
2229
2252
  const invoke$1 = (method, ...params) => {
2230
- const rpc = get$a(RendererWorker);
2253
+ const rpc = get$b(RendererWorker);
2231
2254
  return rpc.invoke(method, ...params);
2232
2255
  };
2233
2256
  const invokeAndTransfer$1 = (method, ...params) => {
2234
- const rpc = get$a(RendererWorker);
2257
+ const rpc = get$b(RendererWorker);
2235
2258
  return rpc.invokeAndTransfer(method, ...params);
2236
2259
  };
2237
2260
 
@@ -2363,8 +2386,10 @@ const getPathSeparator = protocol => {
2363
2386
  };
2364
2387
 
2365
2388
  const {
2366
- executeFormattingProvider,
2367
- registerFormattingProvider} = create$k({
2389
+ executeFormattingProvider: executeRegisteredFormattingProvider,
2390
+ getProvider: getProvider$3,
2391
+ getProviders,
2392
+ registerFormattingProvider} = create$6({
2368
2393
  executeKey: 'format',
2369
2394
  name: 'Formatting',
2370
2395
  resultShape: {
@@ -2386,6 +2411,21 @@ const {
2386
2411
  type: Array$1
2387
2412
  }
2388
2413
  });
2414
+ const executeRegisteredFormattingProviderWithParams = executeRegisteredFormattingProvider;
2415
+ const executeFormattingProvider = async (textDocumentId, ...params) => {
2416
+ const textDocument = get$a(textDocumentId);
2417
+ if (!textDocument) {
2418
+ throw new VError(`Failed to execute formatting provider: textDocument with id ${textDocumentId} not found`);
2419
+ }
2420
+ const provider = getProvider$3(textDocument.languageId);
2421
+ if (!provider) {
2422
+ throw new VError(`No formatting provider found for ${textDocument.languageId}`, 'Failed to execute formatting provider');
2423
+ }
2424
+ return executeRegisteredFormattingProviderWithParams(textDocumentId, ...params);
2425
+ };
2426
+ const getRegisteredFormattingProviderIds$1 = () => {
2427
+ return getProviders().map(provider => provider.id);
2428
+ };
2389
2429
 
2390
2430
  const getOffset = (textDocument, position) => {
2391
2431
  let offset = 0;
@@ -2425,7 +2465,7 @@ const getPosition = (textDocument, offset) => {
2425
2465
 
2426
2466
  const {
2427
2467
  executeHoverProvider,
2428
- registerHoverProvider} = create$k({
2468
+ registerHoverProvider} = create$6({
2429
2469
  name: 'Hover',
2430
2470
  resultShape: {
2431
2471
  allowUndefined: true,
@@ -2436,7 +2476,7 @@ const {
2436
2476
 
2437
2477
  const {
2438
2478
  executeImplementationProvider,
2439
- registerImplementationProvider} = create$k({
2479
+ registerImplementationProvider} = create$6({
2440
2480
  name: 'Implementation',
2441
2481
  resultShape: {
2442
2482
  items: {
@@ -2487,7 +2527,7 @@ const create$5 = async ({
2487
2527
  port1,
2488
2528
  port2
2489
2529
  } = getPortTuple();
2490
- const rpcPromise = create$9({
2530
+ const rpcPromise = create$a({
2491
2531
  commandMap,
2492
2532
  isMessagePortOpen: true,
2493
2533
  messagePort: port2
@@ -2526,7 +2566,7 @@ const create$4 = async ({
2526
2566
  const port = await getPort();
2527
2567
  // TODO rpc module should start port
2528
2568
  port.start();
2529
- const rpc = await create$9({
2569
+ const rpc = await create$a({
2530
2570
  commandMap: {},
2531
2571
  isMessagePortOpen: true,
2532
2572
  messagePort: port
@@ -2554,7 +2594,7 @@ const create$3 = async ({
2554
2594
  string(type);
2555
2595
  const wsUrl = getWebSocketUrl(type, location.host);
2556
2596
  const webSocket = new WebSocket(wsUrl);
2557
- const rpc = await create$b({
2597
+ const rpc = await create$c({
2558
2598
  commandMap: {},
2559
2599
  webSocket
2560
2600
  });
@@ -2672,7 +2712,7 @@ const send = async port => {
2672
2712
  await invokeAndTransfer$1('SendMessagePortToExtensionHostWorker.sendMessagePortToFileSystemWorker', port, initialCommand);
2673
2713
  };
2674
2714
  const launchFileSystemProcess = async () => {
2675
- const rpc = await create$d({
2715
+ const rpc = await create$e({
2676
2716
  commandMap: {},
2677
2717
  send
2678
2718
  });
@@ -2788,7 +2828,7 @@ const {
2788
2828
  executefileReferenceProvider,
2789
2829
  executeReferenceProvider,
2790
2830
  getProvider: getProvider$2,
2791
- registerReferenceProvider} = create$k({
2831
+ registerReferenceProvider} = create$6({
2792
2832
  additionalMethodNames: [
2793
2833
  // @ts-ignore
2794
2834
  {
@@ -2850,7 +2890,7 @@ const validateResult = renameResult => {
2850
2890
  const {
2851
2891
  executeprepareRenameProvider,
2852
2892
  executeRenameProvider,
2853
- registerRenameProvider} = create$k({
2893
+ registerRenameProvider} = create$6({
2854
2894
  additionalMethodNames: [
2855
2895
  // @ts-ignore
2856
2896
  {
@@ -3007,7 +3047,7 @@ const createRpc = ({
3007
3047
 
3008
3048
  const {
3009
3049
  executeSelectionProvider,
3010
- registerSelectionProvider} = create$k({
3050
+ registerSelectionProvider} = create$6({
3011
3051
  name: 'Selection',
3012
3052
  resultShape: {
3013
3053
  allowUndefined: true,
@@ -3403,7 +3443,7 @@ const registerStatuBarItemProvider = provider => {
3403
3443
 
3404
3444
  const {
3405
3445
  executeTabCompletionProvider,
3406
- registerTabCompletionProvider} = create$k({
3446
+ registerTabCompletionProvider} = create$6({
3407
3447
  name: 'TabCompletion',
3408
3448
  resultShape: {
3409
3449
  allowUndefined: true,
@@ -3442,7 +3482,7 @@ const executeTextSearchProvider = async (scheme, query) => {
3442
3482
 
3443
3483
  const {
3444
3484
  executeTypeDefinitionProvider,
3445
- registerTypeDefinitionProvider} = create$k({
3485
+ registerTypeDefinitionProvider} = create$6({
3446
3486
  name: 'TypeDefinition',
3447
3487
  resultShape: {
3448
3488
  allowUndefined: true,
@@ -3493,7 +3533,7 @@ const createWebView = async (providerId, port, uri, uid, origin, webView) => {
3493
3533
  // TODO cancel promise when webview is disposed before sending message
3494
3534
  // TODO handle case when webview doesn't send ready message
3495
3535
 
3496
- const rpc = await create$9({
3536
+ const rpc = await create$a({
3497
3537
  commandMap: provider.commands || {},
3498
3538
  isMessagePortOpen: false,
3499
3539
  messagePort: port
@@ -3603,7 +3643,7 @@ const api = {
3603
3643
  // Comment
3604
3644
 
3605
3645
  executeClosingTagProvider: executeClosingTagProvider,
3606
- executeCommand: executeCommand$1,
3646
+ executeCommand: executeCommand$2,
3607
3647
  executeCommentProvider: executeCommentProvider,
3608
3648
  executeCompletionProvider: executeCompletionProvider,
3609
3649
  executeDefinitionProvider: executeDefinitionProvider,
@@ -3782,7 +3822,7 @@ const setup = ({
3782
3822
  };
3783
3823
 
3784
3824
  const launchExtensionManagementWorker = async () => {
3785
- const rpc = await create$c({
3825
+ const rpc = await create$d({
3786
3826
  commandMap: {},
3787
3827
  async send(port) {
3788
3828
  await sendMessagePortToExtensionManagementWorker(port, 0);
@@ -3792,7 +3832,7 @@ const launchExtensionManagementWorker = async () => {
3792
3832
  };
3793
3833
 
3794
3834
  const launchFileSearchWorker = async () => {
3795
- const rpc = await create$c({
3835
+ const rpc = await create$d({
3796
3836
  commandMap: {},
3797
3837
  async send(port) {
3798
3838
  await sendMessagePortToFileSearchWorker(port, 0);
@@ -4187,6 +4227,94 @@ const tryToGetActualImportErrorMessage = async (url, error) => {
4187
4227
  }
4188
4228
  };
4189
4229
 
4230
+ const getManifestCommandIds = extension => {
4231
+ if (!Array.isArray(extension.commands)) {
4232
+ return [];
4233
+ }
4234
+ return extension.commands.map(command => command.id).filter(id => typeof id === 'string');
4235
+ };
4236
+ const getManifestFormattingProviderIds = extension => {
4237
+ if (!Array.isArray(extension.formattingProviders)) {
4238
+ return [];
4239
+ }
4240
+ return extension.formattingProviders.map(provider => provider.id).filter(id => typeof id === 'string');
4241
+ };
4242
+ const getManifestCompletionProviderIds = extension => {
4243
+ if (!Array.isArray(extension.completionProviders)) {
4244
+ return [];
4245
+ }
4246
+ return extension.completionProviders.map(provider => provider.id).filter(id => typeof id === 'string');
4247
+ };
4248
+ const assertUniqueIds = (ids, label) => {
4249
+ const seen = new Set();
4250
+ for (const id of ids) {
4251
+ if (seen.has(id)) {
4252
+ throw new Error(`${label} ${id} is contributed multiple times`);
4253
+ }
4254
+ seen.add(id);
4255
+ }
4256
+ };
4257
+ const getNewRegisteredCommandIds = beforeCommandIds => {
4258
+ const before = new Set(beforeCommandIds);
4259
+ return getRegisteredCommandIds$1().filter(commandId => !before.has(commandId));
4260
+ };
4261
+ const getNewRegisteredFormattingProviderIds = beforeFormattingProviderIds => {
4262
+ const before = new Set(beforeFormattingProviderIds);
4263
+ return getRegisteredFormattingProviderIds$1().filter(providerId => !before.has(providerId));
4264
+ };
4265
+ const getNewRegisteredCompletionProviderIds = beforeCompletionProviderIds => {
4266
+ const before = new Set(beforeCompletionProviderIds);
4267
+ return getRegisteredCompletionProviderIds$1().filter(providerId => !before.has(providerId));
4268
+ };
4269
+ const getRegisteredCommandIds = () => {
4270
+ return getRegisteredCommandIds$1();
4271
+ };
4272
+ const getRegisteredCompletionProviderIds = () => {
4273
+ return getRegisteredCompletionProviderIds$1();
4274
+ };
4275
+ const getRegisteredFormattingProviderIds = () => {
4276
+ return getRegisteredFormattingProviderIds$1();
4277
+ };
4278
+ const validateIsolatedExtensionContribution = (label, manifestIds, registeredIds) => {
4279
+ assertUniqueIds(manifestIds, label);
4280
+ const manifestIdSet = new Set(manifestIds);
4281
+ const registeredIdSet = new Set(registeredIds);
4282
+ for (const registeredId of registeredIds) {
4283
+ if (!manifestIdSet.has(registeredId)) {
4284
+ throw new Error(`${label} ${registeredId} is registered but not contributed in extension.json`);
4285
+ }
4286
+ }
4287
+ for (const manifestId of manifestIds) {
4288
+ if (!registeredIdSet.has(manifestId)) {
4289
+ throw new Error(`${label} ${manifestId} is contributed in extension.json but not registered`);
4290
+ }
4291
+ }
4292
+ };
4293
+ const validateIsolatedExtensionCommands = (extension, beforeCommandIds) => {
4294
+ if (!extension.isolated) {
4295
+ return;
4296
+ }
4297
+ const manifestCommandIds = getManifestCommandIds(extension);
4298
+ const registeredCommandIds = getNewRegisteredCommandIds(beforeCommandIds);
4299
+ validateIsolatedExtensionContribution('command', manifestCommandIds, registeredCommandIds);
4300
+ };
4301
+ const validateIsolatedExtensionCompletionProviders = (extension, beforeCompletionProviderIds) => {
4302
+ if (!extension.isolated) {
4303
+ return;
4304
+ }
4305
+ const manifestCompletionProviderIds = getManifestCompletionProviderIds(extension);
4306
+ const registeredCompletionProviderIds = getNewRegisteredCompletionProviderIds(beforeCompletionProviderIds);
4307
+ validateIsolatedExtensionContribution('completion provider', manifestCompletionProviderIds, registeredCompletionProviderIds);
4308
+ };
4309
+ const validateIsolatedExtensionFormattingProviders = (extension, beforeFormattingProviderIds) => {
4310
+ if (!extension.isolated) {
4311
+ return;
4312
+ }
4313
+ const manifestFormattingProviderIds = getManifestFormattingProviderIds(extension);
4314
+ const registeredFormattingProviderIds = getNewRegisteredFormattingProviderIds(beforeFormattingProviderIds);
4315
+ validateIsolatedExtensionContribution('formatting provider', manifestFormattingProviderIds, registeredFormattingProviderIds);
4316
+ };
4317
+
4190
4318
  // TODO make activation timeout configurable or remove it.
4191
4319
  // some extension might do workspace indexing which could take some time
4192
4320
  const activationTimeout$1 = 10_000;
@@ -4206,7 +4334,14 @@ const activateExtension2 = async (extensionId, extension, absolutePath) => {
4206
4334
  status: Activating
4207
4335
  });
4208
4336
  const module = acquire(extensionId);
4209
- await Promise.race([module.activate(extension), rejectAfterTimeout$1(activationTimeout$1, token)]);
4337
+ const activate = module.main || module.activate;
4338
+ const beforeCommandIds = getRegisteredCommandIds();
4339
+ const beforeCompletionProviderIds = getRegisteredCompletionProviderIds();
4340
+ const beforeFormattingProviderIds = getRegisteredFormattingProviderIds();
4341
+ await Promise.race([activate(extension), rejectAfterTimeout$1(activationTimeout$1, token)]);
4342
+ validateIsolatedExtensionCommands(extension, beforeCommandIds);
4343
+ validateIsolatedExtensionCompletionProviders(extension, beforeCompletionProviderIds);
4344
+ validateIsolatedExtensionFormattingProviders(extension, beforeFormattingProviderIds);
4210
4345
  const endTime = performance.now();
4211
4346
  const time = endTime - startTime;
4212
4347
  update(extensionId, {
@@ -4234,6 +4369,10 @@ const activateExtension3 = async (extensionId, extension) => {
4234
4369
  if (!module) {
4235
4370
  throw new Error(`extension module ${extensionId} not found`);
4236
4371
  }
4372
+ if (module.main) {
4373
+ await module.main(extension);
4374
+ return;
4375
+ }
4237
4376
  await module.activate(extension);
4238
4377
  };
4239
4378
 
@@ -4335,7 +4474,8 @@ const activateExtension = async (extension, absolutePath, activationEvent) => {
4335
4474
  });
4336
4475
  const token = create();
4337
4476
  try {
4338
- await Promise.race([module.activate(extension), rejectAfterTimeout(activationTimeout, token)]);
4477
+ const activate = module.main || module.activate;
4478
+ await Promise.race([activate(extension), rejectAfterTimeout(activationTimeout, token)]);
4339
4479
  const endTime = performance.now();
4340
4480
  const time = endTime - startTime;
4341
4481
  update(extensionId, {
@@ -5018,7 +5158,7 @@ const hydrate$1 = async () => {
5018
5158
  };
5019
5159
 
5020
5160
  const launchIframeWorker = async () => {
5021
- const rpc = await create$d({
5161
+ const rpc = await create$e({
5022
5162
  commandMap: {},
5023
5163
  async send(port) {
5024
5164
  await sendMessagePortToIframeWorker(port, 0);
@@ -5642,8 +5782,15 @@ const handleBeforeUnload = () => {
5642
5782
  // console.log('before unload')
5643
5783
  };
5644
5784
 
5785
+ const handleExtensionManagementMessagePort = async port => {
5786
+ await create$b({
5787
+ commandMap: commandMap,
5788
+ messagePort: port
5789
+ });
5790
+ };
5791
+
5645
5792
  const handleMessagePort2 = async (port, rpcId) => {
5646
- const rpc = await create$8({
5793
+ const rpc = await create$9({
5647
5794
  commandMap: {},
5648
5795
  messagePort: port
5649
5796
  });
@@ -5653,7 +5800,7 @@ const handleMessagePort2 = async (port, rpcId) => {
5653
5800
  };
5654
5801
 
5655
5802
  const handleMessagePort = async (port, rpcId) => {
5656
- const rpc = await create$a({
5803
+ const rpc = await create$b({
5657
5804
  commandMap: {},
5658
5805
  messagePort: port
5659
5806
  });
@@ -6281,6 +6428,7 @@ const commandMap = {
6281
6428
  'ColorTheme.getColorThemeJson': getColorThemeJson,
6282
6429
  'ColorTheme.getColorThemeNames': getColorThemeNames,
6283
6430
  'ColorTheme.hydrate': hydrate$1,
6431
+ 'Commands.executeCommand': executeCommand$2,
6284
6432
  'ExecuteExternalCommand.executeExternalCommand': executeExternalCommand,
6285
6433
  'ExtensionHost.activateExtension2': activateExtension2,
6286
6434
  'ExtensionHost.activateExtension3': activateExtension3,
@@ -6354,6 +6502,7 @@ const commandMap = {
6354
6502
  'ExtensionHostDebug.stepInto': stepInto,
6355
6503
  'ExtensionHostDebug.stepOut': stepOut,
6356
6504
  'ExtensionHostDebug.stepOver': stepOver,
6505
+ 'ExtensionHostQuickPick.showQuickPick': showQuickPick,
6357
6506
  'ExtensionHostRename.executeprepareRenameProvider': executeprepareRenameProvider,
6358
6507
  'ExtensionHostRename.executeRenameProvider': executeRenameProvider,
6359
6508
  'ExtensionHostSourceControl.getIconDefinitions': getIconDefinitions,
@@ -6388,6 +6537,7 @@ const commandMap = {
6388
6537
  'FileSystemMemory.stat': stat,
6389
6538
  'FileSystemMemory.writeFile': writeFile,
6390
6539
  'HandleBeforeUnload.handleBeforeUnload': handleBeforeUnload,
6540
+ 'HandleMessagePort.handleExtensionManagementMessagePort': handleExtensionManagementMessagePort,
6391
6541
  'HandleMessagePort.handleMessagePort': handleMessagePort,
6392
6542
  'HandleMessagePort.handleMessagePort2': handleMessagePort2,
6393
6543
  'IconTheme.getJson': getIconThemeJson,
@@ -6421,7 +6571,7 @@ const commandMap = {
6421
6571
  };
6422
6572
 
6423
6573
  const launchQuickPickWorker = async () => {
6424
- const rpc = await create$c({
6574
+ const rpc = await create$d({
6425
6575
  commandMap: commandMap,
6426
6576
  async send(port) {
6427
6577
  await sendMessagePortToQuickPickWorker(port, 0);
@@ -6431,7 +6581,7 @@ const launchQuickPickWorker = async () => {
6431
6581
  };
6432
6582
 
6433
6583
  const launchRendererWorker = async () => {
6434
- const rpc = await create$7({
6584
+ const rpc = await create$8({
6435
6585
  commandMap: commandMap
6436
6586
  });
6437
6587
  set$d(RendererWorker, rpc);