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
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 { 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
DisabledGlobally,
112
DisabledWorkspace,
113
EnabledGlobally,
114
EnabledWorkspace
115
}
116
117
export const IWorkbenchExtensionEnablementService = createDecorator<IWorkbenchExtensionEnablementService>('extensionEnablementService');
118
119
export interface IWorkbenchExtensionEnablementService {
120
readonly _serviceBrand: undefined;
121
122
/**
123
* Event to listen on for extension enablement changes
124
*/
125
readonly onEnablementChanged: Event<readonly IExtension[]>;
126
127
/**
128
* Returns the enablement state for the given extension
129
*/
130
getEnablementState(extension: IExtension): EnablementState;
131
132
/**
133
* Returns the enablement states for the given extensions
134
* @param extensions list of extensions
135
* @param workspaceTypeOverrides Workspace type overrides
136
*/
137
getEnablementStates(extensions: IExtension[], workspaceTypeOverrides?: { trusted?: boolean }): EnablementState[];
138
139
/**
140
* Returns the enablement states for the dependencies of the given extension
141
*/
142
getDependenciesEnablementStates(extension: IExtension): [IExtension, EnablementState][];
143
144
/**
145
* Returns `true` if the enablement can be changed.
146
*/
147
canChangeEnablement(extension: IExtension): boolean;
148
149
/**
150
* Returns `true` if the enablement can be changed.
151
*/
152
canChangeWorkspaceEnablement(extension: IExtension): boolean;
153
154
/**
155
* Returns `true` if the given extension is enabled.
156
*/
157
isEnabled(extension: IExtension): boolean;
158
159
/**
160
* Returns `true` if the given enablement state is enabled enablement state.
161
*/
162
isEnabledEnablementState(enablementState: EnablementState): boolean;
163
164
/**
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 will
169
*/
170
isDisabledGlobally(extension: IExtension): boolean;
171
172
/**
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 workspace
180
*/
181
setEnablement(extensions: IExtension[], state: EnablementState): Promise<boolean[]>;
182
183
/**
184
* Updates the enablement state of the extensions when workspace trust changes.
185
*/
186
updateExtensionsEnablementsWhenWorkspaceTrustChanges(): Promise<void>;
187
}
188
189
export interface IScannedExtension extends IExtension {
190
readonly metadata?: Metadata;
191
}
192
193
export type ScanOptions = { readonly skipInvalidExtensions?: boolean };
194
195
export const IWebExtensionsScannerService = createDecorator<IWebExtensionsScannerService>('IWebExtensionsScannerService');
196
export interface IWebExtensionsScannerService {
197
readonly _serviceBrand: undefined;
198
199
scanSystemExtensions(): Promise<IExtension[]>;
200
scanUserExtensions(profileLocation: URI, options?: ScanOptions): Promise<IScannedExtension[]>;
201
scanExtensionsUnderDevelopment(): Promise<IExtension[]>;
202
scanExistingExtension(extensionLocation: URI, extensionType: ExtensionType, profileLocation: URI): Promise<IScannedExtension | null>;
203
204
addExtension(location: URI, metadata: Metadata, profileLocation: URI): Promise<IScannedExtension>;
205
addExtensionFromGallery(galleryExtension: IGalleryExtension, metadata: Metadata, profileLocation: URI): Promise<IScannedExtension>;
206
removeExtension(extension: IScannedExtension, profileLocation: URI): Promise<void>;
207
copyExtensions(fromProfileLocation: URI, toProfileLocation: URI, filter: (extension: IScannedExtension) => boolean): Promise<void>;
208
209
updateMetadata(extension: IScannedExtension, metaData: Partial<Metadata>, profileLocation: URI): Promise<IScannedExtension>;
210
211
scanExtensionManifest(extensionLocation: URI): Promise<IExtensionManifest | null>;
212
}
213
214