@lvce-editor/extension-management-worker 4.28.1 → 4.30.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.
@@ -2328,6 +2328,11 @@ const executeExtensionCommand = async (extensionsState, id, ...args) => {
2328
2328
  };
2329
2329
  };
2330
2330
 
2331
+ /* eslint-disable @typescript-eslint/prefer-readonly-parameter-types */
2332
+ const warn = (...args) => {
2333
+ console.warn(...args);
2334
+ };
2335
+
2331
2336
  const hasUriScheme = value => {
2332
2337
  return /^[a-z][a-z\d+.-]*:/i.test(value);
2333
2338
  };
@@ -2350,16 +2355,23 @@ const resolveLanguageServerUri = (extension, languageServerUri) => {
2350
2355
  const extensionPath = extension.uri || extension.path || '';
2351
2356
  return new URL(languageServerUri, toExtensionBaseUri(extensionPath)).href;
2352
2357
  };
2353
- const getContribution = (extension, languageId) => {
2354
- return extension.languageServers?.find(contribution => contribution.languageId === languageId);
2355
- };
2356
- const getRegisteredLanguageServer = (snapshot, contribution, languageId) => {
2358
+ const resolveLanguageServer = async (rpc, extension, languageId) => {
2359
+ const contribution = extension.languageServers?.find(item => item.languageId === languageId);
2360
+ if (!contribution) {
2361
+ return undefined;
2362
+ }
2363
+ const snapshot = await rpc.invoke('ExtensionApi.getLanguageServerRegistrySnapshot');
2357
2364
  const languageServer = snapshot.languageServers.find(registered => registered.id === contribution.id && registered.languageId === languageId);
2358
2365
  if (!languageServer) {
2359
2366
  throw new Error(`language server ${contribution.id || '<unknown>'} is contributed in extension.json but not registered`);
2360
2367
  }
2361
- return languageServer;
2368
+ return {
2369
+ argv: languageServer.argv,
2370
+ id: `${extension.id || extension.uri || extension.path || 'extension'}.${languageServer.id}`,
2371
+ uri: resolveLanguageServerUri(extension, languageServer.uri)
2372
+ };
2362
2373
  };
2374
+
2363
2375
  const sanitizeCompletionItem = item => {
2364
2376
  if (!item || typeof item !== 'object' || typeof item.label !== 'string') {
2365
2377
  return undefined;
@@ -2378,20 +2390,24 @@ const executeLanguageServerCompletion = async (rpc, extension, textDocument, off
2378
2390
  if (typeof textDocument.text !== 'string' || typeof textDocument.uri !== 'string') {
2379
2391
  return [];
2380
2392
  }
2381
- const contribution = getContribution(extension, textDocument.languageId);
2382
- if (!contribution) {
2393
+ const languageServer = await resolveLanguageServer(rpc, extension, textDocument.languageId);
2394
+ if (!languageServer) {
2395
+ return [];
2396
+ }
2397
+ let result;
2398
+ try {
2399
+ result = await invoke$1('LanguageServer.complete', {
2400
+ argv: languageServer.argv,
2401
+ id: languageServer.id,
2402
+ offset,
2403
+ textDocument,
2404
+ uri: languageServer.uri
2405
+ });
2406
+ } catch (error) {
2407
+ const message = error instanceof Error ? error.message : String(error);
2408
+ warn(`[Language Server] Completion failed: ${message}`);
2383
2409
  return [];
2384
2410
  }
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
2411
  return result.map(sanitizeCompletionItem).filter(item => item !== undefined);
2396
2412
  };
2397
2413
 
@@ -2420,18 +2436,18 @@ const getRpc$1 = async (extension, assetDir, platform) => {
2420
2436
  const contributesCompletionProvider = (extension, languageId) => {
2421
2437
  return Array.isArray(extension.completionProviders) && extension.completionProviders.some(provider => provider.languageId === languageId);
2422
2438
  };
2423
- const contributesLanguageServer = (extension, languageId) => {
2439
+ const contributesLanguageServer$1 = (extension, languageId) => {
2424
2440
  return Array.isArray(extension.languageServers) && extension.languageServers.some(languageServer => languageServer.languageId === languageId);
2425
2441
  };
2426
2442
  const getMatchingExtensions$5 = async (extensionsState, textDocument, assetDir, platform) => {
2427
2443
  const extensions = await getAllExtensionsWithState(extensionsState, assetDir, platform);
2428
- return extensions.filter(extension => isExtensionIsolated(extension) && (contributesCompletionProvider(extension, textDocument.languageId) || contributesLanguageServer(extension, textDocument.languageId)));
2444
+ return extensions.filter(extension => isExtensionIsolated(extension) && (contributesCompletionProvider(extension, textDocument.languageId) || contributesLanguageServer$1(extension, textDocument.languageId)));
2429
2445
  };
2430
2446
  const executeRpcCompletionProvider = async (rpc, textDocument, args) => {
2431
2447
  return rpc.invoke('ExtensionApi.executeCompletionProvider', textDocument, ...args);
2432
2448
  };
2433
2449
  const executeExtensionCompletionProvider = async (rpc, extension, textDocument, args) => {
2434
- if (contributesLanguageServer(extension, textDocument.languageId)) {
2450
+ if (contributesLanguageServer$1(extension, textDocument.languageId)) {
2435
2451
  const offset = typeof args[0] === 'number' ? args[0] : 0;
2436
2452
  return executeLanguageServerCompletion(rpc, extension, textDocument, offset);
2437
2453
  }
@@ -2462,18 +2478,62 @@ const executeResolveCompletionItemProvider = async (extensionsState, textDocumen
2462
2478
  return results[0];
2463
2479
  };
2464
2480
 
2481
+ const sanitizeDiagnostic = diagnostic => {
2482
+ const start = diagnostic?.range?.start;
2483
+ const end = diagnostic?.range?.end;
2484
+ if (typeof diagnostic?.message !== 'string' || typeof start?.line !== 'number' || typeof start.character !== 'number' || typeof end?.line !== 'number' || typeof end.character !== 'number') {
2485
+ return undefined;
2486
+ }
2487
+ return {
2488
+ columnIndex: start.character,
2489
+ endColumnIndex: end.character,
2490
+ endRowIndex: end.line,
2491
+ message: diagnostic.message,
2492
+ rowIndex: start.line,
2493
+ ...(typeof diagnostic.source === 'string' && {
2494
+ source: diagnostic.source
2495
+ }),
2496
+ type: diagnostic.severity === 1 ? 'error' : 'warning'
2497
+ };
2498
+ };
2499
+ const executeLanguageServerDiagnostic = async (rpc, extension, textDocument) => {
2500
+ if (typeof textDocument.text !== 'string' || typeof textDocument.uri !== 'string') {
2501
+ return [];
2502
+ }
2503
+ const languageServer = await resolveLanguageServer(rpc, extension, textDocument.languageId);
2504
+ if (!languageServer) {
2505
+ return [];
2506
+ }
2507
+ const result = await invoke$1('LanguageServer.diagnostic', {
2508
+ argv: languageServer.argv,
2509
+ id: languageServer.id,
2510
+ textDocument,
2511
+ uri: languageServer.uri
2512
+ });
2513
+ return result.map(sanitizeDiagnostic).filter(diagnostic => diagnostic !== undefined);
2514
+ };
2515
+
2465
2516
  /* eslint-disable @typescript-eslint/prefer-readonly-parameter-types */
2466
2517
 
2467
2518
  const contributesDiagnosticProvider = (extension, languageId) => {
2468
2519
  return Array.isArray(extension.diagnosticProviders) && extension.diagnosticProviders.some(provider => provider.languageId === languageId);
2469
2520
  };
2521
+ const contributesLanguageServer = (extension, languageId) => {
2522
+ return Array.isArray(extension.languageServers) && extension.languageServers.some(languageServer => languageServer.languageId === languageId);
2523
+ };
2470
2524
  const getMatchingExtensions$4 = async (extensionsState, textDocument, assetDir, platform) => {
2471
2525
  const extensions = await getAllExtensionsWithState(extensionsState, assetDir, platform);
2472
- return extensions.filter(extension => isExtensionIsolated(extension) && contributesDiagnosticProvider(extension, textDocument.languageId));
2526
+ return extensions.filter(extension => isExtensionIsolated(extension) && (contributesDiagnosticProvider(extension, textDocument.languageId) || contributesLanguageServer(extension, textDocument.languageId)));
2473
2527
  };
2474
2528
  const executeRpcDiagnosticProvider = async (rpc, textDocument, args) => {
2475
2529
  return rpc.invoke('ExtensionApi.executeDiagnosticProvider', textDocument, ...args);
2476
2530
  };
2531
+ const executeExtensionDiagnosticProvider = async (rpc, extension, textDocument, args) => {
2532
+ if (contributesLanguageServer(extension, textDocument.languageId)) {
2533
+ return executeLanguageServerDiagnostic(rpc, extension, textDocument);
2534
+ }
2535
+ return executeRpcDiagnosticProvider(rpc, textDocument, args);
2536
+ };
2477
2537
  const executeDiagnosticProvider = async (extensionsState, textDocument, ...args) => {
2478
2538
  const {
2479
2539
  assetDir,
@@ -2481,7 +2541,7 @@ const executeDiagnosticProvider = async (extensionsState, textDocument, ...args)
2481
2541
  } = await getRuntimeContext('', extensionsState.platform);
2482
2542
  const extensions = await getMatchingExtensions$4(extensionsState, textDocument, assetDir, platform);
2483
2543
  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)));
2544
+ const results = await Promise.all(rpcs.map((rpc, index) => executeExtensionDiagnosticProvider(rpc, extensions[index], textDocument, args)));
2485
2545
  return results.flat();
2486
2546
  };
2487
2547
 
@@ -2794,11 +2854,6 @@ const getAccessToken = () => {
2794
2854
  return invoke$6('Auth.getAccessToken');
2795
2855
  };
2796
2856
 
2797
- /* eslint-disable @typescript-eslint/prefer-readonly-parameter-types */
2798
- const warn = (...args) => {
2799
- console.warn(...args);
2800
- };
2801
-
2802
2857
  const transparent = (color, factor) => {
2803
2858
  return color;
2804
2859
  };
@@ -3243,6 +3298,8 @@ const toView = (extension, registeredView, assetDir, platform) => {
3243
3298
  const id = registeredView.id || '';
3244
3299
  const manifestView = getManifestView(extension, id);
3245
3300
  const css = getCss(extension, manifestView, assetDir, platform);
3301
+ const selector = Array.isArray(manifestView?.selector) ? manifestView.selector.filter(item => typeof item === 'string') : undefined;
3302
+ const type = typeof manifestView?.type === 'string' ? manifestView.type : undefined;
3246
3303
  return {
3247
3304
  ...(css && {
3248
3305
  css
@@ -3250,6 +3307,12 @@ const toView = (extension, registeredView, assetDir, platform) => {
3250
3307
  ...(registeredView.eventListeners && {
3251
3308
  eventListeners: registeredView.eventListeners
3252
3309
  }),
3310
+ ...(selector && {
3311
+ selector
3312
+ }),
3313
+ ...(type && {
3314
+ type
3315
+ }),
3253
3316
  extensionId: getExtensionId$1(extension),
3254
3317
  icon: getIcon(extension, manifestView, registeredView, assetDir, platform),
3255
3318
  id,
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.30.0",
4
4
  "description": "Webworker for the Extension Management functionality in Lvce Editor.",
5
5
  "keywords": [
6
6
  "web-worker"