@lvce-editor/extension-management-worker 4.28.0 → 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
- const getMatchingExtensions$4 = async (extensionsState, textDocument, assetDir, platform) => {
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
  }
@@ -2445,7 +2449,7 @@ const executeCompletionProvider = async (extensionsState, textDocument, ...args)
2445
2449
  assetDir,
2446
2450
  platform
2447
2451
  } = await getRuntimeContext('', extensionsState.platform);
2448
- const extensions = await getMatchingExtensions$4(extensionsState, textDocument, assetDir, platform);
2452
+ const extensions = await getMatchingExtensions$5(extensionsState, textDocument, assetDir, platform);
2449
2453
  const rpcs = await Promise.all(extensions.map(extension => getRpc$1(extension, assetDir, platform)));
2450
2454
  const results = await Promise.all(rpcs.map((rpc, index) => executeExtensionCompletionProvider(rpc, extensions[index], textDocument, args)));
2451
2455
  return results[0] || [];
@@ -2455,33 +2459,77 @@ const executeResolveCompletionItemProvider = async (extensionsState, textDocumen
2455
2459
  assetDir,
2456
2460
  platform
2457
2461
  } = await getRuntimeContext('', extensionsState.platform);
2458
- const matchingExtensions = await getMatchingExtensions$4(extensionsState, textDocument, assetDir, platform);
2462
+ const matchingExtensions = await getMatchingExtensions$5(extensionsState, textDocument, assetDir, platform);
2459
2463
  const extensions = matchingExtensions.filter(extension => contributesCompletionProvider(extension, textDocument.languageId));
2460
2464
  const rpcs = await Promise.all(extensions.map(extension => getRpc$1(extension, assetDir, platform)));
2461
2465
  const results = await Promise.all(rpcs.map(rpc => executeRpcResolveCompletionItemProvider(rpc, textDocument, args)));
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
  };
2470
- const getMatchingExtensions$3 = async (extensionsState, textDocument, assetDir, platform) => {
2509
+ const contributesLanguageServer = (extension, languageId) => {
2510
+ return Array.isArray(extension.languageServers) && extension.languageServers.some(languageServer => languageServer.languageId === languageId);
2511
+ };
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,
2480
2528
  platform
2481
2529
  } = await getRuntimeContext('', extensionsState.platform);
2482
- const extensions = await getMatchingExtensions$3(extensionsState, textDocument, assetDir, platform);
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
 
@@ -2490,7 +2538,7 @@ const executeDiagnosticProvider = async (extensionsState, textDocument, ...args)
2490
2538
  const contributesFormattingProvider = (extension, languageId) => {
2491
2539
  return Array.isArray(extension.formattingProviders) && extension.formattingProviders.some(provider => provider.languageId === languageId);
2492
2540
  };
2493
- const getMatchingExtensions$2 = async (extensionsState, textDocument, assetDir, platform) => {
2541
+ const getMatchingExtensions$3 = async (extensionsState, textDocument, assetDir, platform) => {
2494
2542
  const extensions = await getAllExtensionsWithState(extensionsState, assetDir, platform);
2495
2543
  return extensions.filter(extension => isExtensionIsolated(extension) && contributesFormattingProvider(extension, textDocument.languageId));
2496
2544
  };
@@ -2502,7 +2550,7 @@ const executeFormattingProvider = async (extensionsState, textDocument, ...args)
2502
2550
  assetDir,
2503
2551
  platform
2504
2552
  } = await getRuntimeContext('', extensionsState.platform);
2505
- const extensions = await getMatchingExtensions$2(extensionsState, textDocument, assetDir, platform);
2553
+ const extensions = await getMatchingExtensions$3(extensionsState, textDocument, assetDir, platform);
2506
2554
  const rpcs = await Promise.all(extensions.map(extension => getRpc$1(extension, assetDir, platform)));
2507
2555
  const results = await Promise.all(rpcs.map(rpc => executeRpcFormattingProvider(rpc, textDocument, args)));
2508
2556
  return results[0] || [];
