@codingame/monaco-vscode-extension-gallery-service-override 1.83.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/extensionGallery.d.ts +12 -0
  2. package/extensionGallery.js +76 -0
  3. package/external/rollup-plugin-styles/dist/runtime/inject-css.js +3 -0
  4. package/external/tslib/tslib.es6.js +11 -0
  5. package/index.d.ts +1 -0
  6. package/index.js +1 -0
  7. package/override/vs/platform/dialogs/common/dialogs.js +8 -0
  8. package/package.json +30 -0
  9. package/vscode/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.js +784 -0
  10. package/vscode/src/vs/platform/extensionManagement/common/extensionEnablementService.js +142 -0
  11. package/vscode/src/vs/platform/extensionManagement/common/extensionGalleryService.js +855 -0
  12. package/vscode/src/vs/platform/extensionManagement/common/extensionManagementIpc.js +119 -0
  13. package/vscode/src/vs/platform/extensionManagement/common/extensionTipsService.js +57 -0
  14. package/vscode/src/vs/platform/extensionManagement/common/unsupportedExtensionsMigration.js +58 -0
  15. package/vscode/src/vs/platform/externalServices/common/marketplace.js +17 -0
  16. package/vscode/src/vs/workbench/contrib/extensions/browser/abstractRuntimeExtensionsEditor.js +492 -0
  17. package/vscode/src/vs/workbench/contrib/extensions/browser/browserRuntimeExtensionsEditor.js +28 -0
  18. package/vscode/src/vs/workbench/contrib/extensions/browser/configBasedRecommendations.js +78 -0
  19. package/vscode/src/vs/workbench/contrib/extensions/browser/deprecatedExtensionsChecker.js +87 -0
  20. package/vscode/src/vs/workbench/contrib/extensions/browser/exeBasedRecommendations.js +60 -0
  21. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionEditor.js +1868 -0
  22. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionEnablementWorkspaceTrustTransitionParticipant.js +52 -0
  23. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService.js +437 -0
  24. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionRecommendations.js +17 -0
  25. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionRecommendationsService.js +221 -0
  26. package/vscode/src/vs/workbench/contrib/extensions/browser/extensions.contribution.js +2063 -0
  27. package/vscode/src/vs/workbench/contrib/extensions/browser/extensions.web.contribution.js +13 -0
  28. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActivationProgress.js +46 -0
  29. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsCompletionItemsProvider.js +65 -0
  30. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsDependencyChecker.js +98 -0
  31. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsList.js +224 -0
  32. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsQuickAccess.js +121 -0
  33. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer.js +285 -0
  34. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.js +912 -0
  35. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews.js +1270 -0
  36. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.js +824 -0
  37. package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.js +1730 -0
  38. package/vscode/src/vs/workbench/contrib/extensions/browser/fileBasedRecommendations.js +324 -0
  39. package/vscode/src/vs/workbench/contrib/extensions/browser/keymapRecommendations.js +28 -0
  40. package/vscode/src/vs/workbench/contrib/extensions/browser/languageRecommendations.js +28 -0
  41. package/vscode/src/vs/workbench/contrib/extensions/browser/media/extension.css.js +6 -0
  42. package/vscode/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css.js +6 -0
  43. package/vscode/src/vs/workbench/contrib/extensions/browser/media/extensionsViewlet.css.js +6 -0
  44. package/vscode/src/vs/workbench/contrib/extensions/browser/media/extensionsWidgets.css.js +6 -0
  45. package/vscode/src/vs/workbench/contrib/extensions/browser/media/runtimeExtensionsEditor.css.js +6 -0
  46. package/vscode/src/vs/workbench/contrib/extensions/browser/remoteRecommendations.js +29 -0
  47. package/vscode/src/vs/workbench/contrib/extensions/browser/unsupportedExtensionsMigrationContribution.js +26 -0
  48. package/vscode/src/vs/workbench/contrib/extensions/browser/webRecommendations.js +38 -0
  49. package/vscode/src/vs/workbench/contrib/extensions/browser/workspaceRecommendations.js +88 -0
  50. package/vscode/src/vs/workbench/contrib/extensions/common/extensionQuery.js +67 -0
  51. package/vscode/src/vs/workbench/contrib/extensions/common/extensionsInput.js +43 -0
  52. package/vscode/src/vs/workbench/contrib/extensions/common/extensionsUtils.js +104 -0
  53. package/vscode/src/vs/workbench/contrib/extensions/common/reportExtensionIssueAction.js +31 -0
  54. package/vscode/src/vs/workbench/contrib/extensions/common/runtimeExtensionsInput.js +41 -0
  55. package/vscode/src/vs/workbench/contrib/markdown/browser/markdownDocumentRenderer.js +207 -0
  56. package/vscode/src/vs/workbench/contrib/update/common/update.js +3 -0
  57. package/vscode/src/vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.js +84 -0
  58. package/vscode/src/vs/workbench/services/extensionManagement/browser/extensionEnablementService.js +634 -0
  59. package/vscode/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.js +883 -0
  60. package/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagementChannelClient.js +109 -0
  61. package/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagementServerService.js +62 -0
  62. package/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagementService.js +633 -0
  63. package/vscode/src/vs/workbench/services/extensionManagement/common/remoteExtensionManagementService.js +58 -0
  64. package/vscode/src/vs/workbench/services/extensionManagement/common/webExtensionManagementService.js +269 -0
  65. package/vscode/src/vs/workbench/services/extensionRecommendations/common/extensionIgnoredRecommendationsService.js +83 -0
  66. package/vscode/src/vs/workbench/services/remote/common/remoteExtensionsScanner.js +73 -0
