Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/extensions/browser/extensionsQuickAccess.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { IQuickPickSeparator } from '../../../../platform/quickinput/common/quickInput.js';
7
import { IPickerQuickAccessItem, PickerQuickAccessProvider } from '../../../../platform/quickinput/browser/pickerQuickAccess.js';
8
import { CancellationToken } from '../../../../base/common/cancellation.js';
9
import { localize } from '../../../../nls.js';
10
import { IExtensionGalleryService, IExtensionManagementService, IGalleryExtension } from '../../../../platform/extensionManagement/common/extensionManagement.js';
11
import { INotificationService } from '../../../../platform/notification/common/notification.js';
12
import { ILogService } from '../../../../platform/log/common/log.js';
13
import { DisposableStore } from '../../../../base/common/lifecycle.js';
14
import { IExtensionsWorkbenchService } from '../common/extensions.js';
15
16
export class InstallExtensionQuickAccessProvider extends PickerQuickAccessProvider<IPickerQuickAccessItem> {
17
18
static PREFIX = 'ext install ';
19
20
constructor(
21
@IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService,
22
@IExtensionGalleryService private readonly galleryService: IExtensionGalleryService,
23
@IExtensionManagementService private readonly extensionsService: IExtensionManagementService,
24
@INotificationService private readonly notificationService: INotificationService,
25
@ILogService private readonly logService: ILogService
26
) {
27
super(InstallExtensionQuickAccessProvider.PREFIX);
28
}
29
30
protected _getPicks(filter: string, disposables: DisposableStore, token: CancellationToken): Array<IPickerQuickAccessItem | IQuickPickSeparator> | Promise<Array<IPickerQuickAccessItem | IQuickPickSeparator>> {
31
32
// Nothing typed
33
if (!filter) {
34
return [{
35
label: localize('type', "Type an extension name to install or search.")
36
}];
37
}
38
39
const genericSearchPickItem: IPickerQuickAccessItem = {
40
label: localize('searchFor', "Press Enter to search for extension '{0}'.", filter),
41
accept: () => this.extensionsWorkbenchService.openSearch(filter)
42
};
43
44
// Extension ID typed: try to find it
45
if (/\./.test(filter)) {
46
return this.getPicksForExtensionId(filter, genericSearchPickItem, token);
47
}
48
49
// Extension name typed: offer to search it
50
return [genericSearchPickItem];
51
}
52
53
private async getPicksForExtensionId(filter: string, fallback: IPickerQuickAccessItem, token: CancellationToken): Promise<Array<IPickerQuickAccessItem | IQuickPickSeparator>> {
54
try {
55
const [galleryExtension] = await this.galleryService.getExtensions([{ id: filter }], token);
56
if (token.isCancellationRequested) {
57
return []; // return early if canceled
58
}
59
60
if (!galleryExtension) {
61
return [fallback];
62
}
63
64
return [{
65
label: localize('install', "Press Enter to install extension '{0}'.", filter),
66
accept: () => this.installExtension(galleryExtension, filter)
67
}];
68
} catch (error) {
69
if (token.isCancellationRequested) {
70
return []; // expected error
71
}
72
73
this.logService.error(error);
74
75
return [fallback];
76
}
77
}
78
79
private async installExtension(extension: IGalleryExtension, name: string): Promise<void> {
80
try {
81
await this.extensionsWorkbenchService.openSearch(`@id:${name}`);
82
await this.extensionsService.installFromGallery(extension);
83
} catch (error) {
84
this.notificationService.error(error);
85
}
86
}
87
}
88
89
export class ManageExtensionsQuickAccessProvider extends PickerQuickAccessProvider<IPickerQuickAccessItem> {
90
91
static PREFIX = 'ext ';
92
93
constructor(@IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService) {
94
super(ManageExtensionsQuickAccessProvider.PREFIX);
95
}
96
97
protected _getPicks(): Array<IPickerQuickAccessItem | IQuickPickSeparator> {
98
return [{
99
label: localize('manage', "Press Enter to manage your extensions."),
100
accept: () => this.extensionsWorkbenchService.openSearch('')
101
}];
102
}
103
}
104
105