@lvce-editor/extension-management-worker 4.28.1 → 4.29.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.
@@ -2350,16 +2350,23 @@ const resolveLanguageServerUri = (extension, languageServerUri) => {
2350
2350
  const extensionPath = extension.uri || extension.path || '';
2351
2351
  return new URL(languageServerUri, toExtensionBaseUri(extensionPath)).href;
2352
2352
  };
2353
- const getContribution = (extension, languageId) => {
2354
- return extension.languageServers?.find(contribution => contribution.languageId === languageId);
2355
- };
2356
- const getRegisteredLanguageServer = (snapshot, contribution, languageId) => {
2353
+ const resolveLanguageServer = async (rpc, extension, languageId) => {
2354
+ const contribution = extension.languageServers?.find(item => item.languageId === languageId);
2355
+ if (!contribution) {
2356
+ return undefined;
2357
+ }
2358
+ const snapshot = await rpc.invoke('ExtensionApi.getLanguageServerRegistrySnapshot');
2357
2359
  const languageServer = snapshot.languageServers.find(registered => registered.id === contribution.id && registered.languageId === languageId);
2358
2360
  if (!languageServer) {
2359
2361
  throw new Error(`language server ${contribution.id || '<unknown>'} is contributed in extension.json but not registered`);
2360
2362
  }
2361
- return languageServer;
2363
+ return {
2364
+ argv: languageServer.argv,
2365
+ id: `${extension.id || extension.uri || extension.path || 'extension'}.${languageServer.id}`,
2366
+ uri: resolveLanguageServerUri(extension, languageServer.uri)
2367
+ };
2362
2368
  };
2369
+
2363
2370
  const sanitizeCompletionItem = item => {
2364
2371
  if (!item || typeof item !== 'object' || typeof item.label !== 'string') {
2365
2372
  return undefined;
@@ -2378,19 +2385,16 @@ const executeLanguageServerCompletion = async (rpc, extension, textDocument, off
2378
2385
  if (typeof textDocument.text !== 'string' || typeof textDocument.uri !== 'string') {
2379
2386
  return [];
2380
2387
  }
2381
- const contribution = getContribution(extension, textDocument.languageId);
2382
- if (!contribution) {
2388
+ const languageServer = await resolveLanguageServer(rpc, extension, textDocument.languageId);
2389
+ if (!languageServer) {
2383
2390
  return [];
2384
2391
  }
2385
- const snapshot = await rpc.invoke('ExtensionApi.getLanguageServerRegistrySnapshot');
2386
- const languageServer = getRegisteredLanguageServer(snapshot, contribution, textDocument.languageId);
2387
- const uri = resolveLanguageServerUri(extension, languageServer.uri);
2388
2392
  const result = await invoke$1('LanguageServer.complete', {
2389
2393
  argv: languageServer.argv,
2390
- id: `${extension.id || extension.uri || extension.path || 'extension'}.${languageServer.id}`,
2394
+ id: languageServer.id,
2391
2395
  offset,
2392
2396
  textDocument,
2393
- uri
2397
+ uri: languageServer.uri
2394
2398
  });
2395
2399
  return result.map(sanitizeCompletionItem).filter(item => item !== undefined);
2396
2400
  };
@@ -2420,18 +2424,18 @@ const getRpc$1 = async (extension, assetDir, platform) => {
2420
2424
  const contributesCompletionProvider = (extension, languageId) => {
2421
2425
  return Array.isArray(extension.completionProviders) && extension.completionProviders.some(provider => provider.languageId === languageId);
2422
2426
  };
2423
- const contributesLanguageServer = (extension, languageId) => {
2427
+ const contributesLanguageServer$1 = (extension, languageId) => {
2424
2428
  return Array.isArray(extension.languageServers) && extension.languageServers.some(languageServer => languageServer.languageId === languageId);
2425
2429
  };
2426
2430
  const getMatchingExtensions$5 = async (extensionsState, textDocument, assetDir, platform) => {
2427
2431
  const extensions = await getAllExtensionsWithState(extensionsState, assetDir, platform);
2428
- return extensions.filter(extension => isExtensionIsolated(extension) && (contributesCompletionProvider(extension, textDocument.languageId) || contributesLanguageServer(extension, textDocument.languageId)));
2432
+ return extensions.filter(extension => isExtensionIsolated(extension) && (contributesCompletionProvider(extension, textDocument.languageId) || contributesLanguageServer$1(extension, textDocument.languageId)));
2429
2433
  };
2430
2434
  const executeRpcCompletionProvider = async (rpc, textDocument, args) => {
2431
2435
  return rpc.invoke('ExtensionApi.executeCompletionProvider', textDocument, ...args);
2432
2436
  };
2433
2437
  const executeExtensionCompletionProvider = async (rpc, extension, textDocument, args) => {
2434
- if (contributesLanguageServer(extension, textDocument.languageId)) {
2438
+ if (contributesLanguageServer$1(extension, textDocument.languageId)) {
2435
2439
  const offset = typeof args[0] === 'number' ? args[0] : 0;
2436
2440
  return executeLanguageServerCompletion(rpc, extension, textDocument, offset);
2437
2441
  }
@@ -2462,18 +2466,62 @@ const executeResolveCompletionItemProvider = async (extensionsState, textDocumen
2462
2466
  return results[0];
2463
2467
  };
2464
2468
 
2469
+ const sanitizeDiagnostic = diagnostic => {
2470
+ const start = diagnostic?.range?.start;
2471
+ const end = diagnostic?.range?.end;
2472
+ if (typeof diagnostic?.message !== 'string' || typeof start?.line !== 'number' || typeof start.character !== 'number' || typeof end?.line !== 'number' || typeof end.character !== 'number') {
2473
+ return undefined;
2474
+ }
2475
+ return {
2476
+ columnIndex: start.character,
2477
+ endColumnIndex: end.character,
2478
+ endRowIndex: end.line,
2479
+ message: diagnostic.message,
2480
+ rowIndex: start.line,
2481
+ ...(typeof diagnostic.source === 'string' && {
2482
+ source: diagnostic.source
2483
+ }),
2484
+ type: diagnostic.severity === 1 ? 'error' : 'warning'
2485
+ };
2486
+ };
2487
+ const executeLanguageServerDiagnostic = async (rpc, extension, textDocument) => {
2488
+ if (typeof textDocument.text !== 'string' || typeof textDocument.uri !== 'string') {
2489
+ return [];
2490
+ }
2491
+ const languageServer = await resolveLanguageServer(rpc, extension, textDocument.languageId);
2492
+ if (!languageServer) {
2493
+ return [];
2494
+ }
2495
+ const result = await invoke$1('LanguageServer.diagnostic', {
2496
+ argv: languageServer.argv,
2497
+ id: languageServer.id,
2498
+ textDocument,
2499
+ uri: languageServer.uri
2500
+ });
2501
+ return result.map(sanitizeDiagnostic).filter(diagnostic => diagnostic !== undefined);
2502
+ };
2503
+
2465
2504
  /* eslint-disable @typescript-eslint/prefer-readonly-parameter-types */
2466
2505
 
2467
2506
  const contributesDiagnosticProvider = (extension, languageId) => {
2468
2507
  return Array.isArray(extension.diagnosticProviders) && extension.diagnosticProviders.some(provider => provider.languageId === languageId);
2469
2508
  };
2509
+ const contributesLanguageServer = (extension, languageId) => {
2510
+ return Array.isArray(extension.languageServers) && extension.languageServers.some(languageServer => languageServer.languageId === languageId);
2511
+ };
2470
2512
  const getMatchingExtensions$4 = async (extensionsState, textDocument, assetDir, platform) => {
2471
2513
  const extensions = await getAllExtensionsWithState(extensionsState, assetDir, platform);
2472
- return extensions.filter(extension => isExtensionIsolated(extension) && contributesDiagnosticProvider(extension, textDocument.languageId));
2514
+ return extensions.filter(extension => isExtensionIsolated(extension) && (contributesDiagnosticProvider(extension, textDocument.languageId) || contributesLanguageServer(extension, textDocument.languageId)));
2473
2515
  };
2474
2516
  const executeRpcDiagnosticProvider = async (rpc, textDocument, args) => {
2475
2517
  return rpc.invoke('ExtensionApi.executeDiagnosticProvider', textDocument, ...args);
2476
2518
  };
2519
+ const executeExtensionDiagnosticProvider = async (rpc, extension, textDocument, args) => {
2520
+ if (contributesLanguageServer(extension, textDocument.languageId)) {
2521
+ return executeLanguageServerDiagnostic(rpc, extension, textDocument);
2522
+ }
2523
+ return executeRpcDiagnosticProvider(rpc, textDocument, args);
2524
+ };
2477
2525
  const executeDiagnosticProvider = async (extensionsState, textDocument, ...args) => {
2478
2526
  const {
2479
2527
  assetDir,
@@ -2481,7 +2529,7 @@ const executeDiagnosticProvider = async (extensionsState, textDocument, ...args)
2481
2529
  } = await getRuntimeContext('', extensionsState.platform);
2482
2530
  const extensions = await getMatchingExtensions$4(extensionsState, textDocument, assetDir, platform);
2483
2531
  const rpcs = await Promise.all(extensions.map(extension => getRpc$1(extension, assetDir, platform)));
2484
- const results = await Promise.all(rpcs.map(rpc => executeRpcDiagnosticProvider(rpc, textDocument, args)));
2532
+ const results = await Promise.all(rpcs.map((rpc, index) => executeExtensionDiagnosticProvider(rpc, extensions[index], textDocument, args)));
2485
2533
  return results.flat();
2486
2534
  };
2487
2535
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/extension-management-worker",
3
- "version": "4.28.1",
3
+ "version": "4.29.0",
4
4
  "description": "Webworker for the Extension Management functionality in Lvce Editor.",
5
5
  "keywords": [
6
6
  "web-worker"