Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts
5221 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 { Event } from '../../../../base/common/event.js';
7
import { createDecorator, refineServiceDecorator } from '../../../../platform/instantiation/common/instantiation.js';
8
import { IExtension, ExtensionType, IExtensionManifest, IExtensionIdentifier } from '../../../../platform/extensions/common/extensions.js';
9
import { IExtensionManagementService, IGalleryExtension, ILocalExtension, InstallOptions, InstallExtensionEvent, DidUninstallExtensionEvent, InstallExtensionResult, Metadata, UninstallExtensionEvent, DidUpdateExtensionMetadata, InstallExtensionInfo } from '../../../../platform/extensionManagement/common/extensionManagement.js';
10
import { URI } from '../../../../base/common/uri.js';
11
import { IMarkdownString } from '../../../../base/common/htmlContent.js';
12
13
export type DidChangeProfileEvent = { readonly added: ILocalExtension[]; readonly removed: ILocalExtension[] };
14
15
export const IProfileAwareExtensionManagementService = refineServiceDecorator<IExtensionManagementService, IProfileAwareExtensionManagementService>(IExtensionManagementService);
16
export interface IProfileAwareExtensionManagementService extends IExtensionManagementService {
17
readonly onProfileAwareDidInstallExtensions: Event<readonly InstallExtensionResult[]>;
18
readonly onProfileAwareDidUninstallExtension: Event<DidUninstallExtensionEvent>;
19
readonly onProfileAwareDidUpdateExtensionMetadata: Event<DidUpdateExtensionMetadata>;
20
readonly onDidChangeProfile: Event<DidChangeProfileEvent>;
21
}
22
23
export interface IExtensionManagementServer {
24
readonly id: string;
25
readonly label: string;
26
readonly extensionManagementService: IProfileAwareExtensionManagementService;
27
}
28
29
export const enum ExtensionInstallLocation {
30
Local = 1,
31
Remote,
32
Web
33
}
34
35
export const IExtensionManagementServerService = createDecorator<IExtensionManagementServerService>('extensionManagementServerService');
36
export interface IExtensionManagementServerService {
37
readonly _serviceBrand: undefined;
38
readonly localExtensionManagementServer: IExtensionManagementServer | null;
39
readonly remoteExtensionManagementServer: IExtensionManagementServer | null;
40
readonly webExtensionManagementServer: IExtensionManagementServer | null;
41
getExtensionManagementServer(extension: IExtension): IExtensionManagementServer | null;
42
getExtensionInstallLocation(extension: IExtension): ExtensionInstallLocation | null;
43
}
44
45
export interface IResourceExtension {
46
readonly type: 'resource';
47
readonly identifier: IExtensionIdentifier;
48
readonly location: URI;
49
readonly manifest: IExtensionManifest;
50
readonly readmeUri?: URI;
51
readonly changelogUri?: URI;
52
}
53
54
export type InstallExtensionOnServerEvent = InstallExtensionEvent & { server: IExtensionManagementServer };
55
export type UninstallExtensionOnServerEvent = UninstallExtensionEvent & { server: IExtensionManagementServer };
56
export type DidUninstallExtensionOnServerEvent = DidUninstallExtensionEvent & { server: IExtensionManagementServer };
57
export type DidChangeProfileForServerEvent = DidChangeProfileEvent & { server: IExtensionManagementServer };
58
59
export interface IPublisherInfo {
60
readonly publisher: string;
61
readonly publisherDisplayName: string;
62
}
63
64
export const IWorkbenchExtensionManagementService = refineServiceDecorator<IProfileAwareExtensionManagementService, IWorkbenchExtensionManagementService>(IProfileAwareExtensionManagementService);
65
export interface IWorkbenchExtensionManagementService extends IProfileAwareExtensionManagementService {
66
readonly _serviceBrand: undefined;
67
68
readonly onInstallExtension: Event<InstallExtensionOnServerEvent>;
69
readonly onDidInstallExtensions: Event<readonly InstallExtensionResult[]>;
70
readonly onUninstallExtension: Event<UninstallExtensionOnServerEvent>;
71
readonly onDidUninstallExtension: Event<DidUninstallExtensionOnServerEvent>;
72
readonly onDidChangeProfile: Event<DidChangeProfileForServerEvent>;
73
readonly onDidEnableExtensions: Event<IExtension[]>;
74
75
readonly onProfileAwareDidInstallExtensions: Event<readonly InstallExtensionResult[]>;
76
readonly onProfileAwareDidUninstallExtension: Event<DidUninstallExtensionOnServerEvent>;
77
readonly onProfileAwareDidUpdateExtensionMetadata: Event<DidUpdateExtensionMetadata>;
78
79
getExtensions(locations: URI[]): Promise<IResourceExtension[]>;
80
getInstalledWorkspaceExtensionLocations(): URI[];
81
getInstalledWorkspaceExtensions(includeInvalid: boolean): Promise<ILocalExtension[]>;
82
83
canInstall(extension: IGalleryExtension | IResourceExtension): Promise<true | IMarkdownString>;
84
85
getInstallableServers(extension: IGalleryExtension): Promise<IExtensionManagementServer[]>;
86
installVSIX(location: URI, manifest: IExtensionManifest, installOptions?: InstallOptions): Promise<ILocalExtension>;
87
installFromGallery(gallery: IGalleryExtension, installOptions?: InstallOptions, servers?: IExtensionManagementServer[]): Promise<ILocalExtension>;
88
installFromLocation(location: URI): Promise<ILocalExtension>;
89
installResourceExtension(extension: IResourceExtension, installOptions: InstallOptions): Promise<ILocalExtension>;
90
91
updateFromGallery(gallery: IGalleryExtension, extension: ILocalExtension, installOptions?: InstallOptions): Promise<ILocalExtension>;
92
updateMetadata(local: ILocalExtension, metadata: Partial<Metadata>): Promise<ILocalExtension>;
93
94
requestPublisherTrust(extensions: InstallExtensionInfo[]): Promise<void>;
95
isPublisherTrusted(extension: IGalleryExtension): boolean;
96
getTrustedPublishers(): IPublisherInfo[];
97
trustPublishers(...publishers: IPublisherInfo[]): void;
98
untrustPublishers(...publishers: string[]): void;
99
}
100
101
export const enum EnablementState {
102
DisabledByTrustRequirement,
103
DisabledByExtensionKind,
104
DisabledByEnvironment,
105
EnabledByEnvironment,
106
DisabledByMalicious,
107
DisabledByVirtualWorkspace,
108
DisabledByInvalidExtension,
109
DisabledByAllowlist,
110
DisabledByExtensionDependency,
111
DisabledByUnification, // Temporary TODO@benibenj remove when unification transition is complete
112
DisabledGlobally,
113
DisabledWorkspace,
114
EnabledGlobally,
115
EnabledWorkspace
116
}
117
118
export const IWorkbenchExtensionEnablementService = createDecorator<IWorkbenchExtensionEnablementService>('extensionEnablementService');
119
120
export interface IWorkbenchExtensionEnablementService {
121
readonly _serviceBrand: undefined;
122
123
/**
124
* Event to listen on for extension enablement changes
125
*/
126
readonly onEnablementChanged: Event<readonly IExtension[]>;
127
128
/**
129
* Returns the enablement state for the given extension
130
*/
131
getEnablementState(extension: IExtension): EnablementState;
132
133
/**
134
* Returns the enablement states for the given extensions
135
* @param extensions list of extensions
136
* @param workspaceTypeOverrides Workspace type overrides
137
*/
138
getEnablementStates(extensions: IExtension[], workspaceTypeOverrides?: { trusted?: boolean }): EnablementState[];
139
140
/**
141
* Returns the enablement states for the dependencies of the given extension
142
*/
143
getDependenciesEnablementStates(extension: IExtension): [IExtension, EnablementState][];
144
145
/**
146
* Returns `true` if the enablement can be changed.
147
*/
148
canChangeEnablement(extension: IExtension): boolean;
149
150
/**
151
* Returns `true` if the enablement can be changed.
152
*/
153
canChangeWorkspaceEnablement(extension: IExtension): boolean;
154
155
/**
156
* Returns `true` if the given extension is enabled.
157
*/
158
isEnabled(extension: IExtension): boolean;
159
160
/**
161
* Returns `true` if the given enablement state is enabled enablement state.
162
*/
163
isEnabledEnablementState(enablementState: EnablementState): boolean;
164
165
/**
166
* Returns `true` if the given extension identifier is disabled globally.
167
* Extensions can be disabled globally or in workspace or both.
168
* If an extension is disabled in both then enablement state shows only workspace.
169
* This will
170
*/
171
isDisabledGlobally(extension: IExtension): boolean;
172
173
/**
174
* Enable or disable the given extension.
175
* if `workspace` is `true` then enablement is done for workspace, otherwise globally.
176
*
177
* Returns a promise that resolves to boolean value.
178
* if resolves to `true` then requires restart for the change to take effect.
179
*
180
* Throws error if enablement is requested for workspace and there is no workspace
181
*/
182
setEnablement(extensions: IExtension[], state: EnablementState): Promise<boolean[]>;
183
184
/**
185
* Updates the enablement state of the extensions when workspace trust changes.
186
*/
187
updateExtensionsEnablementsWhenWorkspaceTrustChanges(): Promise<void>;
188
}
189
190
export interface IScannedExtension extends IExtension {
191
readonly metadata?: Metadata;
192
}
193
194
export type ScanOptions = { readonly skipInvalidExtensions?: boolean };
195
196
export const IWebExtensionsScannerService = createDecorator<IWebExtensionsScannerService>('IWebExtensionsScannerService');
197
export interface IWebExtensionsScannerService {
198
readonly _serviceBrand: undefined;
199
200
scanSystemExtensions(): Promise<IExtension[]>;
201
scanUserExtensions(profileLocation: URI, options?: ScanOptions): Promise<IScannedExtension[]>;
202
scanExtensionsUnderDevelopment(): Promise<IExtension[]>;
203
scanExistingExtension(extensionLocation: URI, extensionType: ExtensionType, profileLocation: URI): Promise<IScannedExtension | null>;
204
205
addExtension(location: URI, metadata: Metadata, profileLocation: URI): Promise<IScannedExtension>;
206
addExtensionFromGallery(galleryExtension: IGalleryExtension, metadata: Metadata, profileLocation: URI): Promise<IScannedExtension>;
207
removeExtension(extension: IScannedExtension, profileLocation: URI): Promise<void>;
208
copyExtensions(fromProfileLocation: URI, toProfileLocation: URI, filter: (extension: IScannedExtension) => boolean): Promise<void>;
209
210
updateMetadata(extension: IScannedExtension, metaData: Partial<Metadata>, profileLocation: URI): Promise<IScannedExtension>;
211
212
scanExtensionManifest(extensionLocation: URI): Promise<IExtensionManifest | null>;
213
}
214
215