@@ -0,0 +1,1730 @@
1
+ import { __decorate, __param } from '../../../../../../../external/tslib/tslib.es6.js';
2
+ import * as nls from 'monaco-editor/esm/vs/nls.js';
3
+ import { gt, eq } from 'vscode-semver';
4
+ import { Emitter, Event } from 'monaco-editor/esm/vs/base/common/event.js';
5
+ import { index } from 'monaco-editor/esm/vs/base/common/arrays.js';
6
+ import { ThrottledDelayer, Promises, createCancelablePromise } from 'monaco-editor/esm/vs/base/common/async.js';
7
+ import { CancellationError, isCancellationError } from 'monaco-editor/esm/vs/base/common/errors.js';
8
+ import { Disposable, toDisposable } from 'monaco-editor/esm/vs/base/common/lifecycle.js';
9
+ import { singlePagePager } from 'monaco-editor/esm/vs/base/common/paging.js';
10
+ import { ITelemetryService } from 'monaco-editor/esm/vs/platform/telemetry/common/telemetry.js';
11
+ import { WEB_EXTENSION_TAG, isTargetPlatformCompatible, IExtensionGalleryService } from 'vscode/vscode/vs/platform/extensionManagement/common/extensionManagement';
12
+ import { DefaultIconPath, IWorkbenchExtensionEnablementService, IWorkbenchExtensionManagementService, IExtensionManagementServerService } from 'vscode/vscode/vs/workbench/services/extensionManagement/common/extensionManagement';
13
+ import { areSameExtensions, groupByExtension, getGalleryExtensionId, getGalleryExtensionTelemetryData, getLocalExtensionTelemetryData, ExtensionKey } from 'vscode/vscode/vs/platform/extensionManagement/common/extensionManagementUtil';
14
+ import { IInstantiationService } from 'monaco-editor/esm/vs/platform/instantiation/common/instantiation.js';
15
+ import { IConfigurationService } from 'monaco-editor/esm/vs/platform/configuration/common/configuration.js';
16
+ import { IHostService } from 'vscode/vscode/vs/workbench/services/host/browser/host';
17
+ import { URI } from 'monaco-editor/esm/vs/base/common/uri.js';
18
+ import { HasOutdatedExtensionsContext, AutoUpdateConfigurationKey, AutoCheckUpdatesConfigurationKey } from 'vscode/vscode/vs/workbench/contrib/extensions/common/extensions';
19
+ import { SIDE_GROUP, ACTIVE_GROUP, IEditorService } from 'vscode/vscode/vs/workbench/services/editor/common/editorService';
20
+ import { IURLService } from 'vscode/vscode/vs/platform/url/common/url';
21
+ import { ExtensionsInput } from '../common/extensionsInput.js';
22
+ import { ILogService } from 'monaco-editor/esm/vs/platform/log/common/log.js';
23
+ import { IProgressService } from 'monaco-editor/esm/vs/platform/progress/common/progress.js';
24
+ import { Severity, INotificationService } from 'monaco-editor/esm/vs/platform/notification/common/notification.js';
25
+ import * as resources from 'monaco-editor/esm/vs/base/common/resources.js';
26
+ import { CancellationToken } from 'monaco-editor/esm/vs/base/common/cancellation.js';
27
+ import { IStorageService } from 'monaco-editor/esm/vs/platform/storage/common/storage.js';
28
+ import { IFileService } from 'monaco-editor/esm/vs/platform/files/common/files.js';
29
+ import { ExtensionIdentifier, isApplicationScopedExtension } from 'monaco-editor/esm/vs/platform/extensions/common/extensions.js';
30
+ import { ILanguageService } from 'monaco-editor/esm/vs/editor/common/languages/language.js';
31
+ import { IProductService } from 'monaco-editor/esm/vs/platform/product/common/productService.js';
32
+ import { FileAccess } from 'monaco-editor/esm/vs/base/common/network.js';
33
+ import { IIgnoredExtensionsManagementService } from 'vscode/vscode/vs/platform/userDataSync/common/ignoredExtensions';
34
+ import { IUserDataAutoSyncService } from 'vscode/vscode/vs/platform/userDataSync/common/userDataSync';
35
+ import { IContextKeyService } from 'monaco-editor/esm/vs/platform/contextkey/common/contextkey.js';
36
+ import { isUndefined, isBoolean } from 'monaco-editor/esm/vs/base/common/types.js';
37
+ import { IExtensionManifestPropertiesService } from 'vscode/vscode/vs/workbench/services/extensions/common/extensionManifestPropertiesService';
38
+ import { toExtension, toExtensionDescription, IExtensionService } from 'vscode/vscode/vs/workbench/services/extensions/common/extensions';
39
+ import { ExtensionEditor } from './extensionEditor.js';
40
+ import { isWeb, language } from 'monaco-editor/esm/vs/base/common/platform.js';
41
+ import { getLocale } from 'vscode/vscode/vs/platform/languagePacks/common/languagePacks';
42
+ import { ILocaleService } from 'vscode/vscode/vs/workbench/services/localization/common/locale';
43
+ import { TelemetryTrustedValue } from 'vscode/vscode/vs/platform/telemetry/common/telemetryUtils';
44
+ import { ILifecycleService } from 'vscode/vscode/vs/workbench/services/lifecycle/common/lifecycle';
45
+ import { IUserDataProfileService } from 'vscode/vscode/vs/workbench/services/userDataProfile/common/userDataProfile';
46
+
47
+ var Extensions_1, ExtensionsWorkbenchService_1;
48
+ let Extension = class Extension {
49
+ constructor(stateProvider, runtimeStateProvider, server, local, gallery, galleryService, telemetryService, logService, fileService, productService) {
50
+ this.stateProvider = stateProvider;
51
+ this.runtimeStateProvider = runtimeStateProvider;
52
+ this.server = server;
53
+ this.local = local;
54
+ this.gallery = gallery;
55
+ this.galleryService = galleryService;
56
+ this.telemetryService = telemetryService;
57
+ this.logService = logService;
58
+ this.fileService = fileService;
59
+ this.productService = productService;
60
+ this.enablementState = 8 ;
61
+ this.isMalicious = false;
62
+ }
63
+ get type() {
64
+ return this.local ? this.local.type : 1 ;
65
+ }
66
+ get isBuiltin() {
67
+ return this.local ? this.local.isBuiltin : false;
68
+ }
69
+ get name() {
70
+ return this.gallery ? this.gallery.name : this.local.manifest.name;
71
+ }
72
+ get displayName() {
73
+ if (this.gallery) {
74
+ return this.gallery.displayName || this.gallery.name;
75
+ }
76
+ return this.local.manifest.displayName || this.local.manifest.name;
77
+ }
78
+ get identifier() {
79
+ if (this.gallery) {
80
+ return this.gallery.identifier;
81
+ }
82
+ return this.local.identifier;
83
+ }
84
+ get uuid() {
85
+ return this.gallery ? this.gallery.identifier.uuid : this.local.identifier.uuid;
86
+ }
87
+ get publisher() {
88
+ return this.gallery ? this.gallery.publisher : this.local.manifest.publisher;
89
+ }
90
+ get publisherDisplayName() {
91
+ if (this.gallery) {
92
+ return this.gallery.publisherDisplayName || this.gallery.publisher;
93
+ }
94
+ if (this.local?.publisherDisplayName) {
95
+ return this.local.publisherDisplayName;
96
+ }
97
+ return this.local.manifest.publisher;
98
+ }
99
+ get publisherUrl() {
100
+ if (!this.productService.extensionsGallery || !this.gallery) {
101
+ return undefined;
102
+ }
103
+ return resources.joinPath(( URI.parse(this.productService.extensionsGallery.publisherUrl)), this.publisher);
104
+ }
105
+ get publisherDomain() {
106
+ return this.gallery?.publisherDomain;
107
+ }
108
+ get publisherSponsorLink() {
109
+ return this.gallery?.publisherSponsorLink ? ( URI.parse(this.gallery.publisherSponsorLink)) : undefined;
110
+ }
111
+ get version() {
112
+ return this.local ? this.local.manifest.version : this.latestVersion;
113
+ }
114
+ get pinned() {
115
+ return !!this.local?.pinned;
116
+ }
117
+ get latestVersion() {
118
+ return this.gallery ? this.gallery.version : this.local.manifest.version;
119
+ }
120
+ get description() {
121
+ return this.gallery ? this.gallery.description : this.local.manifest.description || '';
122
+ }
123
+ get url() {
124
+ if (!this.productService.extensionsGallery || !this.gallery) {
125
+ return undefined;
126
+ }
127
+ return `${this.productService.extensionsGallery.itemUrl}?itemName=${this.publisher}.${this.name}`;
128
+ }
129
+ get iconUrl() {
130
+ return this.galleryIconUrl || this.localIconUrl || this.defaultIconUrl;
131
+ }
132
+ get iconUrlFallback() {
133
+ return this.galleryIconUrlFallback || this.localIconUrl || this.defaultIconUrl;
134
+ }
135
+ get localIconUrl() {
136
+ if (this.local && this.local.manifest.icon) {
137
+ return ( FileAccess.uriToBrowserUri(resources.joinPath(this.local.location, this.local.manifest.icon)).toString(true));
138
+ }
139
+ return null;
140
+ }
141
+ get galleryIconUrl() {
142
+ return this.gallery?.assets.icon ? this.gallery.assets.icon.uri : null;
143
+ }
144
+ get galleryIconUrlFallback() {
145
+ return this.gallery?.assets.icon ? this.gallery.assets.icon.fallbackUri : null;
146
+ }
147
+ get defaultIconUrl() {
148
+ if (this.type === 0 && this.local) {
149
+ if (this.local.manifest && this.local.manifest.contributes) {
150
+ if (Array.isArray(this.local.manifest.contributes.themes) && this.local.manifest.contributes.themes.length) {
151
+ return ( ( FileAccess.asBrowserUri('vs/workbench/contrib/extensions/browser/media/theme-icon.png')).toString(true));
152
+ }
153
+ if (Array.isArray(this.local.manifest.contributes.grammars) && this.local.manifest.contributes.grammars.length) {
154
+ return ( ( FileAccess.asBrowserUri('vs/workbench/contrib/extensions/browser/media/language-icon.svg')).toString(true));
155
+ }
156
+ }
157
+ }
158
+ return DefaultIconPath;
159
+ }
160
+ get repository() {
161
+ return this.gallery && this.gallery.assets.repository ? this.gallery.assets.repository.uri : undefined;
162
+ }
163
+ get licenseUrl() {
164
+ return this.gallery && this.gallery.assets.license ? this.gallery.assets.license.uri : undefined;
165
+ }
166
+ get state() {
167
+ return this.stateProvider(this);
168
+ }
169
+ get installCount() {
170
+ return this.gallery ? this.gallery.installCount : undefined;
171
+ }
172
+ get rating() {
173
+ return this.gallery ? this.gallery.rating : undefined;
174
+ }
175
+ get ratingCount() {
176
+ return this.gallery ? this.gallery.ratingCount : undefined;
177
+ }
178
+ get outdated() {
179
+ try {
180
+ if (!this.gallery || !this.local) {
181
+ return false;
182
+ }
183
+ if (this.type === 0 && this.productService.quality === 'stable') {
184
+ return false;
185
+ }
186
+ if (!this.local.preRelease && this.gallery.properties.isPreReleaseVersion) {
187
+ return false;
188
+ }
189
+ if (gt(this.latestVersion, this.version)) {
190
+ return true;
191
+ }
192
+ if (this.outdatedTargetPlatform) {
193
+ return true;
194
+ }
195
+ }
196
+ catch (error) {
197
+ }
198
+ return false;
199
+ }
200
+ get outdatedTargetPlatform() {
201
+ return !!this.local && !!this.gallery
202
+ && !["undefined" , "web" ].includes(this.local.targetPlatform)
203
+ && this.gallery.properties.targetPlatform !== "web"
204
+ && this.local.targetPlatform !== this.gallery.properties.targetPlatform
205
+ && eq(this.latestVersion, this.version);
206
+ }
207
+ get reloadRequiredStatus() {
208
+ return this.runtimeStateProvider(this);
209
+ }
210
+ get telemetryData() {
211
+ const { local, gallery } = this;
212
+ if (gallery) {
213
+ return getGalleryExtensionTelemetryData(gallery);
214
+ }
215
+ else {
216
+ return getLocalExtensionTelemetryData(local);
217
+ }
218
+ }
219
+ get preview() {
220
+ return this.local?.manifest.preview ?? this.gallery?.preview ?? false;
221
+ }
222
+ get hasPreReleaseVersion() {
223
+ return !!this.gallery?.hasPreReleaseVersion;
224
+ }
225
+ get hasReleaseVersion() {
226
+ return !!this.gallery?.hasReleaseVersion;
227
+ }
228
+ getLocal() {
229
+ return this.local && !this.outdated ? this.local : undefined;
230
+ }
231
+ async getManifest(token) {
232
+ const local = this.getLocal();
233
+ if (local) {
234
+ return local.manifest;
235
+ }
236
+ if (this.gallery) {
237
+ if (this.gallery.assets.manifest) {
238
+ return this.galleryService.getManifest(this.gallery, token);
239
+ }
240
+ this.logService.error(( nls.localizeWithPath(
241
+ 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService',
242
+ 'Manifest is not found',
243
+ "Manifest is not found"
244
+ )), this.identifier.id);
245
+ return null;
246
+ }
247
+ return null;
248
+ }
249
+ hasReadme() {
250
+ if (this.local && this.local.readmeUrl) {
251
+ return true;
252
+ }
253
+ if (this.gallery && this.gallery.assets.readme) {
254
+ return true;
255
+ }
256
+ return this.type === 0 ;
257
+ }
258
+ async getReadme(token) {
259
+ const local = this.getLocal();
260
+ if (local?.readmeUrl) {
261
+ const content = await this.fileService.readFile(local.readmeUrl);
262
+ return ( content.value.toString());
263
+ }
264
+ if (this.gallery) {
265
+ if (this.gallery.assets.readme) {
266
+ return this.galleryService.getReadme(this.gallery, token);
267
+ }
268
+ this.telemetryService.publicLog('extensions:NotFoundReadMe', this.telemetryData);
269
+ }
270
+ if (this.type === 0 ) {
271
+ return Promise.resolve(`# ${this.displayName || this.name}
272
+ **Notice:** This extension is bundled with Visual Studio Code. It can be disabled but not uninstalled.
273
+ ## Features
274
+ ${this.description}
275
+ `);
276
+ }
277
+ return Promise.reject(( new Error('not available')));
278
+ }
279
+ hasChangelog() {
280
+ if (this.local && this.local.changelogUrl) {
281
+ return true;
282
+ }
283
+ if (this.gallery && this.gallery.assets.changelog) {
284
+ return true;
285
+ }
286
+ return this.type === 0 ;
287
+ }
288
+ async getChangelog(token) {
289
+ const local = this.getLocal();
290
+ if (local?.changelogUrl) {
291
+ const content = await this.fileService.readFile(local.changelogUrl);
292
+ return ( content.value.toString());
293
+ }
294
+ if (this.gallery?.assets.changelog) {
295
+ return this.galleryService.getChangelog(this.gallery, token);
296
+ }
297
+ if (this.type === 0 ) {
298
+ return Promise.resolve('Please check the [VS Code Release Notes](command:update.showCurrentReleaseNotes) for changes to the built-in extensions.');
299
+ }
300
+ return Promise.reject(( new Error('not available')));
301
+ }
302
+ get categories() {
303
+ const { local, gallery } = this;
304
+ if (local && local.manifest.categories && !this.outdated) {
305
+ return local.manifest.categories;
306
+ }
307
+ if (gallery) {
308
+ return gallery.categories;
309
+ }
310
+ return [];
311
+ }
312
+ get tags() {
313
+ const { gallery } = this;
314
+ if (gallery) {
315
+ return gallery.tags.filter(tag => !tag.startsWith('_'));
316
+ }
317
+ return [];
318
+ }
319
+ get dependencies() {
320
+ const { local, gallery } = this;
321
+ if (local && local.manifest.extensionDependencies && !this.outdated) {
322
+ return local.manifest.extensionDependencies;
323
+ }
324
+ if (gallery) {
325
+ return gallery.properties.dependencies || [];
326
+ }
327
+ return [];
328
+ }
329
+ get extensionPack() {
330
+ const { local, gallery } = this;
331
+ if (local && local.manifest.extensionPack && !this.outdated) {
332
+ return local.manifest.extensionPack;
333
+ }
334
+ if (gallery) {
335
+ return gallery.properties.extensionPack || [];
336
+ }
337
+ return [];
338
+ }
339
+ };
340
+ Extension = ( __decorate([
341
+ ( __param(5, IExtensionGalleryService)),
342
+ ( __param(6, ITelemetryService)),
343
+ ( __param(7, ILogService)),
344
+ ( __param(8, IFileService)),
345
+ ( __param(9, IProductService))
346
+ ], Extension));
347
+ let Extensions = Extensions_1 = class Extensions extends Disposable {
348
+ static updateExtensionFromControlManifest(extension, extensionsControlManifest) {
349
+ extension.isMalicious = ( extensionsControlManifest.malicious.some(identifier => areSameExtensions(extension.identifier, identifier)));
350
+ extension.deprecationInfo = extensionsControlManifest.deprecated ? extensionsControlManifest.deprecated[extension.identifier.id.toLowerCase()] : undefined;
351
+ }
352
+ get onChange() { return this._onChange.event; }
353
+ get onReset() { return this._onReset.event; }
354
+ constructor(server, stateProvider, runtimeStateProvider, galleryService, extensionEnablementService, storageService, telemetryService, instantiationService) {
355
+ super();
356
+ this.server = server;
357
+ this.stateProvider = stateProvider;
358
+ this.runtimeStateProvider = runtimeStateProvider;
359
+ this.galleryService = galleryService;
360
+ this.extensionEnablementService = extensionEnablementService;
361
+ this.storageService = storageService;
362
+ this.telemetryService = telemetryService;
363
+ this.instantiationService = instantiationService;
364
+ this._onChange = this._register(( new Emitter()));
365
+ this._onReset = this._register(( new Emitter()));
366
+ this.installing = [];
367
+ this.uninstalling = [];
368
+ this.installed = [];
369
+ this._register(server.extensionManagementService.onInstallExtension(e => this.onInstallExtension(e)));
370
+ this._register(server.extensionManagementService.onDidInstallExtensions(e => this.onDidInstallExtensions(e)));
371
+ this._register(server.extensionManagementService.onUninstallExtension(e => this.onUninstallExtension(e.identifier)));
372
+ this._register(server.extensionManagementService.onDidUninstallExtension(e => this.onDidUninstallExtension(e)));
373
+ this._register(server.extensionManagementService.onDidUpdateExtensionMetadata(e => this.onDidUpdateExtensionMetadata(e)));
374
+ this._register(server.extensionManagementService.onDidChangeProfile(() => this.reset()));
375
+ this._register(extensionEnablementService.onEnablementChanged(e => this.onEnablementChanged(e)));
376
+ this._register(Event.any(this.onChange, this.onReset)(() => this._local = undefined));
377
+ }
378
+ get local() {
379
+ if (!this._local) {
380
+ this._local = [];
381
+ for (const extension of this.installed) {
382
+ this._local.push(extension);
383
+ }
384
+ for (const extension of this.installing) {
385
+ if (!( this.installed.some(installed => areSameExtensions(installed.identifier, extension.identifier)))) {
386
+ this._local.push(extension);
387
+ }
388
+ }
389
+ }
390
+ return this._local;
391
+ }
392
+ async queryInstalled() {
393
+ await this.fetchInstalledExtensions();
394
+ this._onChange.fire(undefined);
395
+ return this.local;
396
+ }
397
+ async syncInstalledExtensionsWithGallery(galleryExtensions) {
398
+ let hasChanged = false;
399
+ const extensions = await this.mapInstalledExtensionWithCompatibleGalleryExtension(galleryExtensions);
400
+ for (const [extension, gallery] of extensions) {
401
+ if (extension.local && !extension.local.identifier.uuid) {
402
+ extension.local = await this.updateMetadata(extension.local, gallery);
403
+ }
404
+ if (!extension.gallery || extension.gallery.version !== gallery.version || extension.gallery.properties.targetPlatform !== gallery.properties.targetPlatform) {
405
+ extension.gallery = gallery;
406
+ this._onChange.fire({ extension });
407
+ hasChanged = true;
408
+ }
409
+ }
410
+ return hasChanged;
411
+ }
412
+ async mapInstalledExtensionWithCompatibleGalleryExtension(galleryExtensions) {
413
+ const mappedExtensions = this.mapInstalledExtensionWithGalleryExtension(galleryExtensions);
414
+ const targetPlatform = await this.server.extensionManagementService.getTargetPlatform();
415
+ const compatibleGalleryExtensions = [];
416
+ const compatibleGalleryExtensionsToFetch = [];
417
+ await Promise.allSettled(( mappedExtensions.map(async ([extension, gallery]) => {
418
+ if (extension.local) {
419
+ if (await this.galleryService.isExtensionCompatible(gallery, extension.local.preRelease, targetPlatform)) {
420
+ compatibleGalleryExtensions.push(gallery);
421
+ }
422
+ else {
423
+ compatibleGalleryExtensionsToFetch.push({ ...extension.local.identifier, preRelease: extension.local.preRelease });
424
+ }
425
+ }
426
+ })));
427
+ if (compatibleGalleryExtensionsToFetch.length) {
428
+ const result = await this.galleryService.getExtensions(compatibleGalleryExtensionsToFetch, { targetPlatform, compatible: true, queryAllVersions: true }, CancellationToken.None);
429
+ compatibleGalleryExtensions.push(...result);
430
+ }
431
+ return this.mapInstalledExtensionWithGalleryExtension(compatibleGalleryExtensions);
432
+ }
433
+ mapInstalledExtensionWithGalleryExtension(galleryExtensions) {
434
+ const mappedExtensions = [];
435
+ const byUUID = ( new Map()), byID = ( new Map());
436
+ for (const gallery of galleryExtensions) {
437
+ byUUID.set(gallery.identifier.uuid, gallery);
438
+ byID.set(gallery.identifier.id.toLowerCase(), gallery);
439
+ }
440
+ for (const installed of this.installed) {
441
+ if (installed.uuid) {
442
+ const gallery = byUUID.get(installed.uuid);
443
+ if (gallery) {
444
+ mappedExtensions.push([installed, gallery]);
445
+ continue;
446
+ }
447
+ }
448
+ const gallery = byID.get(installed.identifier.id.toLowerCase());
449
+ if (gallery) {
450
+ mappedExtensions.push([installed, gallery]);
451
+ }
452
+ }
453
+ return mappedExtensions;
454
+ }
455
+ async updateMetadata(localExtension, gallery) {
456
+ let isPreReleaseVersion = false;
457
+ if (localExtension.manifest.version !== gallery.version) {
458
+ this.telemetryService.publicLog2('galleryService:updateMetadata');
459
+ const galleryWithLocalVersion = (await this.galleryService.getExtensions([{ ...localExtension.identifier, version: localExtension.manifest.version }], CancellationToken.None))[0];
460
+ isPreReleaseVersion = !!galleryWithLocalVersion?.properties?.isPreReleaseVersion;
461
+ }
462
+ return this.server.extensionManagementService.updateMetadata(localExtension, { id: gallery.identifier.uuid, publisherDisplayName: gallery.publisherDisplayName, publisherId: gallery.publisherId, isPreReleaseVersion });
463
+ }
464
+ canInstall(galleryExtension) {
465
+ return this.server.extensionManagementService.canInstall(galleryExtension);
466
+ }
467
+ onInstallExtension(event) {
468
+ const { source } = event;
469
+ if (source && !URI.isUri(source)) {
470
+ const extension = this.installed.filter(e => areSameExtensions(e.identifier, source.identifier))[0]
471
+ || this.instantiationService.createInstance(Extension, this.stateProvider, this.runtimeStateProvider, this.server, undefined, source);
472
+ this.installing.push(extension);
473
+ this._onChange.fire({ extension });
474
+ }
475
+ }
476
+ async fetchInstalledExtensions() {
477
+ const extensionsControlManifest = await this.server.extensionManagementService.getExtensionsControlManifest();
478
+ const all = await this.migrateIgnoredAutoUpdateExtensions(await this.server.extensionManagementService.getInstalled());
479
+ const installed = groupByExtension(all, r => r.identifier).reduce((result, extensions) => {
480
+ const extension = extensions.length === 1 ? extensions[0]
481
+ : extensions.find(e => e.type === 1 ) || extensions.find(e => e.type === 0 );
482
+ result.push(extension);
483
+ return result;
484
+ }, []);
485
+ const byId = index(this.installed, e => e.local ? e.local.identifier.id : e.identifier.id);
486
+ this.installed = ( installed.map(local => {
487
+ const extension = byId[local.identifier.id] || this.instantiationService.createInstance(Extension, this.stateProvider, this.runtimeStateProvider, this.server, local, undefined);
488
+ extension.local = local;
489
+ extension.enablementState = this.extensionEnablementService.getEnablementState(local);
490
+ Extensions_1.updateExtensionFromControlManifest(extension, extensionsControlManifest);
491
+ return extension;
492
+ }));
493
+ }
494
+ async migrateIgnoredAutoUpdateExtensions(extensions) {
495
+ const ignoredAutoUpdateExtensions = JSON.parse(this.storageService.get('extensions.ignoredAutoUpdateExtension', 0 , '[]') || '[]');
496
+ if (!ignoredAutoUpdateExtensions.length) {
497
+ return extensions;
498
+ }
499
+ const result = await Promise.all(( extensions.map(extension => {
500
+ if (ignoredAutoUpdateExtensions.indexOf(( ( new ExtensionKey(extension.identifier, extension.manifest.version)).toString())) !== -1) {
501
+ return this.server.extensionManagementService.updateMetadata(extension, { pinned: true });
502
+ }
503
+ return extension;
504
+ })));
505
+ this.storageService.remove('extensions.ignoredAutoUpdateExtension', 0 );
506
+ return result;
507
+ }
508
+ async reset() {
509
+ this.installed = [];
510
+ this.installing = [];
511
+ this.uninstalling = [];
512
+ await this.fetchInstalledExtensions();
513
+ this._onReset.fire();
514
+ }
515
+ async onDidInstallExtensions(results) {
516
+ for (const event of results) {
517
+ const { local, source } = event;
518
+ const gallery = source && !URI.isUri(source) ? source : undefined;
519
+ const location = source && URI.isUri(source) ? source : undefined;
520
+ const installingExtension = gallery ? this.installing.filter(e => areSameExtensions(e.identifier, gallery.identifier))[0] : null;
521
+ this.installing = installingExtension ? this.installing.filter(e => e !== installingExtension) : this.installing;
522
+ let extension = installingExtension ? installingExtension
523
+ : (location || local) ? this.instantiationService.createInstance(Extension, this.stateProvider, this.runtimeStateProvider, this.server, local, undefined)
524
+ : undefined;
525
+ if (extension) {
526
+ if (local) {
527
+ const installed = this.installed.filter(e => areSameExtensions(e.identifier, extension.identifier))[0];
528
+ if (installed) {
529
+ extension = installed;
530
+ }
531
+ else {
532
+ this.installed.push(extension);
533
+ }
534
+ extension.local = local;
535
+ if (!extension.gallery) {
536
+ extension.gallery = gallery;
537
+ }
538
+ Extensions_1.updateExtensionFromControlManifest(extension, await this.server.extensionManagementService.getExtensionsControlManifest());
539
+ extension.enablementState = this.extensionEnablementService.getEnablementState(local);
540
+ }
541
+ }
542
+ this._onChange.fire(!local || !extension ? undefined : { extension, operation: event.operation });
543
+ if (extension && extension.local && !extension.gallery) {
544
+ await this.syncInstalledExtensionWithGallery(extension);
545
+ }
546
+ }
547
+ }
548
+ async onDidUpdateExtensionMetadata(local) {
549
+ const extension = this.installed.find(e => areSameExtensions(e.identifier, local.identifier));
550
+ if (extension?.local) {
551
+ const hasChanged = extension.local.pinned !== local.pinned;
552
+ extension.local = local;
553
+ if (hasChanged) {
554
+ this._onChange.fire({ extension });
555
+ }
556
+ }
557
+ }
558
+ async syncInstalledExtensionWithGallery(extension) {
559
+ if (!this.galleryService.isEnabled()) {
560
+ return;
561
+ }
562
+ this.telemetryService.publicLog2('galleryService:matchInstalledExtension');
563
+ const [compatible] = await this.galleryService.getExtensions([{ ...extension.identifier, preRelease: extension.local?.preRelease }], { compatible: true, targetPlatform: await this.server.extensionManagementService.getTargetPlatform() }, CancellationToken.None);
564
+ if (compatible) {
565
+ extension.gallery = compatible;
566
+ this._onChange.fire({ extension });
567
+ }
568
+ }
569
+ onUninstallExtension(identifier) {
570
+ const extension = this.installed.filter(e => areSameExtensions(e.identifier, identifier))[0];
571
+ if (extension) {
572
+ const uninstalling = this.uninstalling.filter(e => areSameExtensions(e.identifier, identifier))[0] || extension;
573
+ this.uninstalling = [uninstalling, ...this.uninstalling.filter(e => !areSameExtensions(e.identifier, identifier))];
574
+ this._onChange.fire(uninstalling ? { extension: uninstalling } : undefined);
575
+ }
576
+ }
577
+ onDidUninstallExtension({ identifier, error }) {
578
+ const uninstalled = this.uninstalling.find(e => areSameExtensions(e.identifier, identifier)) || this.installed.find(e => areSameExtensions(e.identifier, identifier));
579
+ this.uninstalling = this.uninstalling.filter(e => !areSameExtensions(e.identifier, identifier));
580
+ if (!error) {
581
+ this.installed = this.installed.filter(e => !areSameExtensions(e.identifier, identifier));
582
+ }
583
+ if (uninstalled) {
584
+ this._onChange.fire({ extension: uninstalled });
585
+ }
586
+ }
587
+ onEnablementChanged(platformExtensions) {
588
+ const extensions = this.local.filter(e => ( platformExtensions.some(p => areSameExtensions(e.identifier, p.identifier))));
589
+ for (const extension of extensions) {
590
+ if (extension.local) {
591
+ const enablementState = this.extensionEnablementService.getEnablementState(extension.local);
592
+ if (enablementState !== extension.enablementState) {
593
+ extension.enablementState = enablementState;
594
+ this._onChange.fire({ extension: extension });
595
+ }
596
+ }
597
+ }
598
+ }
599
+ getExtensionState(extension) {
600
+ if (extension.gallery && ( this.installing.some(
601
+ e => !!e.gallery && areSameExtensions(e.gallery.identifier, extension.gallery.identifier)
602
+ ))) {
603
+ return 0 ;
604
+ }
605
+ if (( this.uninstalling.some(e => areSameExtensions(e.identifier, extension.identifier)))) {
606
+ return 2 ;
607
+ }
608
+ const local = this.installed.filter(e => e === extension || (e.gallery && extension.gallery && areSameExtensions(e.gallery.identifier, extension.gallery.identifier)))[0];
609
+ return local ? 1 : 3 ;
610
+ }
611
+ };
612
+ Extensions = Extensions_1 = ( __decorate([
613
+ ( __param(3, IExtensionGalleryService)),
614
+ ( __param(4, IWorkbenchExtensionEnablementService)),
615
+ ( __param(5, IStorageService)),
616
+ ( __param(6, ITelemetryService)),
617
+ ( __param(7, IInstantiationService))
618
+ ], Extensions));
619
+ let ExtensionsWorkbenchService = class ExtensionsWorkbenchService extends Disposable {
620
+ static { ExtensionsWorkbenchService_1 = this; }
621
+ static { this.UpdatesCheckInterval = 1000 * 60 * 60 * 12; }
622
+ get onChange() { return this._onChange.event; }
623
+ get onReset() { return this._onReset.event; }
624
+ constructor(instantiationService, editorService, extensionManagementService, galleryService, configurationService, telemetryService, notificationService, urlService, extensionEnablementService, hostService, progressService, extensionManagementServerService, languageService, extensionsSyncManagementService, userDataAutoSyncService, productService, contextKeyService, extensionManifestPropertiesService, logService, extensionService, localeService, lifecycleService, fileService, userDataProfileService) {
625
+ super();
626
+ this.instantiationService = instantiationService;
627
+ this.editorService = editorService;
628
+ this.extensionManagementService = extensionManagementService;
629
+ this.galleryService = galleryService;
630
+ this.configurationService = configurationService;
631
+ this.telemetryService = telemetryService;
632
+ this.notificationService = notificationService;
633
+ this.extensionEnablementService = extensionEnablementService;
634
+ this.hostService = hostService;
635
+ this.progressService = progressService;
636
+ this.extensionManagementServerService = extensionManagementServerService;
637
+ this.languageService = languageService;
638
+ this.extensionsSyncManagementService = extensionsSyncManagementService;
639
+ this.userDataAutoSyncService = userDataAutoSyncService;
640
+ this.productService = productService;
641
+ this.extensionManifestPropertiesService = extensionManifestPropertiesService;
642
+ this.logService = logService;
643
+ this.extensionService = extensionService;
644
+ this.localeService = localeService;
645
+ this.lifecycleService = lifecycleService;
646
+ this.fileService = fileService;
647
+ this.userDataProfileService = userDataProfileService;
648
+ this.localExtensions = null;
649
+ this.remoteExtensions = null;
650
+ this.webExtensions = null;
651
+ this.extensionsServers = [];
652
+ this._onChange = ( new Emitter());
653
+ this._onReset = ( new Emitter());
654
+ this.preferPreReleases = this.productService.quality !== 'stable';
655
+ this.installing = [];
656
+ this.tasksInProgress = [];
657
+ const preferPreReleasesValue = configurationService.getValue('_extensions.preferPreReleases');
658
+ if (!isUndefined(preferPreReleasesValue)) {
659
+ this.preferPreReleases = !!preferPreReleasesValue;
660
+ }
661
+ this.hasOutdatedExtensionsContextKey = HasOutdatedExtensionsContext.bindTo(contextKeyService);
662
+ if (extensionManagementServerService.localExtensionManagementServer) {
663
+ this.localExtensions = this._register(instantiationService.createInstance(Extensions, extensionManagementServerService.localExtensionManagementServer, ext => this.getExtensionState(ext), ext => this.getReloadStatus(ext)));
664
+ this._register(this.localExtensions.onChange(e => this.onDidChangeExtensions(e?.extension)));
665
+ this._register(this.localExtensions.onReset(e => this.reset()));
666
+ this.extensionsServers.push(this.localExtensions);
667
+ }
668
+ if (extensionManagementServerService.remoteExtensionManagementServer) {
669
+ this.remoteExtensions = this._register(instantiationService.createInstance(Extensions, extensionManagementServerService.remoteExtensionManagementServer, ext => this.getExtensionState(ext), ext => this.getReloadStatus(ext)));
670
+ this._register(this.remoteExtensions.onChange(e => this.onDidChangeExtensions(e?.extension)));
671
+ this._register(this.remoteExtensions.onReset(e => this.reset()));
672
+ this.extensionsServers.push(this.remoteExtensions);
673
+ }
674
+ if (extensionManagementServerService.webExtensionManagementServer) {
675
+ this.webExtensions = this._register(instantiationService.createInstance(Extensions, extensionManagementServerService.webExtensionManagementServer, ext => this.getExtensionState(ext), ext => this.getReloadStatus(ext)));
676
+ this._register(this.webExtensions.onChange(e => this.onDidChangeExtensions(e?.extension)));
677
+ this._register(this.webExtensions.onReset(e => this.reset()));
678
+ this.extensionsServers.push(this.webExtensions);
679
+ }
680
+ this.updatesCheckDelayer = ( new ThrottledDelayer(ExtensionsWorkbenchService_1.UpdatesCheckInterval));
681
+ this.autoUpdateDelayer = ( new ThrottledDelayer(1000));
682
+ this._register(toDisposable(() => {
683
+ this.updatesCheckDelayer.cancel();
684
+ this.autoUpdateDelayer.cancel();
685
+ }));
686
+ urlService.registerHandler(this);
687
+ this.whenInitialized = this.initialize();
688
+ }
689
+ async initialize() {
690
+ await Promise.all([this.queryLocal(), this.extensionService.whenInstalledExtensionsRegistered()]);
691
+ if (this._store.isDisposed) {
692
+ return;
693
+ }
694
+ this.onDidChangeRunningExtensions(this.extensionService.extensions, []);
695
+ this._register(this.extensionService.onDidChangeExtensions(({ added, removed }) => this.onDidChangeRunningExtensions(added, removed)));
696
+ await this.lifecycleService.when(4 );
697
+ if (this._store.isDisposed) {
698
+ return;
699
+ }
700
+ this.initializeAutoUpdate();
701
+ this.reportInstalledExtensionsTelemetry();
702
+ this._register(Event.debounce(this.onChange, () => undefined, 100)(() => this.reportProgressFromOtherSources()));
703
+ }
704
+ initializeAutoUpdate() {
705
+ this._register(this.configurationService.onDidChangeConfiguration(e => {
706
+ if (e.affectsConfiguration(AutoUpdateConfigurationKey)) {
707
+ if (this.isAutoUpdateEnabled()) {
708
+ this.checkForUpdates();
709
+ }
710
+ }
711
+ if (e.affectsConfiguration(AutoCheckUpdatesConfigurationKey)) {
712
+ if (this.isAutoCheckUpdatesEnabled()) {
713
+ this.checkForUpdates();
714
+ }
715
+ }
716
+ }));
717
+ this._register(this.extensionEnablementService.onEnablementChanged(platformExtensions => {
718
+ if (this.getAutoUpdateValue() === 'onlyEnabledExtensions' && ( platformExtensions.some(e => this.extensionEnablementService.isEnabled(e)))) {
719
+ this.checkForUpdates();
720
+ }
721
+ }));
722
+ this._register(Event.debounce(this.onChange, () => undefined, 100)(() => this.hasOutdatedExtensionsContextKey.set(this.outdated.length > 0)));
723
+ this.hasOutdatedExtensionsContextKey.set(this.outdated.length > 0);
724
+ this.eventuallyCheckForUpdates(true);
725
+ if (isWeb) {
726
+ this.syncPinnedBuiltinExtensions();
727
+ if (!this.isAutoUpdateEnabled()) {
728
+ this.autoUpdateBuiltinExtensions();
729
+ }
730
+ }
731
+ }
732
+ reportInstalledExtensionsTelemetry() {
733
+ const extensionIds = ( this.installed.filter(extension => !extension.isBuiltin &&
734
+ ((extension.enablementState === 9 || extension.enablementState === 8) ))
735
+ .map(extension => ExtensionIdentifier.toKey(extension.identifier.id)));
736
+ this.telemetryService.publicLog2('installedExtensions', { extensionIds: ( new TelemetryTrustedValue(extensionIds.join(';'))), count: extensionIds.length });
737
+ }
738
+ async onDidChangeRunningExtensions(added, removed) {
739
+ const changedExtensions = [];
740
+ const extsNotInstalled = [];
741
+ for (const desc of added) {
742
+ const extension = this.installed.find(e => areSameExtensions({ id: desc.identifier.value, uuid: desc.uuid }, e.identifier));
743
+ if (extension) {
744
+ changedExtensions.push(extension);
745
+ }
746
+ else {
747
+ extsNotInstalled.push({ id: desc.identifier.value, uuid: desc.uuid });
748
+ }
749
+ }
750
+ if (extsNotInstalled.length) {
751
+ const extensions = await this.getExtensions(extsNotInstalled, CancellationToken.None);
752
+ for (const extension of extensions) {
753
+ changedExtensions.push(extension);
754
+ }
755
+ }
756
+ for (const changedExtension of changedExtensions) {
757
+ this._onChange.fire(changedExtension);
758
+ }
759
+ }
760
+ reset() {
761
+ for (const task of this.tasksInProgress) {
762
+ task.cancel();
763
+ }
764
+ this.tasksInProgress = [];
765
+ this.installing = [];
766
+ this.onDidChangeExtensions();
767
+ this._onReset.fire();
768
+ }
769
+ onDidChangeExtensions(extension) {
770
+ this._installed = undefined;
771
+ this._local = undefined;
772
+ this._onChange.fire(extension);
773
+ }
774
+ get local() {
775
+ if (!this._local) {
776
+ if (this.extensionsServers.length === 1) {
777
+ this._local = this.installed;
778
+ }
779
+ else {
780
+ this._local = [];
781
+ const byId = groupByExtension(this.installed, r => r.identifier);
782
+ for (const extensions of byId) {
783
+ this._local.push(this.getPrimaryExtension(extensions));
784
+ }
785
+ }
786
+ }
787
+ return this._local;
788
+ }
789
+ get installed() {
790
+ if (!this._installed) {
791
+ this._installed = [];
792
+ for (const extensions of this.extensionsServers) {
793
+ for (const extension of extensions.local) {
794
+ this._installed.push(extension);
795
+ }
796
+ }
797
+ }
798
+ return this._installed;
799
+ }
800
+ get outdated() {
801
+ return this.installed.filter(e => e.outdated && e.local && e.state === 1 );
802
+ }
803
+ async queryLocal(server) {
804
+ if (server) {
805
+ if (this.localExtensions && this.extensionManagementServerService.localExtensionManagementServer === server) {
806
+ return this.localExtensions.queryInstalled();
807
+ }
808
+ if (this.remoteExtensions && this.extensionManagementServerService.remoteExtensionManagementServer === server) {
809
+ return this.remoteExtensions.queryInstalled();
810
+ }
811
+ if (this.webExtensions && this.extensionManagementServerService.webExtensionManagementServer === server) {
812
+ return this.webExtensions.queryInstalled();
813
+ }
814
+ }
815
+ if (this.localExtensions) {
816
+ try {
817
+ await this.localExtensions.queryInstalled();
818
+ }
819
+ catch (error) {
820
+ this.logService.error(error);
821
+ }
822
+ }
823
+ if (this.remoteExtensions) {
824
+ try {
825
+ await this.remoteExtensions.queryInstalled();
826
+ }
827
+ catch (error) {
828
+ this.logService.error(error);
829
+ }
830
+ }
831
+ if (this.webExtensions) {
832
+ try {
833
+ await this.webExtensions.queryInstalled();
834
+ }
835
+ catch (error) {
836
+ this.logService.error(error);
837
+ }
838
+ }
839
+ return this.local;
840
+ }
841
+ async queryGallery(arg1, arg2) {
842
+ if (!this.galleryService.isEnabled()) {
843
+ return singlePagePager([]);
844
+ }
845
+ const options = CancellationToken.isCancellationToken(arg1) ? {} : arg1;
846
+ const token = CancellationToken.isCancellationToken(arg1) ? arg1 : arg2;
847
+ options.text = options.text ? this.resolveQueryText(options.text) : options.text;
848
+ options.includePreRelease = isUndefined(options.includePreRelease) ? this.preferPreReleases : options.includePreRelease;
849
+ const extensionsControlManifest = await this.extensionManagementService.getExtensionsControlManifest();
850
+ const pager = await this.galleryService.query(options, token);
851
+ this.syncInstalledExtensionsWithGallery(pager.firstPage);
852
+ return {
853
+ firstPage: ( pager.firstPage.map(gallery => this.fromGallery(gallery, extensionsControlManifest))),
854
+ total: pager.total,
855
+ pageSize: pager.pageSize,
856
+ getPage: async (pageIndex, token) => {
857
+ const page = await pager.getPage(pageIndex, token);
858
+ this.syncInstalledExtensionsWithGallery(page);
859
+ return ( page.map(gallery => this.fromGallery(gallery, extensionsControlManifest)));
860
+ }
861
+ };
862
+ }
863
+ async getExtensions(extensionInfos, arg1, arg2) {
864
+ if (!this.galleryService.isEnabled()) {
865
+ return [];
866
+ }
867
+ extensionInfos.forEach(e => e.preRelease = e.preRelease ?? this.preferPreReleases);
868
+ const extensionsControlManifest = await this.extensionManagementService.getExtensionsControlManifest();
869
+ const galleryExtensions = await this.galleryService.getExtensions(extensionInfos, arg1, arg2);
870
+ this.syncInstalledExtensionsWithGallery(galleryExtensions);
871
+ return ( galleryExtensions.map(gallery => this.fromGallery(gallery, extensionsControlManifest)));
872
+ }
873
+ resolveQueryText(text) {
874
+ text = text.replace(/@web/g, `tag:"${WEB_EXTENSION_TAG}"`);
875
+ const extensionRegex = /\bext:([^\s]+)\b/g;
876
+ if (extensionRegex.test(text)) {
877
+ text = text.replace(extensionRegex, (m, ext) => {
878
+ const lookup = this.productService.extensionKeywords || {};
879
+ const keywords = lookup[ext] || [];
880
+ const languageId = this.languageService.guessLanguageIdByFilepathOrFirstLine(URI.file(`.${ext}`));
881
+ const languageName = languageId && this.languageService.getLanguageName(languageId);
882
+ const languageTag = languageName ? ` tag:"${languageName}"` : '';
883
+ return `tag:"__ext_${ext}" tag:"__ext_.${ext}" ${( keywords.map(tag => `tag:"${tag}"`)).join(' ')}${languageTag} tag:"${ext}"`;
884
+ });
885
+ }
886
+ return text.substr(0, 350);
887
+ }
888
+ fromGallery(gallery, extensionsControlManifest) {
889
+ let extension = this.getInstalledExtensionMatchingGallery(gallery);
890
+ if (!extension) {
891
+ extension = this.instantiationService.createInstance(Extension, ext => this.getExtensionState(ext), ext => this.getReloadStatus(ext), undefined, undefined, gallery);
892
+ Extensions.updateExtensionFromControlManifest(extension, extensionsControlManifest);
893
+ }
894
+ return extension;
895
+ }
896
+ getInstalledExtensionMatchingGallery(gallery) {
897
+ for (const installed of this.local) {
898
+ if (installed.identifier.uuid) {
899
+ if (installed.identifier.uuid === gallery.identifier.uuid) {
900
+ return installed;
901
+ }
902
+ }
903
+ else {
904
+ if (areSameExtensions(installed.identifier, gallery.identifier)) {
905
+ return installed;
906
+ }
907
+ }
908
+ }
909
+ return null;
910
+ }
911
+ async open(extension, options) {
912
+ if (typeof extension === 'string') {
913
+ const id = extension;
914
+ extension = this.installed.find(e => areSameExtensions(e.identifier, { id })) ?? (await this.getExtensions([{ id: extension }], CancellationToken.None))[0];
915
+ }
916
+ if (!extension) {
917
+ throw new Error(`Extension not found. ${extension}`);
918
+ }
919
+ const editor = await this.editorService.openEditor(this.instantiationService.createInstance(ExtensionsInput, extension), options, options?.sideByside ? SIDE_GROUP : ACTIVE_GROUP);
920
+ if (options?.tab && editor instanceof ExtensionEditor) {
921
+ await editor.openTab(options.tab);
922
+ }
923
+ }
924
+ getExtensionStatus(extension) {
925
+ const extensionsStatus = this.extensionService.getExtensionsStatus();
926
+ for (const id of ( Object.keys(extensionsStatus))) {
927
+ if (areSameExtensions({ id }, extension.identifier)) {
928
+ return extensionsStatus[id];
929
+ }
930
+ }
931
+ return undefined;
932
+ }
933
+ getReloadStatus(extension) {
934
+ const isUninstalled = extension.state === 3 ;
935
+ const runningExtension = this.extensionService.extensions.find(e => areSameExtensions({ id: e.identifier.value, uuid: e.uuid }, extension.identifier));
936
+ if (isUninstalled) {
937
+ const canRemoveRunningExtension = runningExtension && this.extensionService.canRemoveExtension(runningExtension);
938
+ const isSameExtensionRunning = runningExtension && (!extension.server || extension.server === this.extensionManagementServerService.getExtensionManagementServer(toExtension(runningExtension)));
939
+ if (!canRemoveRunningExtension && isSameExtensionRunning) {
940
+ return ( nls.localizeWithPath(
941
+ 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService',
942
+ 'postUninstallTooltip',
943
+ "Please reload Visual Studio Code to complete the uninstallation of this extension."
944
+ ));
945
+ }
946
+ return undefined;
947
+ }
948
+ if (extension.local) {
949
+ const isSameExtensionRunning = runningExtension && extension.server === this.extensionManagementServerService.getExtensionManagementServer(toExtension(runningExtension));
950
+ const isEnabled = this.extensionEnablementService.isEnabled(extension.local);
951
+ if (runningExtension) {
952
+ if (isEnabled) {
953
+ if (this.extensionService.canAddExtension(toExtensionDescription(extension.local))) {
954
+ return undefined;
955
+ }
956
+ const runningExtensionServer = this.extensionManagementServerService.getExtensionManagementServer(toExtension(runningExtension));
957
+ if (isSameExtensionRunning) {
958
+ if (!runningExtension.isUnderDevelopment && (extension.version !== runningExtension.version || extension.local.targetPlatform !== runningExtension.targetPlatform)) {
959
+ return ( nls.localizeWithPath(
960
+ 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService',
961
+ 'postUpdateTooltip',
962
+ "Please reload Visual Studio Code to enable the updated extension."
963
+ ));
964
+ }
965
+ if (this.extensionsServers.length > 1) {
966
+ const extensionInOtherServer = this.installed.filter(e => areSameExtensions(e.identifier, extension.identifier) && e.server !== extension.server)[0];
967
+ if (extensionInOtherServer) {
968
+ if (runningExtensionServer === this.extensionManagementServerService.remoteExtensionManagementServer && this.extensionManifestPropertiesService.prefersExecuteOnUI(extension.local.manifest) && extensionInOtherServer.server === this.extensionManagementServerService.localExtensionManagementServer) {
969
+ return ( nls.localizeWithPath(
970
+ 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService',
971
+ 'enable locally',
972
+ "Please reload Visual Studio Code to enable this extension locally."
973
+ ));
974
+ }
975
+ if (runningExtensionServer === this.extensionManagementServerService.localExtensionManagementServer && this.extensionManifestPropertiesService.prefersExecuteOnWorkspace(extension.local.manifest) && extensionInOtherServer.server === this.extensionManagementServerService.remoteExtensionManagementServer) {
976
+ return ( nls.localizeWithPath(
977
+ 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService',
978
+ 'enable remote',
979
+ "Please reload Visual Studio Code to enable this extension in {0}.",
980
+ this.extensionManagementServerService.remoteExtensionManagementServer?.label
981
+ ));
982
+ }
983
+ }
984
+ }
985
+ }
986
+ else {
987
+ if (extension.server === this.extensionManagementServerService.localExtensionManagementServer && runningExtensionServer === this.extensionManagementServerService.remoteExtensionManagementServer) {
988
+ if (this.extensionManifestPropertiesService.prefersExecuteOnUI(extension.local.manifest)) {
989
+ return ( nls.localizeWithPath(
990
+ 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService',
991
+ 'postEnableTooltip',
992
+ "Please reload Visual Studio Code to enable this extension."
993
+ ));
994
+ }
995
+ }
996
+ if (extension.server === this.extensionManagementServerService.remoteExtensionManagementServer && runningExtensionServer === this.extensionManagementServerService.localExtensionManagementServer) {
997
+ if (this.extensionManifestPropertiesService.prefersExecuteOnWorkspace(extension.local.manifest)) {
998
+ return ( nls.localizeWithPath(
999
+ 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService',
1000
+ 'postEnableTooltip',
1001
+ "Please reload Visual Studio Code to enable this extension."
1002
+ ));
1003
+ }
1004
+ }
1005
+ }
1006
+ return undefined;
1007
+ }
1008
+ else {
1009
+ if (isSameExtensionRunning) {
1010
+ return ( nls.localizeWithPath(
1011
+ 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService',
1012
+ 'postDisableTooltip',
1013
+ "Please reload Visual Studio Code to disable this extension."
1014
+ ));
1015
+ }
1016
+ }
1017
+ return undefined;
1018
+ }
1019
+ else {
1020
+ if (isEnabled && !this.extensionService.canAddExtension(toExtensionDescription(extension.local))) {
1021
+ return ( nls.localizeWithPath(
1022
+ 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService',
1023
+ 'postEnableTooltip',
1024
+ "Please reload Visual Studio Code to enable this extension."
1025
+ ));
1026
+ }
1027
+ const otherServer = extension.server ? extension.server === this.extensionManagementServerService.localExtensionManagementServer ? this.extensionManagementServerService.remoteExtensionManagementServer : this.extensionManagementServerService.localExtensionManagementServer : null;
1028
+ if (otherServer && extension.enablementState === 1 ) {
1029
+ const extensionInOtherServer = this.local.filter(e => areSameExtensions(e.identifier, extension.identifier) && e.server === otherServer)[0];
1030
+ if (extensionInOtherServer && extensionInOtherServer.local && this.extensionEnablementService.isEnabled(extensionInOtherServer.local)) {
1031
+ return ( nls.localizeWithPath(
1032
+ 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService',
1033
+ 'postEnableTooltip',
1034
+ "Please reload Visual Studio Code to enable this extension."
1035
+ ));
1036
+ }
1037
+ }
1038
+ }
1039
+ }
1040
+ return undefined;
1041
+ }
1042
+ getPrimaryExtension(extensions) {
1043
+ if (extensions.length === 1) {
1044
+ return extensions[0];
1045
+ }
1046
+ const enabledExtensions = extensions.filter(e => e.local && this.extensionEnablementService.isEnabled(e.local));
1047
+ if (enabledExtensions.length === 1) {
1048
+ return enabledExtensions[0];
1049
+ }
1050
+ const extensionsToChoose = enabledExtensions.length ? enabledExtensions : extensions;
1051
+ const manifest = extensionsToChoose.find(e => e.local && e.local.manifest)?.local?.manifest;
1052
+ if (!manifest) {
1053
+ return extensionsToChoose[0];
1054
+ }
1055
+ const extensionKinds = this.extensionManifestPropertiesService.getExtensionKind(manifest);
1056
+ let extension = extensionsToChoose.find(extension => {
1057
+ for (const extensionKind of extensionKinds) {
1058
+ switch (extensionKind) {
1059
+ case 'ui':
1060
+ if (extension.server === this.extensionManagementServerService.localExtensionManagementServer) {
1061
+ return true;
1062
+ }
1063
+ return false;
1064
+ case 'workspace':
1065
+ if (extension.server === this.extensionManagementServerService.remoteExtensionManagementServer) {
1066
+ return true;
1067
+ }
1068
+ return false;
1069
+ case 'web':
1070
+ if (extension.server === this.extensionManagementServerService.webExtensionManagementServer) {
1071
+ return true;
1072
+ }
1073
+ return false;
1074
+ }
1075
+ }
1076
+ return false;
1077
+ });
1078
+ if (!extension && this.extensionManagementServerService.localExtensionManagementServer) {
1079
+ extension = extensionsToChoose.find(extension => {
1080
+ for (const extensionKind of extensionKinds) {
1081
+ switch (extensionKind) {
1082
+ case 'workspace':
1083
+ if (extension.server === this.extensionManagementServerService.localExtensionManagementServer) {
1084
+ return true;
1085
+ }
1086
+ return false;
1087
+ case 'web':
1088
+ if (extension.server === this.extensionManagementServerService.localExtensionManagementServer) {
1089
+ return true;
1090
+ }
1091
+ return false;
1092
+ }
1093
+ }
1094
+ return false;
1095
+ });
1096
+ }
1097
+ if (!extension && this.extensionManagementServerService.webExtensionManagementServer) {
1098
+ extension = extensionsToChoose.find(extension => {
1099
+ for (const extensionKind of extensionKinds) {
1100
+ switch (extensionKind) {
1101
+ case 'web':
1102
+ if (extension.server === this.extensionManagementServerService.webExtensionManagementServer) {
1103
+ return true;
1104
+ }
1105
+ return false;
1106
+ }
1107
+ }
1108
+ return false;
1109
+ });
1110
+ }
1111
+ if (!extension && this.extensionManagementServerService.remoteExtensionManagementServer) {
1112
+ extension = extensionsToChoose.find(extension => {
1113
+ for (const extensionKind of extensionKinds) {
1114
+ switch (extensionKind) {
1115
+ case 'web':
1116
+ if (extension.server === this.extensionManagementServerService.remoteExtensionManagementServer) {
1117
+ return true;
1118
+ }
1119
+ return false;
1120
+ }
1121
+ }
1122
+ return false;
1123
+ });
1124
+ }
1125
+ return extension || extensions[0];
1126
+ }
1127
+ getExtensionState(extension) {
1128
+ if (( this.installing.some(
1129
+ i => areSameExtensions(i.identifier, extension.identifier) && (!extension.server || i.server === extension.server)
1130
+ ))) {
1131
+ return 0 ;
1132
+ }
1133
+ if (this.remoteExtensions) {
1134
+ const state = this.remoteExtensions.getExtensionState(extension);
1135
+ if (state !== 3 ) {
1136
+ return state;
1137
+ }
1138
+ }
1139
+ if (this.webExtensions) {
1140
+ const state = this.webExtensions.getExtensionState(extension);
1141
+ if (state !== 3 ) {
1142
+ return state;
1143
+ }
1144
+ }
1145
+ if (this.localExtensions) {
1146
+ return this.localExtensions.getExtensionState(extension);
1147
+ }
1148
+ return 3 ;
1149
+ }
1150
+ async checkForUpdates(onlyBuiltin) {
1151
+ if (!this.galleryService.isEnabled()) {
1152
+ return;
1153
+ }
1154
+ const extensions = [];
1155
+ if (this.localExtensions) {
1156
+ extensions.push(this.localExtensions);
1157
+ }
1158
+ if (this.remoteExtensions) {
1159
+ extensions.push(this.remoteExtensions);
1160
+ }
1161
+ if (this.webExtensions) {
1162
+ extensions.push(this.webExtensions);
1163
+ }
1164
+ if (!extensions.length) {
1165
+ return;
1166
+ }
1167
+ const infos = [];
1168
+ for (const installed of this.local) {
1169
+ if (onlyBuiltin && !installed.isBuiltin) {
1170
+ continue;
1171
+ }
1172
+ if (installed.isBuiltin && !installed.pinned && (installed.type === 0 || !installed.local?.identifier.uuid)) {
1173
+ continue;
1174
+ }
1175
+ infos.push({ ...installed.identifier, preRelease: !!installed.local?.preRelease });
1176
+ }
1177
+ if (infos.length) {
1178
+ const targetPlatform = await extensions[0].server.extensionManagementService.getTargetPlatform();
1179
+ this.telemetryService.publicLog2('galleryService:checkingForUpdates', {
1180
+ count: infos.length,
1181
+ });
1182
+ const galleryExtensions = await this.galleryService.getExtensions(infos, { targetPlatform, compatible: true }, CancellationToken.None);
1183
+ if (galleryExtensions.length) {
1184
+ await this.syncInstalledExtensionsWithGallery(galleryExtensions);
1185
+ }
1186
+ }
1187
+ }
1188
+ async syncInstalledExtensionsWithGallery(gallery) {
1189
+ const extensions = [];
1190
+ if (this.localExtensions) {
1191
+ extensions.push(this.localExtensions);
1192
+ }
1193
+ if (this.remoteExtensions) {
1194
+ extensions.push(this.remoteExtensions);
1195
+ }
1196
+ if (this.webExtensions) {
1197
+ extensions.push(this.webExtensions);
1198
+ }
1199
+ if (!extensions.length) {
1200
+ return;
1201
+ }
1202
+ const result = await Promise.allSettled(( extensions.map(extensions => extensions.syncInstalledExtensionsWithGallery(gallery))));
1203
+ if (this.isAutoUpdateEnabled() && ( result.some(r => r.status === 'fulfilled' && r.value))) {
1204
+ this.eventuallyAutoUpdateExtensions();
1205
+ }
1206
+ }
1207
+ getAutoUpdateValue() {
1208
+ const autoUpdate = this.configurationService.getValue(AutoUpdateConfigurationKey);
1209
+ return isBoolean(autoUpdate) || autoUpdate === 'onlyEnabledExtensions' ? autoUpdate : true;
1210
+ }
1211
+ isAutoUpdateEnabled() {
1212
+ return this.getAutoUpdateValue() !== false;
1213
+ }
1214
+ isAutoCheckUpdatesEnabled() {
1215
+ return this.configurationService.getValue(AutoCheckUpdatesConfigurationKey);
1216
+ }
1217
+ eventuallyCheckForUpdates(immediate = false) {
1218
+ this.updatesCheckDelayer.trigger(async () => {
1219
+ if (this.isAutoUpdateEnabled() || this.isAutoCheckUpdatesEnabled()) {
1220
+ await this.checkForUpdates();
1221
+ }
1222
+ this.eventuallyCheckForUpdates();
1223
+ }, immediate ? 0 : ExtensionsWorkbenchService_1.UpdatesCheckInterval).then(undefined, err => null);
1224
+ }
1225
+ eventuallyAutoUpdateExtensions() {
1226
+ this.autoUpdateDelayer.trigger(() => this.autoUpdateExtensions())
1227
+ .then(undefined, err => null);
1228
+ }
1229
+ async autoUpdateBuiltinExtensions() {
1230
+ await this.checkForUpdates(true);
1231
+ const toUpdate = this.outdated.filter(e => e.isBuiltin);
1232
+ await Promises.settled(( toUpdate.map(
1233
+ e => this.install(e, e.local?.preRelease ? { installPreReleaseVersion: true } : undefined)
1234
+ )));
1235
+ }
1236
+ async syncPinnedBuiltinExtensions() {
1237
+ const infos = [];
1238
+ for (const installed of this.local) {
1239
+ if (installed.isBuiltin && installed.pinned && installed.local?.identifier.uuid) {
1240
+ infos.push({ ...installed.identifier, version: installed.version });
1241
+ }
1242
+ }
1243
+ if (infos.length) {
1244
+ const galleryExtensions = await this.galleryService.getExtensions(infos, CancellationToken.None);
1245
+ if (galleryExtensions.length) {
1246
+ await this.syncInstalledExtensionsWithGallery(galleryExtensions);
1247
+ }
1248
+ }
1249
+ }
1250
+ autoUpdateExtensions() {
1251
+ if (!this.isAutoUpdateEnabled()) {
1252
+ return Promise.resolve();
1253
+ }
1254
+ const toUpdate = this.outdated.filter(e => !e.pinned &&
1255
+ (this.getAutoUpdateValue() === true || (e.local && this.extensionEnablementService.isEnabled(e.local))));
1256
+ return Promises.settled(( toUpdate.map(
1257
+ e => this.install(e, e.local?.preRelease ? { installPreReleaseVersion: true } : undefined)
1258
+ )));
1259
+ }
1260
+ async pinExtension(extension, pinned) {
1261
+ if (!extension.local) {
1262
+ throw new Error('Only installed extensions can be pinned');
1263
+ }
1264
+ await this.extensionManagementService.updateMetadata(extension.local, { pinned });
1265
+ }
1266
+ async canInstall(extension) {
1267
+ if (!(extension instanceof Extension)) {
1268
+ return false;
1269
+ }
1270
+ if (extension.isMalicious) {
1271
+ return false;
1272
+ }
1273
+ if (extension.deprecationInfo?.disallowInstall) {
1274
+ return false;
1275
+ }
1276
+ if (!extension.gallery) {
1277
+ return false;
1278
+ }
1279
+ if (this.localExtensions && (await this.localExtensions.canInstall(extension.gallery))) {
1280
+ return true;
1281
+ }
1282
+ if (this.remoteExtensions && (await this.remoteExtensions.canInstall(extension.gallery))) {
1283
+ return true;
1284
+ }
1285
+ if (this.webExtensions && (await this.webExtensions.canInstall(extension.gallery))) {
1286
+ return true;
1287
+ }
1288
+ return false;
1289
+ }
1290
+ install(extension, installOptions, progressLocation) {
1291
+ return this.doInstall(extension, async () => {
1292
+ if (extension instanceof URI) {
1293
+ return this.installFromVSIX(extension, installOptions);
1294
+ }
1295
+ if (extension.isMalicious) {
1296
+ throw new Error(nls.localizeWithPath('vs/workbench/contrib/extensions/browser/extensionsWorkbenchService', 'malicious', "This extension is reported to be problematic."));
1297
+ }
1298
+ if (!extension.gallery) {
1299
+ throw new Error('Missing gallery');
1300
+ }
1301
+ return this.installFromGallery(extension, extension.gallery, installOptions);
1302
+ }, progressLocation);
1303
+ }
1304
+ async installInServer(extension, server) {
1305
+ await this.doInstall(extension, async () => {
1306
+ const local = extension.local;
1307
+ if (!local) {
1308
+ throw new Error('Extension not found');
1309
+ }
1310
+ if (!extension.gallery) {
1311
+ extension = (await this.getExtensions([{ ...extension.identifier, preRelease: local.preRelease }], CancellationToken.None))[0] ?? extension;
1312
+ }
1313
+ if (extension.gallery) {
1314
+ return server.extensionManagementService.installFromGallery(extension.gallery, { installPreReleaseVersion: local.preRelease });
1315
+ }
1316
+ const targetPlatform = await server.extensionManagementService.getTargetPlatform();
1317
+ if (!isTargetPlatformCompatible(local.targetPlatform, [local.targetPlatform], targetPlatform)) {
1318
+ throw new Error(nls.localizeWithPath('vs/workbench/contrib/extensions/browser/extensionsWorkbenchService', 'incompatible', "Can't install '{0}' extension because it is not compatible.", extension.identifier.id));
1319
+ }
1320
+ const vsix = await this.extensionManagementService.zip(local);
1321
+ try {
1322
+ return await server.extensionManagementService.install(vsix);
1323
+ }
1324
+ finally {
1325
+ try {
1326
+ await this.fileService.del(vsix);
1327
+ }
1328
+ catch (error) {
1329
+ this.logService.error(error);
1330
+ }
1331
+ }
1332
+ });
1333
+ }
1334
+ canSetLanguage(extension) {
1335
+ if (!isWeb) {
1336
+ return false;
1337
+ }
1338
+ if (!extension.gallery) {
1339
+ return false;
1340
+ }
1341
+ const locale = getLocale(extension.gallery);
1342
+ if (!locale) {
1343
+ return false;
1344
+ }
1345
+ return true;
1346
+ }
1347
+ async setLanguage(extension) {
1348
+ if (!this.canSetLanguage(extension)) {
1349
+ throw new Error('Can not set language');
1350
+ }
1351
+ const locale = getLocale(extension.gallery);
1352
+ if (locale === language) {
1353
+ return;
1354
+ }
1355
+ const localizedLanguageName = extension.gallery?.properties?.localizedLanguages?.[0];
1356
+ return this.localeService.setLocale({ id: locale, galleryExtension: extension.gallery, extensionId: extension.identifier.id, label: localizedLanguageName ?? extension.displayName });
1357
+ }
1358
+ setEnablement(extensions, enablementState) {
1359
+ extensions = Array.isArray(extensions) ? extensions : [extensions];
1360
+ return this.promptAndSetEnablement(extensions, enablementState);
1361
+ }
1362
+ uninstall(extension) {
1363
+ const ext = extension.local ? extension : this.local.filter(e => areSameExtensions(e.identifier, extension.identifier))[0];
1364
+ const toUninstall = ext && ext.local ? ext.local : null;
1365
+ if (!toUninstall) {
1366
+ return Promise.reject(( new Error('Missing local')));
1367
+ }
1368
+ return this.withProgress({
1369
+ location: 5 ,
1370
+ title: ( nls.localizeWithPath(
1371
+ 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService',
1372
+ 'uninstallingExtension',
1373
+ 'Uninstalling extension....'
1374
+ )),
1375
+ source: `${toUninstall.identifier.id}`
1376
+ }, () => this.extensionManagementService.uninstall(toUninstall).then(() => undefined));
1377
+ }
1378
+ async installVersion(extension, version, installOptions = {}) {
1379
+ return this.doInstall(extension, async () => {
1380
+ if (!extension.gallery) {
1381
+ throw new Error('Missing gallery');
1382
+ }
1383
+ const targetPlatform = extension.server ? await extension.server.extensionManagementService.getTargetPlatform() : undefined;
1384
+ const [gallery] = await this.galleryService.getExtensions([{ id: extension.gallery.identifier.id, version }], { targetPlatform }, CancellationToken.None);
1385
+ if (!gallery) {
1386
+ throw new Error(nls.localizeWithPath('vs/workbench/contrib/extensions/browser/extensionsWorkbenchService', 'not found', "Unable to install extension '{0}' because the requested version '{1}' is not found.", extension.gallery.identifier.id, version));
1387
+ }
1388
+ installOptions.installGivenVersion = true;
1389
+ return this.installFromGallery(extension, gallery, installOptions);
1390
+ });
1391
+ }
1392
+ reinstall(extension) {
1393
+ return this.doInstall(extension, () => {
1394
+ const ext = extension.local ? extension : this.local.filter(e => areSameExtensions(e.identifier, extension.identifier))[0];
1395
+ const toReinstall = ext && ext.local ? ext.local : null;
1396
+ if (!toReinstall) {
1397
+ throw new Error('Missing local');
1398
+ }
1399
+ return this.extensionManagementService.reinstallFromGallery(toReinstall);
1400
+ });
1401
+ }
1402
+ isExtensionIgnoredToSync(extension) {
1403
+ return extension.local ? !this.isInstalledExtensionSynced(extension.local)
1404
+ : this.extensionsSyncManagementService.hasToNeverSyncExtension(extension.identifier.id);
1405
+ }
1406
+ async toggleExtensionIgnoredToSync(extension) {
1407
+ const isIgnored = this.isExtensionIgnoredToSync(extension);
1408
+ if (extension.local && isIgnored) {
1409
+ extension.local = await this.updateSynchronizingInstalledExtension(extension.local, true);
1410
+ this._onChange.fire(extension);
1411
+ }
1412
+ else {
1413
+ this.extensionsSyncManagementService.updateIgnoredExtensions(extension.identifier.id, !isIgnored);
1414
+ }
1415
+ await this.userDataAutoSyncService.triggerSync(['IgnoredExtensionsUpdated'], false, false);
1416
+ }
1417
+ async toggleApplyExtensionToAllProfiles(extension) {
1418
+ if (!extension.local || isApplicationScopedExtension(extension.local.manifest) || extension.isBuiltin) {
1419
+ return;
1420
+ }
1421
+ await this.extensionManagementService.toggleAppliationScope(extension.local, this.userDataProfileService.currentProfile.extensionsResource);
1422
+ }
1423
+ isInstalledExtensionSynced(extension) {
1424
+ if (extension.isMachineScoped) {
1425
+ return false;
1426
+ }
1427
+ if (this.extensionsSyncManagementService.hasToAlwaysSyncExtension(extension.identifier.id)) {
1428
+ return true;
1429
+ }
1430
+ return !this.extensionsSyncManagementService.hasToNeverSyncExtension(extension.identifier.id);
1431
+ }
1432
+ async updateSynchronizingInstalledExtension(extension, sync) {
1433
+ const isMachineScoped = !sync;
1434
+ if (extension.isMachineScoped !== isMachineScoped) {
1435
+ extension = await this.extensionManagementService.updateMetadata(extension, { isMachineScoped });
1436
+ }
1437
+ if (sync) {
1438
+ this.extensionsSyncManagementService.updateIgnoredExtensions(extension.identifier.id, false);
1439
+ }
1440
+ return extension;
1441
+ }
1442
+ doInstall(extension, installTask, progressLocation) {
1443
+ const title = extension instanceof URI ? ( nls.localizeWithPath(
1444
+ 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService',
1445
+ 'installing extension',
1446
+ 'Installing extension....'
1447
+ )) : ( nls.localizeWithPath(
1448
+ 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService',
1449
+ 'installing named extension',
1450
+ "Installing '{0}' extension....",
1451
+ extension.displayName
1452
+ ));
1453
+ return this.withProgress({
1454
+ location: progressLocation ?? 5 ,
1455
+ title
1456
+ }, async () => {
1457
+ try {
1458
+ if (!(extension instanceof URI)) {
1459
+ this.installing.push(extension);
1460
+ this._onChange.fire(extension);
1461
+ }
1462
+ const local = await installTask();
1463
+ return await this.waitAndGetInstalledExtension(local.identifier);
1464
+ }
1465
+ finally {
1466
+ if (!(extension instanceof URI)) {
1467
+ this.installing = this.installing.filter(e => e !== extension);
1468
+ this._onChange.fire(undefined);
1469
+ }
1470
+ }
1471
+ });
1472
+ }
1473
+ async installFromVSIX(vsix, installOptions) {
1474
+ const manifest = await this.extensionManagementService.getManifest(vsix);
1475
+ const existingExtension = this.local.find(local => areSameExtensions(local.identifier, { id: getGalleryExtensionId(manifest.publisher, manifest.name) }));
1476
+ if (existingExtension && existingExtension.latestVersion !== manifest.version) {
1477
+ installOptions = installOptions || {};
1478
+ installOptions.installGivenVersion = true;
1479
+ }
1480
+ return this.extensionManagementService.installVSIX(vsix, manifest, installOptions);
1481
+ }
1482
+ installFromGallery(extension, gallery, installOptions) {
1483
+ if (extension.local) {
1484
+ return this.extensionManagementService.updateFromGallery(gallery, extension.local, installOptions);
1485
+ }
1486
+ else {
1487
+ return this.extensionManagementService.installFromGallery(gallery, installOptions);
1488
+ }
1489
+ }
1490
+ async waitAndGetInstalledExtension(identifier) {
1491
+ let installedExtension = this.local.find(local => areSameExtensions(local.identifier, identifier));
1492
+ if (!installedExtension) {
1493
+ await Event.toPromise(Event.filter(this.onChange, e => !!e && ( this.local.some(local => areSameExtensions(local.identifier, identifier)))));
1494
+ }
1495
+ installedExtension = this.local.find(local => areSameExtensions(local.identifier, identifier));
1496
+ if (!installedExtension) {
1497
+ throw new Error('Extension should have been installed');
1498
+ }
1499
+ return installedExtension;
1500
+ }
1501
+ promptAndSetEnablement(extensions, enablementState) {
1502
+ const enable = enablementState === 8 || enablementState === 9 ;
1503
+ if (enable) {
1504
+ const allDependenciesAndPackedExtensions = this.getExtensionsRecursively(extensions, this.local, enablementState, { dependencies: true, pack: true });
1505
+ return this.checkAndSetEnablement(extensions, allDependenciesAndPackedExtensions, enablementState);
1506
+ }
1507
+ else {
1508
+ const packedExtensions = this.getExtensionsRecursively(extensions, this.local, enablementState, { dependencies: false, pack: true });
1509
+ if (packedExtensions.length) {
1510
+ return this.checkAndSetEnablement(extensions, packedExtensions, enablementState);
1511
+ }
1512
+ return this.checkAndSetEnablement(extensions, [], enablementState);
1513
+ }
1514
+ }
1515
+ checkAndSetEnablement(extensions, otherExtensions, enablementState) {
1516
+ const allExtensions = [...extensions, ...otherExtensions];
1517
+ const enable = enablementState === 8 || enablementState === 9 ;
1518
+ if (!enable) {
1519
+ for (const extension of extensions) {
1520
+ const dependents = this.getDependentsAfterDisablement(extension, allExtensions, this.local);
1521
+ if (dependents.length) {
1522
+ return ( new Promise((resolve, reject) => {
1523
+ this.notificationService.prompt(Severity.Error, this.getDependentsErrorMessage(extension, allExtensions, dependents), [
1524
+ {
1525
+ label: ( nls.localizeWithPath(
1526
+ 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService',
1527
+ 'disable all',
1528
+ 'Disable All'
1529
+ )),
1530
+ run: async () => {
1531
+ try {
1532
+ await this.checkAndSetEnablement(dependents, [extension], enablementState);
1533
+ resolve();
1534
+ }
1535
+ catch (error) {
1536
+ reject(error);
1537
+ }
1538
+ }
1539
+ }
1540
+ ], {
1541
+ onCancel: () => reject(( new CancellationError()))
1542
+ });
1543
+ }));
1544
+ }
1545
+ }
1546
+ }
1547
+ return this.doSetEnablement(allExtensions, enablementState);
1548
+ }
1549
+ getExtensionsRecursively(extensions, installed, enablementState, options, checked = []) {
1550
+ const toCheck = extensions.filter(e => checked.indexOf(e) === -1);
1551
+ if (toCheck.length) {
1552
+ for (const extension of toCheck) {
1553
+ checked.push(extension);
1554
+ }
1555
+ const extensionsToEanbleOrDisable = installed.filter(i => {
1556
+ if (checked.indexOf(i) !== -1) {
1557
+ return false;
1558
+ }
1559
+ const enable = enablementState === 8 || enablementState === 9 ;
1560
+ const isExtensionEnabled = i.enablementState === 8 || i.enablementState === 9 ;
1561
+ if (enable === isExtensionEnabled) {
1562
+ return false;
1563
+ }
1564
+ return (enable || !i.isBuiltin)
1565
+ && (options.dependencies || options.pack)
1566
+ && ( extensions.some(extension => (options.dependencies && ( extension.dependencies.some(id => areSameExtensions({ id }, i.identifier))))
1567
+ || (options.pack && ( extension.extensionPack.some(id => areSameExtensions({ id }, i.identifier))))));
1568
+ });
1569
+ if (extensionsToEanbleOrDisable.length) {
1570
+ extensionsToEanbleOrDisable.push(...this.getExtensionsRecursively(extensionsToEanbleOrDisable, installed, enablementState, options, checked));
1571
+ }
1572
+ return extensionsToEanbleOrDisable;
1573
+ }
1574
+ return [];
1575
+ }
1576
+ getDependentsAfterDisablement(extension, extensionsToDisable, installed) {
1577
+ return installed.filter(i => {
1578
+ if (i.dependencies.length === 0) {
1579
+ return false;
1580
+ }
1581
+ if (i === extension) {
1582
+ return false;
1583
+ }
1584
+ if (!this.extensionEnablementService.isEnabledEnablementState(i.enablementState)) {
1585
+ return false;
1586
+ }
1587
+ if (extensionsToDisable.indexOf(i) !== -1) {
1588
+ return false;
1589
+ }
1590
+ return ( i.dependencies.some(dep => ( [extension, ...extensionsToDisable].some(d => areSameExtensions(d.identifier, { id: dep })))));
1591
+ });
1592
+ }
1593
+ getDependentsErrorMessage(extension, allDisabledExtensions, dependents) {
1594
+ for (const e of [extension, ...allDisabledExtensions]) {
1595
+ const dependentsOfTheExtension = dependents.filter(d => ( d.dependencies.some(id => areSameExtensions({ id }, e.identifier))));
1596
+ if (dependentsOfTheExtension.length) {
1597
+ return this.getErrorMessageForDisablingAnExtensionWithDependents(e, dependentsOfTheExtension);
1598
+ }
1599
+ }
1600
+ return '';
1601
+ }
1602
+ getErrorMessageForDisablingAnExtensionWithDependents(extension, dependents) {
1603
+ if (dependents.length === 1) {
1604
+ return ( nls.localizeWithPath(
1605
+ 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService',
1606
+ 'singleDependentError',
1607
+ "Cannot disable '{0}' extension alone. '{1}' extension depends on this. Do you want to disable all these extensions?",
1608
+ extension.displayName,
1609
+ dependents[0].displayName
1610
+ ));
1611
+ }
1612
+ if (dependents.length === 2) {
1613
+ return ( nls.localizeWithPath(
1614
+ 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService',
1615
+ 'twoDependentsError',
1616
+ "Cannot disable '{0}' extension alone. '{1}' and '{2}' extensions depend on this. Do you want to disable all these extensions?",
1617
+ extension.displayName,
1618
+ dependents[0].displayName,
1619
+ dependents[1].displayName
1620
+ ));
1621
+ }
1622
+ return ( nls.localizeWithPath(
1623
+ 'vs/workbench/contrib/extensions/browser/extensionsWorkbenchService',
1624
+ 'multipleDependentsError',
1625
+ "Cannot disable '{0}' extension alone. '{1}', '{2}' and other extensions depend on this. Do you want to disable all these extensions?",
1626
+ extension.displayName,
1627
+ dependents[0].displayName,
1628
+ dependents[1].displayName
1629
+ ));
1630
+ }
1631
+ async doSetEnablement(extensions, enablementState) {
1632
+ const changed = await this.extensionEnablementService.setEnablement(( extensions.map(e => e.local)), enablementState);
1633
+ for (let i = 0; i < changed.length; i++) {
1634
+ if (changed[i]) {
1635
+ this.telemetryService.publicLog(enablementState === 8 || enablementState === 9 ? 'extension:enable' : 'extension:disable', extensions[i].telemetryData);
1636
+ }
1637
+ }
1638
+ return changed;
1639
+ }
1640
+ reportProgressFromOtherSources() {
1641
+ if (( this.installed.some(
1642
+ e => e.state === 0 || e.state === 2
1643
+ ))) {
1644
+ if (!this._activityCallBack) {
1645
+ this.withProgress({ location: 5 }, () => ( new Promise(resolve => this._activityCallBack = resolve)));
1646
+ }
1647
+ }
1648
+ else {
1649
+ this._activityCallBack?.();
1650
+ this._activityCallBack = undefined;
1651
+ }
1652
+ }
1653
+ withProgress(options, task) {
1654
+ return this.progressService.withProgress(options, async () => {
1655
+ const cancelableTask = createCancelablePromise(() => task());
1656
+ this.tasksInProgress.push(cancelableTask);
1657
+ try {
1658
+ return await cancelableTask;
1659
+ }
1660
+ finally {
1661
+ const index = this.tasksInProgress.indexOf(cancelableTask);
1662
+ if (index !== -1) {
1663
+ this.tasksInProgress.splice(index, 1);
1664
+ }
1665
+ }
1666
+ });
1667
+ }
1668
+ onError(err) {
1669
+ if (isCancellationError(err)) {
1670
+ return;
1671
+ }
1672
+ const message = err && err.message || '';
1673
+ if (/getaddrinfo ENOTFOUND|getaddrinfo ENOENT|connect EACCES|connect ECONNREFUSED/.test(message)) {
1674
+ return;
1675
+ }
1676
+ this.notificationService.error(err);
1677
+ }
1678
+ handleURL(uri, options) {
1679
+ if (!/^extension/.test(uri.path)) {
1680
+ return Promise.resolve(false);
1681
+ }
1682
+ this.onOpenExtensionUrl(uri);
1683
+ return Promise.resolve(true);
1684
+ }
1685
+ onOpenExtensionUrl(uri) {
1686
+ const match = /^extension\/([^/]+)$/.exec(uri.path);
1687
+ if (!match) {
1688
+ return;
1689
+ }
1690
+ const extensionId = match[1];
1691
+ this.queryLocal().then(async (local) => {
1692
+ let extension = local.find(local => areSameExtensions(local.identifier, { id: extensionId }));
1693
+ if (!extension) {
1694
+ [extension] = await this.getExtensions([{ id: extensionId }], { source: 'uri' }, CancellationToken.None);
1695
+ }
1696
+ if (extension) {
1697
+ await this.hostService.focus();
1698
+ await this.open(extension);
1699
+ }
1700
+ }).then(undefined, error => this.onError(error));
1701
+ }
1702
+ };
1703
+ ExtensionsWorkbenchService = ExtensionsWorkbenchService_1 = ( __decorate([
1704
+ ( __param(0, IInstantiationService)),
1705
+ ( __param(1, IEditorService)),
1706
+ ( __param(2, IWorkbenchExtensionManagementService)),
1707
+ ( __param(3, IExtensionGalleryService)),
1708
+ ( __param(4, IConfigurationService)),
1709
+ ( __param(5, ITelemetryService)),
1710
+ ( __param(6, INotificationService)),
1711
+ ( __param(7, IURLService)),
1712
+ ( __param(8, IWorkbenchExtensionEnablementService)),
1713
+ ( __param(9, IHostService)),
1714
+ ( __param(10, IProgressService)),
1715
+ ( __param(11, IExtensionManagementServerService)),
1716
+ ( __param(12, ILanguageService)),
1717
+ ( __param(13, IIgnoredExtensionsManagementService)),
1718
+ ( __param(14, IUserDataAutoSyncService)),
1719
+ ( __param(15, IProductService)),
1720
+ ( __param(16, IContextKeyService)),
1721
+ ( __param(17, IExtensionManifestPropertiesService)),
1722
+ ( __param(18, ILogService)),
1723
+ ( __param(19, IExtensionService)),
1724
+ ( __param(20, ILocaleService)),
1725
+ ( __param(21, ILifecycleService)),
1726
+ ( __param(22, IFileService)),
1727
+ ( __param(23, IUserDataProfileService))
1728
+ ], ExtensionsWorkbenchService));
1729
+
1730
+ export { Extension, ExtensionsWorkbenchService };