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