@lvce-editor/extension-management-worker 4.27.0 → 4.28.1

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.
@@ -2328,6 +2328,73 @@ const executeExtensionCommand = async (extensionsState, id, ...args) => {
2328
2328
  };
2329
2329
  };
2330
2330
 
2331
+ const hasUriScheme = value => {
2332
+ return /^[a-z][a-z\d+.-]*:/i.test(value);
2333
+ };
2334
+ const toExtensionBaseUri = extensionPath => {
2335
+ if (hasUriScheme(extensionPath)) {
2336
+ return extensionPath.endsWith('/') ? extensionPath : `${extensionPath}/`;
2337
+ }
2338
+ if (extensionPath.startsWith('/')) {
2339
+ return `file://${extensionPath}/`;
2340
+ }
2341
+ throw new Error(`Language server extension path must be an absolute path or URI`);
2342
+ };
2343
+ const resolveLanguageServerUri = (extension, languageServerUri) => {
2344
+ if (languageServerUri.startsWith('/')) {
2345
+ return `file://${languageServerUri}`;
2346
+ }
2347
+ if (hasUriScheme(languageServerUri)) {
2348
+ return languageServerUri;
2349
+ }
2350
+ const extensionPath = extension.uri || extension.path || '';
2351
+ return new URL(languageServerUri, toExtensionBaseUri(extensionPath)).href;
2352
+ };
2353
+ const getContribution = (extension, languageId) => {
2354
+ return extension.languageServers?.find(contribution => contribution.languageId === languageId);
2355
+ };
2356
+ const getRegisteredLanguageServer = (snapshot, contribution, languageId) => {
2357
+ const languageServer = snapshot.languageServers.find(registered => registered.id === contribution.id && registered.languageId === languageId);
2358
+ if (!languageServer) {
2359
+ throw new Error(`language server ${contribution.id || '<unknown>'} is contributed in extension.json but not registered`);
2360
+ }
2361
+ return languageServer;
2362
+ };
2363
+ const sanitizeCompletionItem = item => {
2364
+ if (!item || typeof item !== 'object' || typeof item.label !== 'string') {
2365
+ return undefined;
2366
+ }
2367
+ const snippet = item.insertText || item.textEdit?.newText || item.label;
2368
+ return {
2369
+ ...item,
2370
+ flags: 0,
2371
+ kind: typeof item.kind === 'number' ? item.kind : 0,
2372
+ label: item.label,
2373
+ matches: [],
2374
+ snippet
2375
+ };
2376
+ };
2377
+ const executeLanguageServerCompletion = async (rpc, extension, textDocument, offset) => {
2378
+ if (typeof textDocument.text !== 'string' || typeof textDocument.uri !== 'string') {
2379
+ return [];
2380
+ }
2381
+ const contribution = getContribution(extension, textDocument.languageId);
2382
+ if (!contribution) {
2383
+ return [];
2384
+ }
2385
+ const snapshot = await rpc.invoke('ExtensionApi.getLanguageServerRegistrySnapshot');
2386
+ const languageServer = getRegisteredLanguageServer(snapshot, contribution, textDocument.languageId);
2387
+ const uri = resolveLanguageServerUri(extension, languageServer.uri);
2388
+ const result = await invoke$1('LanguageServer.complete', {
2389
+ argv: languageServer.argv,
2390
+ id: `${extension.id || extension.uri || extension.path || 'extension'}.${languageServer.id}`,
2391
+ offset,
2392
+ textDocument,
2393
+ uri
2394
+ });
2395
+ return result.map(sanitizeCompletionItem).filter(item => item !== undefined);
2396
+ };
2397
+
2331
2398
  const getOrigin = () => {
2332
2399
  return globalThis.location?.origin || 'http://localhost';
2333
2400
  };
