Path: blob/main/src/vs/workbench/contrib/extensions/common/extensions.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 { createDecorator } from '../../../../platform/instantiation/common/instantiation.js';6import { Event } from '../../../../base/common/event.js';7import { IPager } from '../../../../base/common/paging.js';8import { IQueryOptions, ILocalExtension, IGalleryExtension, IExtensionIdentifier, IExtensionInfo, IExtensionQueryOptions, IDeprecationInfo, InstallExtensionResult, InstallOptions } from '../../../../platform/extensionManagement/common/extensionManagement.js';9import { EnablementState, IExtensionManagementServer, IResourceExtension } from '../../../services/extensionManagement/common/extensionManagement.js';10import { CancellationToken } from '../../../../base/common/cancellation.js';11import { Disposable, IDisposable } from '../../../../base/common/lifecycle.js';12import { areSameExtensions } from '../../../../platform/extensionManagement/common/extensionManagementUtil.js';13import { IExtensionManifest, ExtensionType } from '../../../../platform/extensions/common/extensions.js';14import { URI } from '../../../../base/common/uri.js';15import { IView, IViewPaneContainer } from '../../../common/views.js';16import { RawContextKey } from '../../../../platform/contextkey/common/contextkey.js';17import { IExtensionsStatus as IExtensionRuntimeStatus } from '../../../services/extensions/common/extensions.js';18import { IExtensionEditorOptions } from './extensionsInput.js';19import { MenuId } from '../../../../platform/actions/common/actions.js';20import { ProgressLocation } from '../../../../platform/progress/common/progress.js';21import { Severity } from '../../../../platform/notification/common/notification.js';22import { IMarkdownString } from '../../../../base/common/htmlContent.js';23import { localize2 } from '../../../../nls.js';24import { ExtensionGalleryManifestStatus } from '../../../../platform/extensionManagement/common/extensionGalleryManifest.js';2526export const VIEWLET_ID = 'workbench.view.extensions';27export const EXTENSIONS_CATEGORY = localize2('extensions', "Extensions");2829export interface IExtensionsViewPaneContainer extends IViewPaneContainer {30readonly searchValue: string | undefined;31search(text: string): void;32refresh(): Promise<void>;33}3435export interface IWorkspaceRecommendedExtensionsView extends IView {36installWorkspaceRecommendations(): Promise<void>;37}3839export const enum ExtensionState {40Installing,41Installed,42Uninstalling,43Uninstalled44}4546export const enum ExtensionRuntimeActionType {47ReloadWindow = 'reloadWindow',48RestartExtensions = 'restartExtensions',49DownloadUpdate = 'downloadUpdate',50ApplyUpdate = 'applyUpdate',51QuitAndInstall = 'quitAndInstall',52}5354export type ExtensionRuntimeState = { action: ExtensionRuntimeActionType; reason: string };5556export interface IExtension {57readonly type: ExtensionType;58readonly isBuiltin: boolean;59readonly isWorkspaceScoped: boolean;60readonly state: ExtensionState;61readonly name: string;62readonly displayName: string;63readonly identifier: IExtensionIdentifier;64readonly publisher: string;65readonly publisherDisplayName: string;66readonly publisherUrl?: URI;67readonly publisherDomain?: { link: string; verified: boolean };68readonly publisherSponsorLink?: URI;69readonly pinned: boolean;70readonly version: string;71readonly private: boolean;72readonly latestVersion: string;73readonly preRelease: boolean;74readonly isPreReleaseVersion: boolean;75readonly hasPreReleaseVersion: boolean;76readonly hasReleaseVersion: boolean;77readonly description: string;78readonly url?: string;79readonly repository?: string;80readonly supportUrl?: string;81readonly iconUrl?: string;82readonly iconUrlFallback?: string;83readonly licenseUrl?: string;84readonly installCount?: number;85readonly rating?: number;86readonly ratingCount?: number;87readonly ratingUrl?: string;88readonly outdated: boolean;89readonly outdatedTargetPlatform: boolean;90readonly runtimeState: ExtensionRuntimeState | undefined;91readonly enablementState: EnablementState;92readonly tags: readonly string[];93readonly categories: readonly string[];94readonly dependencies: string[];95readonly extensionPack: string[];96readonly telemetryData: any;97readonly preview: boolean;98getManifest(token: CancellationToken): Promise<IExtensionManifest | null>;99hasReadme(): boolean;100getReadme(token: CancellationToken): Promise<string>;101hasChangelog(): boolean;102getChangelog(token: CancellationToken): Promise<string>;103readonly server?: IExtensionManagementServer;104readonly local?: ILocalExtension;105gallery?: IGalleryExtension;106readonly resourceExtension?: IResourceExtension;107readonly isMalicious: boolean | undefined;108readonly maliciousInfoLink: string | undefined;109readonly deprecationInfo?: IDeprecationInfo;110readonly missingFromGallery?: boolean;111}112113export const IExtensionsWorkbenchService = createDecorator<IExtensionsWorkbenchService>('extensionsWorkbenchService');114115export interface InstallExtensionOptions extends InstallOptions {116version?: string;117justification?: string | { reason: string; action: string };118enable?: boolean;119installEverywhere?: boolean;120}121122export interface IExtensionsNotification {123readonly message: string;124readonly severity: Severity;125readonly extensions: IExtension[];126dismiss(): void;127}128129export interface IExtensionsWorkbenchService {130readonly _serviceBrand: undefined;131readonly onChange: Event<IExtension | undefined>;132readonly onReset: Event<void>;133readonly local: IExtension[];134readonly installed: IExtension[];135readonly outdated: IExtension[];136readonly whenInitialized: Promise<void>;137queryLocal(server?: IExtensionManagementServer): Promise<IExtension[]>;138queryGallery(token: CancellationToken): Promise<IPager<IExtension>>;139queryGallery(options: IQueryOptions, token: CancellationToken): Promise<IPager<IExtension>>;140getExtensions(extensionInfos: IExtensionInfo[], token: CancellationToken): Promise<IExtension[]>;141getExtensions(extensionInfos: IExtensionInfo[], options: IExtensionQueryOptions, token: CancellationToken): Promise<IExtension[]>;142getResourceExtensions(locations: URI[], isWorkspaceScoped: boolean): Promise<IExtension[]>;143canInstall(extension: IExtension): Promise<true | IMarkdownString>;144install(id: string, installOptions?: InstallExtensionOptions, progressLocation?: ProgressLocation | string): Promise<IExtension>;145install(vsix: URI, installOptions?: InstallExtensionOptions, progressLocation?: ProgressLocation | string): Promise<IExtension>;146install(extension: IExtension, installOptions?: InstallExtensionOptions, progressLocation?: ProgressLocation | string): Promise<IExtension>;147installInServer(extension: IExtension, server: IExtensionManagementServer, installOptions?: InstallOptions): Promise<void>;148downloadVSIX(extension: string, versionKind: 'prerelease' | 'release' | 'any'): Promise<void>;149uninstall(extension: IExtension): Promise<void>;150togglePreRelease(extension: IExtension): Promise<void>;151canSetLanguage(extension: IExtension): boolean;152setLanguage(extension: IExtension): Promise<void>;153setEnablement(extensions: IExtension | IExtension[], enablementState: EnablementState): Promise<void>;154isAutoUpdateEnabledFor(extensionOrPublisher: IExtension | string): boolean;155updateAutoUpdateEnablementFor(extensionOrPublisher: IExtension | string, enable: boolean): Promise<void>;156shouldRequireConsentToUpdate(extension: IExtension): Promise<string | undefined>;157updateAutoUpdateForAllExtensions(value: boolean): Promise<void>;158open(extension: IExtension | string, options?: IExtensionEditorOptions): Promise<void>;159openSearch(searchValue: string, focus?: boolean): Promise<void>;160getAutoUpdateValue(): AutoUpdateConfigurationValue;161checkForUpdates(): Promise<void>;162getExtensionRuntimeStatus(extension: IExtension): IExtensionRuntimeStatus | undefined;163updateAll(): Promise<InstallExtensionResult[]>;164updateRunningExtensions(message?: string): Promise<void>;165166readonly onDidChangeExtensionsNotification: Event<IExtensionsNotification | undefined>;167getExtensionsNotification(): IExtensionsNotification | undefined;168169// Sync APIs170isExtensionIgnoredToSync(extension: IExtension): boolean;171toggleExtensionIgnoredToSync(extension: IExtension): Promise<void>;172toggleApplyExtensionToAllProfiles(extension: IExtension): Promise<void>;173}174175export const enum ExtensionEditorTab {176Readme = 'readme',177Features = 'features',178Changelog = 'changelog',179Dependencies = 'dependencies',180ExtensionPack = 'extensionPack',181}182183export const ConfigurationKey = 'extensions';184export const AutoUpdateConfigurationKey = 'extensions.autoUpdate';185export const AutoCheckUpdatesConfigurationKey = 'extensions.autoCheckUpdates';186export const CloseExtensionDetailsOnViewChangeKey = 'extensions.closeExtensionDetailsOnViewChange';187export const AutoRestartConfigurationKey = 'extensions.autoRestart';188189export type AutoUpdateConfigurationValue = boolean | 'onlyEnabledExtensions' | 'onlySelectedExtensions';190191export interface IExtensionsConfiguration {192autoUpdate: boolean;193autoCheckUpdates: boolean;194ignoreRecommendations: boolean;195closeExtensionDetailsOnViewChange: boolean;196}197198export interface IExtensionContainer extends IDisposable {199extension: IExtension | null;200updateWhenCounterExtensionChanges?: boolean;201update(): void;202}203204export interface IExtensionsViewState {205onFocus: Event<IExtension>;206onBlur: Event<IExtension>;207filters: {208featureId?: string;209};210}211212export class ExtensionContainers extends Disposable {213214constructor(215private readonly containers: IExtensionContainer[],216@IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService217) {218super();219this._register(extensionsWorkbenchService.onChange(this.update, this));220}221222set extension(extension: IExtension) {223this.containers.forEach(c => c.extension = extension);224}225226private update(extension: IExtension | undefined): void {227for (const container of this.containers) {228if (extension && container.extension) {229if (areSameExtensions(container.extension.identifier, extension.identifier)) {230if (container.extension.server && extension.server && container.extension.server !== extension.server) {231if (container.updateWhenCounterExtensionChanges) {232container.update();233}234} else {235container.extension = extension;236}237}238} else {239container.update();240}241}242}243}244245export const WORKSPACE_RECOMMENDATIONS_VIEW_ID = 'workbench.views.extensions.workspaceRecommendations';246export const OUTDATED_EXTENSIONS_VIEW_ID = 'workbench.views.extensions.searchOutdated';247export const TOGGLE_IGNORE_EXTENSION_ACTION_ID = 'workbench.extensions.action.toggleIgnoreExtension';248export const SELECT_INSTALL_VSIX_EXTENSION_COMMAND_ID = 'workbench.extensions.action.installVSIX';249export const INSTALL_EXTENSION_FROM_VSIX_COMMAND_ID = 'workbench.extensions.command.installFromVSIX';250251export const LIST_WORKSPACE_UNSUPPORTED_EXTENSIONS_COMMAND_ID = 'workbench.extensions.action.listWorkspaceUnsupportedExtensions';252253// Context Keys254export const DefaultViewsContext = new RawContextKey<boolean>('defaultExtensionViews', true);255export const HasOutdatedExtensionsContext = new RawContextKey<boolean>('hasOutdatedExtensions', false);256export const CONTEXT_HAS_GALLERY = new RawContextKey<boolean>('hasGallery', false);257export const CONTEXT_EXTENSIONS_GALLERY_STATUS = new RawContextKey<string>('extensionsGalleryStatus', ExtensionGalleryManifestStatus.Unavailable);258export const ExtensionResultsListFocused = new RawContextKey<boolean>('extensionResultListFocused ', true);259export const SearchMcpServersContext = new RawContextKey<boolean>('searchMcpServers', false);260261// Context Menu Groups262export const THEME_ACTIONS_GROUP = '_theme_';263export const INSTALL_ACTIONS_GROUP = '0_install';264export const UPDATE_ACTIONS_GROUP = '0_update';265266export const extensionsSearchActionsMenu = new MenuId('extensionsSearchActionsMenu');267export const extensionsFilterSubMenu = new MenuId('extensionsFilterSubMenu');268269export interface IExtensionArg {270id: string;271version: string;272location: URI | undefined;273galleryLink: string | undefined;274}275276277