@@ -2513,7 +2561,7 @@ const executeFormattingProvider = async (extensionsState, textDocument, ...args)
2513
2561
  const contributesHoverProvider = (extension, languageId) => {
2514
2562
  return Array.isArray(extension.hoverProviders) && extension.hoverProviders.some(provider => provider.languageId === languageId);
2515
2563
  };
2516
- const getMatchingExtensions$1 = async (extensionsState, textDocument, assetDir, platform) => {
2564
+ const getMatchingExtensions$2 = async (extensionsState, textDocument, assetDir, platform) => {
2517
2565
  const extensions = await getAllExtensionsWithState(extensionsState, assetDir, platform);
2518
2566
  return extensions.filter(extension => isExtensionIsolated(extension) && contributesHoverProvider(extension, textDocument.languageId));
2519
2567
  };
@@ -2525,7 +2573,7 @@ const executeHoverProvider = async (extensionsState, textDocument, ...args) => {
2525
2573
  assetDir,
2526
2574
  platform
2527
2575
  } = await getRuntimeContext('', extensionsState.platform);
2528
- const extensions = await getMatchingExtensions$1(extensionsState, textDocument, assetDir, platform);
2576
+ const extensions = await getMatchingExtensions$2(extensionsState, textDocument, assetDir, platform);
2529
2577
  const rpcs = await Promise.all(extensions.map(extension => getRpc$1(extension, assetDir, platform)));
2530
2578
  const results = await Promise.all(rpcs.map(rpc => executeRpcHoverProvider(rpc, textDocument, args)));
2531
2579
  return results[0];
@@ -2547,7 +2595,7 @@ const contributesLanguageProvider = (extension, kind, languageId) => {
2547
2595
  const activationEvent = activationEventByKind[kind] || 'onLanguage';
2548
2596
  return Array.isArray(extension.activation) && extension.activation.includes(`${activationEvent}:${languageId}`);
2549
2597
  };
2550
- const getMatchingExtensions = async (extensionsState, kind, textDocument, assetDir, platform) => {
2598
+ const getMatchingExtensions$1 = async (extensionsState, kind, textDocument, assetDir, platform) => {
2551
2599
  const extensions = await getAllExtensionsWithState(extensionsState, assetDir, platform);
2552
2600
  return extensions.filter(extension => isExtensionIsolated(extension) && contributesLanguageProvider(extension, kind, textDocument.languageId));
2553
2601
  };
@@ -2559,7 +2607,7 @@ const executeLanguageProvider = async (extensionsState, kind, methodName, textDo
2559
2607
  assetDir,
2560
2608
  platform
2561
2609
  } = await getRuntimeContext('', extensionsState.platform);
2562
- const extensions = await getMatchingExtensions(extensionsState, kind, textDocument, assetDir, platform);
2610
+ const extensions = await getMatchingExtensions$1(extensionsState, kind, textDocument, assetDir, platform);
2563
2611
  if (extensions.length === 0) {
2564
2612
  return {
2565
2613
  found: false
@@ -2577,7 +2625,7 @@ const executeOrganizeImportsProvider = async (extensionsState, textDocument) =>
2577
2625
  assetDir,
2578
2626
  platform
2579
2627
  } = await getRuntimeContext('', extensionsState.platform);
2580
- const extensions = await getMatchingExtensions(extensionsState, 'code action', textDocument, assetDir, platform);
2628
+ const extensions = await getMatchingExtensions$1(extensionsState, 'code action', textDocument, assetDir, platform);
2581
2629
  if (extensions.length === 0) {
2582
2630
  return {
2583
2631
  found: false
@@ -2591,6 +2639,61 @@ const executeOrganizeImportsProvider = async (extensionsState, textDocument) =>
2591
2639
  };
2592
2640
  };
2593
2641
 
2642
+ /* eslint-disable @typescript-eslint/prefer-readonly-parameter-types */
2643
+
2644
+ const getProviderIds = extension => {
2645
+ if (!Array.isArray(extension.sourceControlProviders)) {
2646
+ return [];
2647
+ }
2648
+ return extension.sourceControlProviders.map(provider => provider.id).filter(id => typeof id === 'string');
2649
+ };
2650
+ const getMatchingExtensions = async (extensionsState, assetDir, platform) => {
2651
+ const extensions = await getAllExtensionsWithState(extensionsState, assetDir, platform);
2652
+ return extensions.filter(extension => !extension.disabled && isExtensionIsolated(extension) && getProviderIds(extension).length > 0);
2653
+ };
2654
+ const findExtension = (extensions, providerId) => {
2655
+ return extensions.find(extension => getProviderIds(extension).includes(providerId));
2656
+ };
2657
+ const isProviderActive = async (rpc, providerId, scheme, root) => {
2658
+ return rpc.invoke('ExtensionApi.executeSourceControlIsActive', providerId, scheme, root);
2659
+ };
2660
+ const getEnabledSourceControlProviderIds = async (extensionsState, scheme, root) => {
2661
+ const {
2662
+ assetDir,
2663
+ platform
2664
+ } = await getRuntimeContext('', extensionsState.platform);
2665
+ const extensions = await getMatchingExtensions(extensionsState, assetDir, platform);
2666
+ const enabledProviderIds = [];
2667
+ for (const extension of extensions) {
2668
+ const rpc = await getRpc$1(extension, assetDir, platform);
2669
+ for (const providerId of getProviderIds(extension)) {
2670
+ if (await isProviderActive(rpc, providerId, scheme, root)) {
2671
+ enabledProviderIds.push(providerId);
2672
+ }
2673
+ }
2674
+ }
2675
+ return enabledProviderIds;
2676
+ };
2677
+ const executeSourceControlProvider = async (extensionsState, providerId, methodName, ...args) => {
2678
+ const {
2679
+ assetDir,
2680
+ platform
2681
+ } = await getRuntimeContext('', extensionsState.platform);
2682
+ const extensions = await getMatchingExtensions(extensionsState, assetDir, platform);
2683
+ const extension = findExtension(extensions, providerId);
2684
+ if (!extension) {
2685
+ return {
2686
+ found: false
2687
+ };
2688
+ }
2689
+ const rpc = await getRpc$1(extension, assetDir, platform);
2690
+ const result = await rpc.invoke(`ExtensionApi.${methodName}`, providerId, ...args);
2691
+ return {
2692
+ found: true,
2693
+ result
2694
+ };
2695
+ };
2696
+
2594
2697
  const readFile = uri => {
2595
2698
  return readFile$1(uri);
2596
2699
  };
@@ -3408,6 +3511,7 @@ const commandMap = {
3408
3511
  'Extensions.executeLanguageProvider': wrapCommand(executeLanguageProvider),
3409
3512
  'Extensions.executeOrganizeImportsProvider': wrapCommand(executeOrganizeImportsProvider),
3410
3513
  'Extensions.executeResolveCompletionItemProvider': wrapCommand(executeResolveCompletionItemProvider),
3514
+ 'Extensions.executeSourceControlProvider': wrapCommand(executeSourceControlProvider),
3411
3515
  'Extensions.getAccessToken': getAccessToken,
3412
3516
  'Extensions.getAllExtensions': getAllExtensions,
3413
3517
  'Extensions.getColorThemeCss': getColorThemeCss,
@@ -3415,6 +3519,7 @@ const commandMap = {
3415
3519
  'Extensions.getColorThemeJson': getColorThemeJson,
3416
3520
  'Extensions.getColorThemeNames': getColorThemeNames,
3417
3521
  'Extensions.getDynamicWebExtensions': getDynamicWebExtensions,
3522
+ 'Extensions.getEnabledSourceControlProviderIds': wrapCommand(getEnabledSourceControlProviderIds),
3418
3523
  'Extensions.getExtension': getExtension,
3419
3524
  'Extensions.getKeyBindings': getKeyBindings,
3420
3525
  'Extensions.getLanguages': getLanguages,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/extension-management-worker",
3
- "version": "4.28.0",
3
+ "version": "4.29.0",
4
4
  "description": "Webworker for the Extension Management functionality in Lvce Editor.",
5
5
  "keywords": [
6
6
  "web-worker"