@@ -2353,13 +2420,23 @@ const getRpc$1 = async (extension, assetDir, platform) => {
2353
2420
  const contributesCompletionProvider = (extension, languageId) => {
2354
2421
  return Array.isArray(extension.completionProviders) && extension.completionProviders.some(provider => provider.languageId === languageId);
2355
2422
  };
2356
- const getMatchingExtensions$4 = async (extensionsState, textDocument, assetDir, platform) => {
2423
+ const contributesLanguageServer = (extension, languageId) => {
2424
+ return Array.isArray(extension.languageServers) && extension.languageServers.some(languageServer => languageServer.languageId === languageId);
2425
+ };
2426
+ const getMatchingExtensions$5 = async (extensionsState, textDocument, assetDir, platform) => {
2357
2427
  const extensions = await getAllExtensionsWithState(extensionsState, assetDir, platform);
2358
- return extensions.filter(extension => isExtensionIsolated(extension) && contributesCompletionProvider(extension, textDocument.languageId));
2428
+ return extensions.filter(extension => isExtensionIsolated(extension) && (contributesCompletionProvider(extension, textDocument.languageId) || contributesLanguageServer(extension, textDocument.languageId)));
2359
2429
  };
2360
2430
  const executeRpcCompletionProvider = async (rpc, textDocument, args) => {
2361
2431
  return rpc.invoke('ExtensionApi.executeCompletionProvider', textDocument, ...args);
2362
2432
  };
2433
+ const executeExtensionCompletionProvider = async (rpc, extension, textDocument, args) => {
2434
+ if (contributesLanguageServer(extension, textDocument.languageId)) {
2435
+ const offset = typeof args[0] === 'number' ? args[0] : 0;
2436
+ return executeLanguageServerCompletion(rpc, extension, textDocument, offset);
2437
+ }
2438
+ return executeRpcCompletionProvider(rpc, textDocument, args);
2439
+ };
2363
2440
  const executeRpcResolveCompletionItemProvider = async (rpc, textDocument, args) => {
2364
2441
  return rpc.invoke('ExtensionApi.executeResolveCompletionItemProvider', textDocument, ...args);
2365
2442
  };
@@ -2368,9 +2445,9 @@ const executeCompletionProvider = async (extensionsState, textDocument, ...args)
2368
2445
  assetDir,
2369
2446
  platform
2370
2447
  } = await getRuntimeContext('', extensionsState.platform);
2371
- const extensions = await getMatchingExtensions$4(extensionsState, textDocument, assetDir, platform);
2448
+ const extensions = await getMatchingExtensions$5(extensionsState, textDocument, assetDir, platform);
2372
2449
  const rpcs = await Promise.all(extensions.map(extension => getRpc$1(extension, assetDir, platform)));
2373
- const results = await Promise.all(rpcs.map(rpc => executeRpcCompletionProvider(rpc, textDocument, args)));
2450
+ const results = await Promise.all(rpcs.map((rpc, index) => executeExtensionCompletionProvider(rpc, extensions[index], textDocument, args)));
2374
2451
  return results[0] || [];
2375
2452
  };
