Path: blob/main/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts
5221 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 { Event } from '../../../../base/common/event.js';6import { createDecorator, refineServiceDecorator } from '../../../../platform/instantiation/common/instantiation.js';7import { IExtension, ExtensionType, IExtensionManifest, IExtensionIdentifier } from '../../../../platform/extensions/common/extensions.js';8import { IExtensionManagementService, IGalleryExtension, ILocalExtension, InstallOptions, InstallExtensionEvent, DidUninstallExtensionEvent, InstallExtensionResult, Metadata, UninstallExtensionEvent, DidUpdateExtensionMetadata, InstallExtensionInfo } from '../../../../platform/extensionManagement/common/extensionManagement.js';9import { URI } from '../../../../base/common/uri.js';10import { IMarkdownString } from '../../../../base/common/htmlContent.js';1112export type DidChangeProfileEvent = { readonly added: ILocalExtension[]; readonly removed: ILocalExtension[] };1314export const IProfileAwareExtensionManagementService = refineServiceDecorator<IExtensionManagementService, IProfileAwareExtensionManagementService>(IExtensionManagementService);15export interface IProfileAwareExtensionManagementService extends IExtensionManagementService {16readonly onProfileAwareDidInstallExtensions: Event<readonly InstallExtensionResult[]>;17readonly onProfileAwareDidUninstallExtension: Event<DidUninstallExtensionEvent>;18readonly onProfileAwareDidUpdateExtensionMetadata: Event<DidUpdateExtensionMetadata>;19readonly onDidChangeProfile: Event<DidChangeProfileEvent>;20}2122export interface IExtensionManagementServer {23readonly id: string;24readonly label: string;25readonly extensionManagementService: IProfileAwareExtensionManagementService;26}2728export const enum ExtensionInstallLocation {29Local = 1,30Remote,31Web32}3334export const IExtensionManagementServerService = createDecorator<IExtensionManagementServerService>('extensionManagementServerService');35export interface IExtensionManagementServerService {36readonly _serviceBrand: undefined;37readonly localExtensionManagementServer: IExtensionManagementServer | null;38readonly remoteExtensionManagementServer: IExtensionManagementServer | null;39readonly webExtensionManagementServer: IExtensionManagementServer | null;40getExtensionManagementServer(extension: IExtension): IExtensionManagementServer | null;41getExtensionInstallLocation(extension: IExtension): ExtensionInstallLocation | null;42}4344export interface IResourceExtension {45readonly type: 'resource';46readonly identifier: IExtensionIdentifier;47readonly location: URI;48readonly manifest: IExtensionManifest;49readonly readmeUri?: URI;50readonly changelogUri?: URI;51}5253export type InstallExtensionOnServerEvent = InstallExtensionEvent & { server: IExtensionManagementServer };54export type UninstallExtensionOnServerEvent = UninstallExtensionEvent & { server: IExtensionManagementServer };55export type DidUninstallExtensionOnServerEvent = DidUninstallExtensionEvent & { server: IExtensionManagementServer };56export type DidChangeProfileForServerEvent = DidChangeProfileEvent & { server: IExtensionManagementServer };5758export interface IPublisherInfo {59readonly publisher: string;60readonly publisherDisplayName: string;61}6263export const IWorkbenchExtensionManagementService = refineServiceDecorator<IProfileAwareExtensionManagementService, IWorkbenchExtensionManagementService>(IProfileAwareExtensionManagementService);64export interface IWorkbenchExtensionManagementService extends IProfileAwareExtensionManagementService {65readonly _serviceBrand: undefined;6667readonly onInstallExtension: Event<InstallExtensionOnServerEvent>;68readonly onDidInstallExtensions: Event<readonly InstallExtensionResult[]>;69readonly onUninstallExtension: Event<UninstallExtensionOnServerEvent>;70readonly onDidUninstallExtension: Event<DidUninstallExtensionOnServerEvent>;71readonly onDidChangeProfile: Event<DidChangeProfileForServerEvent>;72readonly onDidEnableExtensions: Event<IExtension[]>;7374readonly onProfileAwareDidInstallExtensions: Event<readonly InstallExtensionResult[]>;75readonly onProfileAwareDidUninstallExtension: Event<DidUninstallExtensionOnServerEvent>;76readonly onProfileAwareDidUpdateExtensionMetadata: Event<DidUpdateExtensionMetadata>;7778getExtensions(locations: URI[]): Promise<IResourceExtension[]>;79getInstalledWorkspaceExtensionLocations(): URI[];80getInstalledWorkspaceExtensions(includeInvalid: boolean): Promise<ILocalExtension[]>;8182canInstall(extension: IGalleryExtension | IResourceExtension): Promise<true | IMarkdownString>;8384getInstallableServers(extension: IGalleryExtension): Promise<IExtensionManagementServer[]>;85installVSIX(location: URI, manifest: IExtensionManifest, installOptions?: InstallOptions): Promise<ILocalExtension>;86installFromGallery(gallery: IGalleryExtension, installOptions?: InstallOptions, servers?: IExtensionManagementServer[]): Promise<ILocalExtension>;87installFromLocation(location: URI): Promise<ILocalExtension>;88installResourceExtension(extension: IResourceExtension, installOptions: InstallOptions): Promise<ILocalExtension>;8990updateFromGallery(gallery: IGalleryExtension, extension: ILocalExtension, installOptions?: InstallOptions): Promise<ILocalExtension>;91updateMetadata(local: ILocalExtension, metadata: Partial<Metadata>): Promise<ILocalExtension>;9293requestPublisherTrust(extensions: InstallExtensionInfo[]): Promise<void>;94isPublisherTrusted(extension: IGalleryExtension): boolean;95getTrustedPublishers(): IPublisherInfo[];96trustPublishers(...publishers: IPublisherInfo[]): void;97untrustPublishers(...publishers: string[]): void;98}99100export const enum EnablementState {101DisabledByTrustRequirement,102DisabledByExtensionKind,103DisabledByEnvironment,104EnabledByEnvironment,105DisabledByMalicious,106DisabledByVirtualWorkspace,107DisabledByInvalidExtension,108DisabledByAllowlist,109DisabledByExtensionDependency,110DisabledByUnification, // Temporary TODO@benibenj remove when unification transition is complete111DisabledGlobally,112DisabledWorkspace,113EnabledGlobally,114EnabledWorkspace115}116117export const IWorkbenchExtensionEnablementService = createDecorator<IWorkbenchExtensionEnablementService>('extensionEnablementService');118119export interface IWorkbenchExtensionEnablementService {120readonly _serviceBrand: undefined;121122/**123* Event to listen on for extension enablement changes124*/125readonly onEnablementChanged: Event<readonly IExtension[]>;126127/**128* Returns the enablement state for the given extension129*/130getEnablementState(extension: IExtension): EnablementState;131132/**133* Returns the enablement states for the given extensions134* @param extensions list of extensions135* @param workspaceTypeOverrides Workspace type overrides136*/137getEnablementStates(extensions: IExtension[], workspaceTypeOverrides?: { trusted?: boolean }): EnablementState[];138139/**140* Returns the enablement states for the dependencies of the given extension141*/142getDependenciesEnablementStates(extension: IExtension): [IExtension, EnablementState][];143144/**145* Returns `true` if the enablement can be changed.146*/147canChangeEnablement(extension: IExtension): boolean;148149/**150* Returns `true` if the enablement can be changed.151*/152canChangeWorkspaceEnablement(extension: IExtension): boolean;153154/**155* Returns `true` if the given extension is enabled.156*/157isEnabled(extension: IExtension): boolean;158159/**160* Returns `true` if the given enablement state is enabled enablement state.161*/162isEnabledEnablementState(enablementState: EnablementState): boolean;163164/**165* Returns `true` if the given extension identifier is disabled globally.166* Extensions can be disabled globally or in workspace or both.167* If an extension is disabled in both then enablement state shows only workspace.168* This will169*/170isDisabledGlobally(extension: IExtension): boolean;171172/**173* Enable or disable the given extension.174* if `workspace` is `true` then enablement is done for workspace, otherwise globally.175*176* Returns a promise that resolves to boolean value.177* if resolves to `true` then requires restart for the change to take effect.178*179* Throws error if enablement is requested for workspace and there is no workspace180*/181setEnablement(extensions: IExtension[], state: EnablementState): Promise<boolean[]>;182183/**184* Updates the enablement state of the extensions when workspace trust changes.185*/186updateExtensionsEnablementsWhenWorkspaceTrustChanges(): Promise<void>;187}188189export interface IScannedExtension extends IExtension {190readonly metadata?: Metadata;191}192193export type ScanOptions = { readonly skipInvalidExtensions?: boolean };194195export const IWebExtensionsScannerService = createDecorator<IWebExtensionsScannerService>('IWebExtensionsScannerService');196export interface IWebExtensionsScannerService {197readonly _serviceBrand: undefined;198199scanSystemExtensions(): Promise<IExtension[]>;200scanUserExtensions(profileLocation: URI, options?: ScanOptions): Promise<IScannedExtension[]>;201scanExtensionsUnderDevelopment(): Promise<IExtension[]>;202scanExistingExtension(extensionLocation: URI, extensionType: ExtensionType, profileLocation: URI): Promise<IScannedExtension | null>;203204addExtension(location: URI, metadata: Metadata, profileLocation: URI): Promise<IScannedExtension>;205addExtensionFromGallery(galleryExtension: IGalleryExtension, metadata: Metadata, profileLocation: URI): Promise<IScannedExtension>;206removeExtension(extension: IScannedExtension, profileLocation: URI): Promise<void>;207copyExtensions(fromProfileLocation: URI, toProfileLocation: URI, filter: (extension: IScannedExtension) => boolean): Promise<void>;208209updateMetadata(extension: IScannedExtension, metaData: Partial<Metadata>, profileLocation: URI): Promise<IScannedExtension>;210211scanExtensionManifest(extensionLocation: URI): Promise<IExtensionManifest | null>;212}213214215