Path: blob/main/src/vs/workbench/contrib/extensions/browser/extensionsQuickAccess.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { IQuickPickSeparator } from '../../../../platform/quickinput/common/quickInput.js';6import { IPickerQuickAccessItem, PickerQuickAccessProvider } from '../../../../platform/quickinput/browser/pickerQuickAccess.js';7import { CancellationToken } from '../../../../base/common/cancellation.js';8import { localize } from '../../../../nls.js';9import { IExtensionGalleryService, IExtensionManagementService, IGalleryExtension } from '../../../../platform/extensionManagement/common/extensionManagement.js';10import { INotificationService } from '../../../../platform/notification/common/notification.js';11import { ILogService } from '../../../../platform/log/common/log.js';12import { DisposableStore } from '../../../../base/common/lifecycle.js';13import { IExtensionsWorkbenchService } from '../common/extensions.js';1415export class InstallExtensionQuickAccessProvider extends PickerQuickAccessProvider<IPickerQuickAccessItem> {1617static PREFIX = 'ext install ';1819constructor(20@IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService,21@IExtensionGalleryService private readonly galleryService: IExtensionGalleryService,22@IExtensionManagementService private readonly extensionsService: IExtensionManagementService,23@INotificationService private readonly notificationService: INotificationService,24@ILogService private readonly logService: ILogService25) {26super(InstallExtensionQuickAccessProvider.PREFIX);27}2829protected _getPicks(filter: string, disposables: DisposableStore, token: CancellationToken): Array<IPickerQuickAccessItem | IQuickPickSeparator> | Promise<Array<IPickerQuickAccessItem | IQuickPickSeparator>> {3031// Nothing typed32if (!filter) {33return [{34label: localize('type', "Type an extension name to install or search.")35}];36}3738const genericSearchPickItem: IPickerQuickAccessItem = {39label: localize('searchFor', "Press Enter to search for extension '{0}'.", filter),40accept: () => this.extensionsWorkbenchService.openSearch(filter)41};4243// Extension ID typed: try to find it44if (/\./.test(filter)) {45return this.getPicksForExtensionId(filter, genericSearchPickItem, token);46}4748// Extension name typed: offer to search it49return [genericSearchPickItem];50}5152private async getPicksForExtensionId(filter: string, fallback: IPickerQuickAccessItem, token: CancellationToken): Promise<Array<IPickerQuickAccessItem | IQuickPickSeparator>> {53try {54const [galleryExtension] = await this.galleryService.getExtensions([{ id: filter }], token);55if (token.isCancellationRequested) {56return []; // return early if canceled57}5859if (!galleryExtension) {60return [fallback];61}6263return [{64label: localize('install', "Press Enter to install extension '{0}'.", filter),65accept: () => this.installExtension(galleryExtension, filter)66}];67} catch (error) {68if (token.isCancellationRequested) {69return []; // expected error70}7172this.logService.error(error);7374return [fallback];75}76}7778private async installExtension(extension: IGalleryExtension, name: string): Promise<void> {79try {80await this.extensionsWorkbenchService.openSearch(`@id:${name}`);81await this.extensionsService.installFromGallery(extension);82} catch (error) {83this.notificationService.error(error);84}85}86}8788export class ManageExtensionsQuickAccessProvider extends PickerQuickAccessProvider<IPickerQuickAccessItem> {8990static PREFIX = 'ext ';9192constructor(@IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService) {93super(ManageExtensionsQuickAccessProvider.PREFIX);94}9596protected _getPicks(): Array<IPickerQuickAccessItem | IQuickPickSeparator> {97return [{98label: localize('manage', "Press Enter to manage your extensions."),99accept: () => this.extensionsWorkbenchService.openSearch('')100}];101}102}103104105