2376
2453
  const executeResolveCompletionItemProvider = async (extensionsState, textDocument, ...args) => {
@@ -2378,7 +2455,8 @@ const executeResolveCompletionItemProvider = async (extensionsState, textDocumen
2378
2455
  assetDir,
2379
2456
  platform
2380
2457
  } = await getRuntimeContext('', extensionsState.platform);
2381
- const extensions = await getMatchingExtensions$4(extensionsState, textDocument, assetDir, platform);
2458
+ const matchingExtensions = await getMatchingExtensions$5(extensionsState, textDocument, assetDir, platform);
2459
+ const extensions = matchingExtensions.filter(extension => contributesCompletionProvider(extension, textDocument.languageId));
2382
2460
  const rpcs = await Promise.all(extensions.map(extension => getRpc$1(extension, assetDir, platform)));
2383
2461
  const results = await Promise.all(rpcs.map(rpc => executeRpcResolveCompletionItemProvider(rpc, textDocument, args)));
2384
2462
  return results[0];
@@ -2389,7 +2467,7 @@ const executeResolveCompletionItemProvider = async (extensionsState, textDocumen
2389
2467
  const contributesDiagnosticProvider = (extension, languageId) => {
2390
2468
  return Array.isArray(extension.diagnosticProviders) && extension.diagnosticProviders.some(provider => provider.languageId === languageId);
2391
2469
  };
2392
- const getMatchingExtensions$3 = async (extensionsState, textDocument, assetDir, platform) => {
2470
+ const getMatchingExtensions$4 = async (extensionsState, textDocument, assetDir, platform) => {
2393
2471
  const extensions = await getAllExtensionsWithState(extensionsState, assetDir, platform);
2394
2472
  return extensions.filter(extension => isExtensionIsolated(extension) && contributesDiagnosticProvider(extension, textDocument.languageId));
2395
2473
  };
@@ -2401,7 +2479,7 @@ const executeDiagnosticProvider = async (extensionsState, textDocument, ...args)
2401
2479
  assetDir,
2402
2480
  platform
2403
2481
  } = await getRuntimeContext('', extensionsState.platform);
2404
- const extensions = await getMatchingExtensions$3(extensionsState, textDocument, assetDir, platform);
2482
+ const extensions = await getMatchingExtensions$4(extensionsState, textDocument, assetDir, platform);
2405
2483
  const rpcs = await Promise.all(extensions.map(extension => getRpc$1(extension, assetDir, platform)));
2406
2484
  const results = await Promise.all(rpcs.map(rpc => executeRpcDiagnosticProvider(rpc, textDocument, args)));
2407
2485
  return results.flat();
@@ -2412,7 +2490,7 @@ const executeDiagnosticProvider = async (extensionsState, textDocument, ...args)
2412
2490
  const contributesFormattingProvider = (extension, languageId) => {
2413
2491
  return Array.isArray(extension.formattingProviders) && extension.formattingProviders.some(provider => provider.languageId === languageId);
2414
2492
  };
2415
- const getMatchingExtensions$2 = async (extensionsState, textDocument, assetDir, platform) => {
2493
+ const getMatchingExtensions$3 = async (extensionsState, textDocument, assetDir, platform) => {
2416
2494
  const extensions = await getAllExtensionsWithState(extensionsState, assetDir, platform);
2417
2495
  return extensions.filter(extension => isExtensionIsolated(extension) && contributesFormattingProvider(extension, textDocument.languageId));
2418
2496
  };
@@ -2424,7 +2502,7 @@ const executeFormattingProvider = async (extensionsState, textDocument, ...args)
2424
2502
  assetDir,
2425
2503
  platform
2426
2504
  } = await getRuntimeContext('', extensionsState.platform);
2427
- const extensions = await getMatchingExtensions$2(extensionsState, textDocument, assetDir, platform);
2505
+ const extensions = await getMatchingExtensions$3(extensionsState, textDocument, assetDir, platform);
2428
2506
  const rpcs = await Promise.all(extensions.map(extension => getRpc$1(extension, assetDir, platform)));
2429
2507
  const results = await Promise.all(rpcs.map(rpc => executeRpcFormattingProvider(rpc, textDocument, args)));
2430
2508
  return results[0] || [];
@@ -2435,7 +2513,7 @@ const executeFormattingProvider = async (extensionsState, textDocument, ...args)
2435
2513
  const contributesHoverProvider = (extension, languageId) => {
2436
2514
  return Array.isArray(extension.hoverProviders) && extension.hoverProviders.some(provider => provider.languageId === languageId);
2437
2515
  };
2438
- const getMatchingExtensions$1 = async (extensionsState, textDocument, assetDir, platform) => {
2516
+ const getMatchingExtensions$2 = async (extensionsState, textDocument, assetDir, platform) => {
2439
2517
  const extensions = await getAllExtensionsWithState(extensionsState, assetDir, platform);
2440
2518
  return extensions.filter(extension => isExtensionIsolated(extension) && contributesHoverProvider(extension, textDocument.languageId));
2441
2519
  };
@@ -2447,7 +2525,7 @@ const executeHoverProvider = async (extensionsState, textDocument, ...args) => {
2447
2525
  assetDir,
2448
2526
  platform
2449
2527
  } = await getRuntimeContext('', extensionsState.platform);
2450
- const extensions = await getMatchingExtensions$1(extensionsState, textDocument, assetDir, platform);
2528
+ const extensions = await getMatchingExtensions$2(extensionsState, textDocument, assetDir, platform);
2451
2529
  const rpcs = await Promise.all(extensions.map(extension => getRpc$1(extension, assetDir, platform)));
2452
2530
  const results = await Promise.all(rpcs.map(rpc => executeRpcHoverProvider(rpc, textDocument, args)));
2453
2531
  return results[0];
@@ -2469,7 +2547,7 @@ const contributesLanguageProvider = (extension, kind, languageId) => {
2469
2547
  const activationEvent = activationEventByKind[kind] || 'onLanguage';
2470
2548
  return Array.isArray(extension.activation) && extension.activation.includes(`${activationEvent}:${languageId}`);
2471
2549
  };
2472
- const getMatchingExtensions = async (extensionsState, kind, textDocument, assetDir, platform) => {
2550
+ const getMatchingExtensions$1 = async (extensionsState, kind, textDocument, assetDir, platform) => {
2473
2551
  const extensions = await getAllExtensionsWithState(extensionsState, assetDir, platform);
2474
2552
  return extensions.filter(extension => isExtensionIsolated(extension) && contributesLanguageProvider(extension, kind, textDocument.languageId));
2475
2553
  };
@@ -2481,7 +2559,7 @@ const executeLanguageProvider = async (extensionsState, kind, methodName, textDo
2481
2559
  assetDir,
2482
2560
  platform
2483
2561
  } = await getRuntimeContext('', extensionsState.platform);
2484
- const extensions = await getMatchingExtensions(extensionsState, kind, textDocument, assetDir, platform);
2562
+ const extensions = await getMatchingExtensions$1(extensionsState, kind, textDocument, assetDir, platform);
2485
2563
  if (extensions.length === 0) {
2486
2564
  return {
2487
2565
  found: false
@@ -2499,7 +2577,7 @@ const executeOrganizeImportsProvider = async (extensionsState, textDocument) =>
2499
2577
  assetDir,
2500
2578
  platform
2501
2579
  } = await getRuntimeContext('', extensionsState.platform);
2502
- const extensions = await getMatchingExtensions(extensionsState, 'code action', textDocument, assetDir, platform);
2580
+ const extensions = await getMatchingExtensions$1(extensionsState, 'code action', textDocument, assetDir, platform);
2503
2581
  if (extensions.length === 0) {
2504
2582
  return {
2505
2583
  found: false
@@ -2513,6 +2591,61 @@ const executeOrganizeImportsProvider = async (extensionsState, textDocument) =>
2513
2591
  };
2514
2592
  };
2515
2593
 
2594
+ /* eslint-disable @typescript-eslint/prefer-readonly-parameter-types */
2595
+
2596
+ const getProviderIds = extension => {
2597
+ if (!Array.isArray(extension.sourceControlProviders)) {
2598
+ return [];
2599
+ }
2600
+ return extension.sourceControlProviders.map(provider => provider.id).filter(id => typeof id === 'string');
2601
+ };
2602
+ const getMatchingExtensions = async (extensionsState, assetDir, platform) => {
2603
+ const extensions = await getAllExtensionsWithState(extensionsState, assetDir, platform);
2604
+ return extensions.filter(extension => !extension.disabled && isExtensionIsolated(extension) && getProviderIds(extension).length > 0);
2605
+ };
2606
+ const findExtension = (extensions, providerId) => {
2607
+ return extensions.find(extension => getProviderIds(extension).includes(providerId));
2608
+ };
2609
+ const isProviderActive = async (rpc, providerId, scheme, root) => {
2610
+ return rpc.invoke('ExtensionApi.executeSourceControlIsActive', providerId, scheme, root);
2611
+ };
2612
+ const getEnabledSourceControlProviderIds = async (extensionsState, scheme, root) => {
2613
+ const {
2614
+ assetDir,
2615
+ platform
2616
+ } = await getRuntimeContext('', extensionsState.platform);
2617
+ const extensions = await getMatchingExtensions(extensionsState, assetDir, platform);
2618
+ const enabledProviderIds = [];
2619
+ for (const extension of extensions) {
2620
+ const rpc = await getRpc$1(extension, assetDir, platform);
2621
+ for (const providerId of getProviderIds(extension)) {
2622
+ if (await isProviderActive(rpc, providerId, scheme, root)) {
2623
+ enabledProviderIds.push(providerId);
2624
+ }
2625
+ }
2626
+ }
2627
+ return enabledProviderIds;
2628
+ };
2629
+ const executeSourceControlProvider = async (extensionsState, providerId, methodName, ...args) => {
2630
+ const {
2631
+ assetDir,
2632
+ platform
2633
+ } = await getRuntimeContext('', extensionsState.platform);
2634
+ const extensions = await getMatchingExtensions(extensionsState, assetDir, platform);
2635
+ const extension = findExtension(extensions, providerId);
2636
+ if (!extension) {
2637
+ return {
2638
+ found: false
2639
+ };
2640
+ }
2641
+ const rpc = await getRpc$1(extension, assetDir, platform);
2642
+ const result = await rpc.invoke(`ExtensionApi.${methodName}`, providerId, ...args);
2643
+ return {
2644
+ found: true,
2645
+ result
2646
+ };
2647
+ };
2648
+
2516
2649
  const readFile = uri => {
2517
2650
  return readFile$1(uri);
2518
2651
  };
@@ -3330,6 +3463,7 @@ const commandMap = {
3330
3463
  'Extensions.executeLanguageProvider': wrapCommand(executeLanguageProvider),
3331
3464
  'Extensions.executeOrganizeImportsProvider': wrapCommand(executeOrganizeImportsProvider),
3332
3465
  'Extensions.executeResolveCompletionItemProvider': wrapCommand(executeResolveCompletionItemProvider),
3466
+ 'Extensions.executeSourceControlProvider': wrapCommand(executeSourceControlProvider),
3333
3467
  'Extensions.getAccessToken': getAccessToken,
3334
3468
  'Extensions.getAllExtensions': getAllExtensions,
3335
3469
  'Extensions.getColorThemeCss': getColorThemeCss,
@@ -3337,6 +3471,7 @@ const commandMap = {
3337
3471
  'Extensions.getColorThemeJson': getColorThemeJson,
3338
3472
  'Extensions.getColorThemeNames': getColorThemeNames,
3339
3473
  'Extensions.getDynamicWebExtensions': getDynamicWebExtensions,
3474
+ 'Extensions.getEnabledSourceControlProviderIds': wrapCommand(getEnabledSourceControlProviderIds),
3340
3475
  'Extensions.getExtension': getExtension,
3341
3476
  'Extensions.getKeyBindings': getKeyBindings,
3342
3477
  'Extensions.getLanguages': getLanguages,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/extension-management-worker",
3
- "version": "4.27.0",
3
+ "version": "4.28.1",
4
4
  "description": "Webworker for the Extension Management functionality in Lvce Editor.",
5
5
  "keywords": [
6
6
  "web-worker"