@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.
- package/extensionGallery.d.ts +12 -0
- package/extensionGallery.js +76 -0
- package/external/rollup-plugin-styles/dist/runtime/inject-css.js +3 -0
- package/external/tslib/tslib.es6.js +11 -0
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/override/vs/platform/dialogs/common/dialogs.js +8 -0
- package/package.json +30 -0
- package/vscode/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.js +784 -0
- package/vscode/src/vs/platform/extensionManagement/common/extensionEnablementService.js +142 -0
- package/vscode/src/vs/platform/extensionManagement/common/extensionGalleryService.js +855 -0
- package/vscode/src/vs/platform/extensionManagement/common/extensionManagementIpc.js +119 -0
- package/vscode/src/vs/platform/extensionManagement/common/extensionTipsService.js +57 -0
- package/vscode/src/vs/platform/extensionManagement/common/unsupportedExtensionsMigration.js +58 -0
- package/vscode/src/vs/platform/externalServices/common/marketplace.js +17 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/abstractRuntimeExtensionsEditor.js +492 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/browserRuntimeExtensionsEditor.js +28 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/configBasedRecommendations.js +78 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/deprecatedExtensionsChecker.js +87 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/exeBasedRecommendations.js +60 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/extensionEditor.js +1868 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/extensionEnablementWorkspaceTrustTransitionParticipant.js +52 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService.js +437 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/extensionRecommendations.js +17 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/extensionRecommendationsService.js +221 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/extensions.contribution.js +2063 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/extensions.web.contribution.js +13 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActivationProgress.js +46 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsCompletionItemsProvider.js +65 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsDependencyChecker.js +98 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsList.js +224 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsQuickAccess.js +121 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewer.js +285 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.js +912 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsViews.js +1270 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWidgets.js +824 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.js +1730 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/fileBasedRecommendations.js +324 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/keymapRecommendations.js +28 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/languageRecommendations.js +28 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/media/extension.css.js +6 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css.js +6 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/media/extensionsViewlet.css.js +6 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/media/extensionsWidgets.css.js +6 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/media/runtimeExtensionsEditor.css.js +6 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/remoteRecommendations.js +29 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/unsupportedExtensionsMigrationContribution.js +26 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/webRecommendations.js +38 -0
- package/vscode/src/vs/workbench/contrib/extensions/browser/workspaceRecommendations.js +88 -0
- package/vscode/src/vs/workbench/contrib/extensions/common/extensionQuery.js +67 -0
- package/vscode/src/vs/workbench/contrib/extensions/common/extensionsInput.js +43 -0
- package/vscode/src/vs/workbench/contrib/extensions/common/extensionsUtils.js +104 -0
- package/vscode/src/vs/workbench/contrib/extensions/common/reportExtensionIssueAction.js +31 -0
- package/vscode/src/vs/workbench/contrib/extensions/common/runtimeExtensionsInput.js +41 -0
- package/vscode/src/vs/workbench/contrib/markdown/browser/markdownDocumentRenderer.js +207 -0
- package/vscode/src/vs/workbench/contrib/update/common/update.js +3 -0
- package/vscode/src/vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.js +84 -0
- package/vscode/src/vs/workbench/services/extensionManagement/browser/extensionEnablementService.js +634 -0
- package/vscode/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.js +883 -0
- package/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagementChannelClient.js +109 -0
- package/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagementServerService.js +62 -0
- package/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagementService.js +633 -0
- package/vscode/src/vs/workbench/services/extensionManagement/common/remoteExtensionManagementService.js +58 -0
- package/vscode/src/vs/workbench/services/extensionManagement/common/webExtensionManagementService.js +269 -0
- package/vscode/src/vs/workbench/services/extensionRecommendations/common/extensionIgnoredRecommendationsService.js +83 -0
- package/vscode/src/vs/workbench/services/remote/common/remoteExtensionsScanner.js +73 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { localizeWithPath } from 'monaco-editor/esm/vs/nls.js';
|
|
2
|
+
import { Registry } from 'monaco-editor/esm/vs/platform/registry/common/platform.js';
|
|
3
|
+
import { SyncDescriptor } from 'monaco-editor/esm/vs/platform/instantiation/common/descriptors.js';
|
|
4
|
+
import { EditorPaneDescriptor } from 'vscode/vscode/vs/workbench/browser/editor';
|
|
5
|
+
import { RuntimeExtensionsEditor } from './browserRuntimeExtensionsEditor.js';
|
|
6
|
+
import { RuntimeExtensionsInput } from '../common/runtimeExtensionsInput.js';
|
|
7
|
+
import { EditorExtensions } from 'vscode/vscode/vs/workbench/common/editor';
|
|
8
|
+
|
|
9
|
+
( Registry.as(EditorExtensions.EditorPane)).registerEditorPane(EditorPaneDescriptor.create(RuntimeExtensionsEditor, RuntimeExtensionsEditor.ID, ( localizeWithPath(
|
|
10
|
+
'vs/workbench/contrib/extensions/browser/extensions.web.contribution',
|
|
11
|
+
'runtimeExtension',
|
|
12
|
+
"Running Extensions"
|
|
13
|
+
))), [( new SyncDescriptor(RuntimeExtensionsInput))]);
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { __decorate, __param } from '../../../../../../../external/tslib/tslib.es6.js';
|
|
2
|
+
import { IExtensionService } from 'vscode/vscode/vs/workbench/services/extensions/common/extensions';
|
|
3
|
+
import { IProgressService } from 'monaco-editor/esm/vs/platform/progress/common/progress.js';
|
|
4
|
+
import { localizeWithPath } from 'monaco-editor/esm/vs/nls.js';
|
|
5
|
+
import { DeferredPromise, timeout } from 'monaco-editor/esm/vs/base/common/async.js';
|
|
6
|
+
import { ILogService } from 'monaco-editor/esm/vs/platform/log/common/log.js';
|
|
7
|
+
import { CancellationToken } from 'monaco-editor/esm/vs/base/common/cancellation.js';
|
|
8
|
+
|
|
9
|
+
let ExtensionActivationProgress = class ExtensionActivationProgress {
|
|
10
|
+
constructor(extensionService, progressService, logService) {
|
|
11
|
+
const options = {
|
|
12
|
+
location: 10 ,
|
|
13
|
+
title: ( localizeWithPath(
|
|
14
|
+
'vs/workbench/contrib/extensions/browser/extensionsActivationProgress',
|
|
15
|
+
'activation',
|
|
16
|
+
"Activating Extensions..."
|
|
17
|
+
))
|
|
18
|
+
};
|
|
19
|
+
let deferred;
|
|
20
|
+
let count = 0;
|
|
21
|
+
this._listener = extensionService.onWillActivateByEvent(e => {
|
|
22
|
+
logService.trace('onWillActivateByEvent: ', e.event);
|
|
23
|
+
if (!deferred) {
|
|
24
|
+
deferred = ( new DeferredPromise());
|
|
25
|
+
progressService.withProgress(options, _ => deferred.p);
|
|
26
|
+
}
|
|
27
|
+
count++;
|
|
28
|
+
Promise.race([e.activation, timeout(5000, CancellationToken.None)]).finally(() => {
|
|
29
|
+
if (--count === 0) {
|
|
30
|
+
deferred.complete(undefined);
|
|
31
|
+
deferred = undefined;
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
dispose() {
|
|
37
|
+
this._listener.dispose();
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
ExtensionActivationProgress = ( __decorate([
|
|
41
|
+
( __param(0, IExtensionService)),
|
|
42
|
+
( __param(1, IProgressService)),
|
|
43
|
+
( __param(2, ILogService))
|
|
44
|
+
], ExtensionActivationProgress));
|
|
45
|
+
|
|
46
|
+
export { ExtensionActivationProgress };
|
package/vscode/src/vs/workbench/contrib/extensions/browser/extensionsCompletionItemsProvider.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { __decorate, __param } from '../../../../../../../external/tslib/tslib.es6.js';
|
|
2
|
+
import { localizeWithPath } from 'monaco-editor/esm/vs/nls.js';
|
|
3
|
+
import { getLocation, parse } from 'monaco-editor/esm/vs/base/common/json.js';
|
|
4
|
+
import { Disposable } from 'monaco-editor/esm/vs/base/common/lifecycle.js';
|
|
5
|
+
import { IExtensionManagementService } from 'vscode/vscode/vs/platform/extensionManagement/common/extensionManagement';
|
|
6
|
+
import { Range } from 'monaco-editor/esm/vs/editor/common/core/range.js';
|
|
7
|
+
import { ILanguageFeaturesService } from 'monaco-editor/esm/vs/editor/common/services/languageFeatures.js';
|
|
8
|
+
|
|
9
|
+
let ExtensionsCompletionItemsProvider = class ExtensionsCompletionItemsProvider extends Disposable {
|
|
10
|
+
constructor(extensionManagementService, languageFeaturesService) {
|
|
11
|
+
super();
|
|
12
|
+
this.extensionManagementService = extensionManagementService;
|
|
13
|
+
this._register(languageFeaturesService.completionProvider.register({ language: 'jsonc', pattern: '**/settings.json' }, {
|
|
14
|
+
_debugDisplayName: 'extensionsCompletionProvider',
|
|
15
|
+
provideCompletionItems: async (model, position, _context, token) => {
|
|
16
|
+
const getWordRangeAtPosition = (model, position) => {
|
|
17
|
+
const wordAtPosition = model.getWordAtPosition(position);
|
|
18
|
+
return wordAtPosition ? ( new Range(
|
|
19
|
+
position.lineNumber,
|
|
20
|
+
wordAtPosition.startColumn,
|
|
21
|
+
position.lineNumber,
|
|
22
|
+
wordAtPosition.endColumn
|
|
23
|
+
)) : null;
|
|
24
|
+
};
|
|
25
|
+
const location = getLocation(model.getValue(), model.getOffsetAt(position));
|
|
26
|
+
const range = getWordRangeAtPosition(model, position) ?? Range.fromPositions(position, position);
|
|
27
|
+
if (location.path[0] === 'extensions.supportUntrustedWorkspaces' && location.path.length === 2 && location.isAtPropertyKey) {
|
|
28
|
+
let alreadyConfigured = [];
|
|
29
|
+
try {
|
|
30
|
+
alreadyConfigured = ( Object.keys(parse(model.getValue())['extensions.supportUntrustedWorkspaces']));
|
|
31
|
+
}
|
|
32
|
+
catch (e) { }
|
|
33
|
+
return { suggestions: await this.provideSupportUntrustedWorkspacesExtensionProposals(alreadyConfigured, range) };
|
|
34
|
+
}
|
|
35
|
+
return { suggestions: [] };
|
|
36
|
+
}
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
async provideSupportUntrustedWorkspacesExtensionProposals(alreadyConfigured, range) {
|
|
40
|
+
const suggestions = [];
|
|
41
|
+
const installedExtensions = (await this.extensionManagementService.getInstalled()).filter(e => e.manifest.main);
|
|
42
|
+
const proposedExtensions = installedExtensions.filter(e => alreadyConfigured.indexOf(e.identifier.id) === -1);
|
|
43
|
+
if (proposedExtensions.length) {
|
|
44
|
+
suggestions.push(...( proposedExtensions.map(e => {
|
|
45
|
+
const text = `"${e.identifier.id}": {\n\t"supported": true,\n\t"version": "${e.manifest.version}"\n},`;
|
|
46
|
+
return { label: e.identifier.id, kind: 13 , insertText: text, filterText: text, range };
|
|
47
|
+
})));
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
const text = '"vscode.csharp": {\n\t"supported": true,\n\t"version": "0.0.0"\n},';
|
|
51
|
+
suggestions.push({ label: ( localizeWithPath(
|
|
52
|
+
'vs/workbench/contrib/extensions/browser/extensionsCompletionItemsProvider',
|
|
53
|
+
'exampleExtension',
|
|
54
|
+
"Example"
|
|
55
|
+
)), kind: 13 , insertText: text, filterText: text, range });
|
|
56
|
+
}
|
|
57
|
+
return suggestions;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
ExtensionsCompletionItemsProvider = ( __decorate([
|
|
61
|
+
( __param(0, IExtensionManagementService)),
|
|
62
|
+
( __param(1, ILanguageFeaturesService))
|
|
63
|
+
], ExtensionsCompletionItemsProvider));
|
|
64
|
+
|
|
65
|
+
export { ExtensionsCompletionItemsProvider };
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { __decorate, __param } from '../../../../../../../external/tslib/tslib.es6.js';
|
|
2
|
+
import { IExtensionsWorkbenchService } from 'vscode/vscode/vs/workbench/contrib/extensions/common/extensions';
|
|
3
|
+
import { IExtensionService } from 'vscode/vscode/vs/workbench/services/extensions/common/extensions';
|
|
4
|
+
import { CommandsRegistry } from 'monaco-editor/esm/vs/platform/commands/common/commands.js';
|
|
5
|
+
import { MenuRegistry, MenuId } from 'monaco-editor/esm/vs/platform/actions/common/actions.js';
|
|
6
|
+
import { localizeWithPath } from 'monaco-editor/esm/vs/nls.js';
|
|
7
|
+
import { areSameExtensions } from 'vscode/vscode/vs/platform/extensionManagement/common/extensionManagementUtil';
|
|
8
|
+
import { Severity, INotificationService } from 'monaco-editor/esm/vs/platform/notification/common/notification.js';
|
|
9
|
+
import { Action } from 'monaco-editor/esm/vs/base/common/actions.js';
|
|
10
|
+
import { IHostService } from 'vscode/vscode/vs/workbench/services/host/browser/host';
|
|
11
|
+
import { Disposable } from 'monaco-editor/esm/vs/base/common/lifecycle.js';
|
|
12
|
+
import { CancellationToken } from 'monaco-editor/esm/vs/base/common/cancellation.js';
|
|
13
|
+
import { Promises } from 'monaco-editor/esm/vs/base/common/async.js';
|
|
14
|
+
|
|
15
|
+
let ExtensionDependencyChecker = class ExtensionDependencyChecker extends Disposable {
|
|
16
|
+
constructor(extensionService, extensionsWorkbenchService, notificationService, hostService) {
|
|
17
|
+
super();
|
|
18
|
+
this.extensionService = extensionService;
|
|
19
|
+
this.extensionsWorkbenchService = extensionsWorkbenchService;
|
|
20
|
+
this.notificationService = notificationService;
|
|
21
|
+
this.hostService = hostService;
|
|
22
|
+
CommandsRegistry.registerCommand('workbench.extensions.installMissingDependencies', () => this.installMissingDependencies());
|
|
23
|
+
MenuRegistry.appendMenuItem(MenuId.CommandPalette, {
|
|
24
|
+
command: {
|
|
25
|
+
id: 'workbench.extensions.installMissingDependencies',
|
|
26
|
+
category: ( localizeWithPath(
|
|
27
|
+
'vs/workbench/contrib/extensions/browser/extensionsDependencyChecker',
|
|
28
|
+
'extensions',
|
|
29
|
+
"Extensions"
|
|
30
|
+
)),
|
|
31
|
+
title: ( localizeWithPath(
|
|
32
|
+
'vs/workbench/contrib/extensions/browser/extensionsDependencyChecker',
|
|
33
|
+
'auto install missing deps',
|
|
34
|
+
"Install Missing Dependencies"
|
|
35
|
+
))
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async getUninstalledMissingDependencies() {
|
|
40
|
+
const allMissingDependencies = await this.getAllMissingDependencies();
|
|
41
|
+
const localExtensions = await this.extensionsWorkbenchService.queryLocal();
|
|
42
|
+
return allMissingDependencies.filter(id => localExtensions.every(l => !areSameExtensions(l.identifier, { id })));
|
|
43
|
+
}
|
|
44
|
+
async getAllMissingDependencies() {
|
|
45
|
+
await this.extensionService.whenInstalledExtensionsRegistered();
|
|
46
|
+
const runningExtensionsIds = this.extensionService.extensions.reduce((result, r) => { result.add(r.identifier.value.toLowerCase()); return result; }, ( new Set()));
|
|
47
|
+
const missingDependencies = ( new Set());
|
|
48
|
+
for (const extension of this.extensionService.extensions) {
|
|
49
|
+
if (extension.extensionDependencies) {
|
|
50
|
+
extension.extensionDependencies.forEach(dep => {
|
|
51
|
+
if (!( runningExtensionsIds.has(dep.toLowerCase()))) {
|
|
52
|
+
missingDependencies.add(dep);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return [...( missingDependencies.values())];
|
|
58
|
+
}
|
|
59
|
+
async installMissingDependencies() {
|
|
60
|
+
const missingDependencies = await this.getUninstalledMissingDependencies();
|
|
61
|
+
if (missingDependencies.length) {
|
|
62
|
+
const extensions = await this.extensionsWorkbenchService.getExtensions(( missingDependencies.map(id => ({ id }))), CancellationToken.None);
|
|
63
|
+
if (extensions.length) {
|
|
64
|
+
await Promises.settled(( extensions.map(extension => this.extensionsWorkbenchService.install(extension))));
|
|
65
|
+
this.notificationService.notify({
|
|
66
|
+
severity: Severity.Info,
|
|
67
|
+
message: ( localizeWithPath(
|
|
68
|
+
'vs/workbench/contrib/extensions/browser/extensionsDependencyChecker',
|
|
69
|
+
'finished installing missing deps',
|
|
70
|
+
"Finished installing missing dependencies. Please reload the window now."
|
|
71
|
+
)),
|
|
72
|
+
actions: {
|
|
73
|
+
primary: [( new Action('realod', ( localizeWithPath(
|
|
74
|
+
'vs/workbench/contrib/extensions/browser/extensionsDependencyChecker',
|
|
75
|
+
'reload',
|
|
76
|
+
"Reload Window"
|
|
77
|
+
)), '', true, () => this.hostService.reload()))]
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
this.notificationService.info(( localizeWithPath(
|
|
84
|
+
'vs/workbench/contrib/extensions/browser/extensionsDependencyChecker',
|
|
85
|
+
'no missing deps',
|
|
86
|
+
"There are no missing dependencies to install."
|
|
87
|
+
)));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
ExtensionDependencyChecker = ( __decorate([
|
|
92
|
+
( __param(0, IExtensionService)),
|
|
93
|
+
( __param(1, IExtensionsWorkbenchService)),
|
|
94
|
+
( __param(2, INotificationService)),
|
|
95
|
+
( __param(3, IHostService))
|
|
96
|
+
], ExtensionDependencyChecker));
|
|
97
|
+
|
|
98
|
+
export { ExtensionDependencyChecker };
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { __decorate, __param } from '../../../../../../../external/tslib/tslib.es6.js';
|
|
2
|
+
import './media/extension.css.js';
|
|
3
|
+
import { append, $, addDisposableListener } from 'monaco-editor/esm/vs/base/browser/dom.js';
|
|
4
|
+
import { combinedDisposable, dispose } from 'monaco-editor/esm/vs/base/common/lifecycle.js';
|
|
5
|
+
import { ActionBar } from 'monaco-editor/esm/vs/base/browser/ui/actionbar/actionbar.js';
|
|
6
|
+
import { IInstantiationService } from 'monaco-editor/esm/vs/platform/instantiation/common/instantiation.js';
|
|
7
|
+
import { Event } from 'monaco-editor/esm/vs/base/common/event.js';
|
|
8
|
+
import { ExtensionContainers, IExtensionsWorkbenchService } from 'vscode/vscode/vs/workbench/contrib/extensions/common/extensions';
|
|
9
|
+
import { ActionWithDropDownAction, ExtensionActionWithDropdownActionViewItem, ExtensionDropDownAction, ExtensionStatusAction, ExtensionStatusLabelAction, MigrateDeprecatedExtensionAction, ReloadAction, UpdateAction, SkipUpdateAction, InstallDropdownAction, InstallingLabelAction, SetLanguageAction, ClearLanguageAction, RemoteInstallAction, LocalInstallAction, WebInstallAction, SwitchToReleasedVersionAction, SwitchToPreReleaseVersionAction, ManageExtensionAction } from 'vscode/vscode/vs/workbench/contrib/extensions/browser/extensionsActions';
|
|
10
|
+
import { areSameExtensions } from 'vscode/vscode/vs/platform/extensionManagement/common/extensionManagementUtil';
|
|
11
|
+
import { extensionVerifiedPublisherIconColor, RecommendationWidget, PreReleaseBookmarkWidget, RemoteBadgeWidget, ExtensionPackCountWidget, VerifiedPublisherWidget, ExtensionHoverWidget, SyncIgnoredWidget, ExtensionActivationStatusWidget, InstallCountWidget, RatingsWidget } from './extensionsWidgets.js';
|
|
12
|
+
import { IExtensionService, toExtension } from 'vscode/vscode/vs/workbench/services/extensions/common/extensions';
|
|
13
|
+
import { IExtensionManagementServerService } from 'vscode/vscode/vs/workbench/services/extensionManagement/common/extensionManagement';
|
|
14
|
+
import { INotificationService } from 'monaco-editor/esm/vs/platform/notification/common/notification.js';
|
|
15
|
+
import { isLanguagePackExtension } from 'monaco-editor/esm/vs/platform/extensions/common/extensions.js';
|
|
16
|
+
import { registerThemingParticipant } from 'monaco-editor/esm/vs/platform/theme/common/themeService.js';
|
|
17
|
+
import { ThemeIcon } from 'monaco-editor/esm/vs/base/common/themables.js';
|
|
18
|
+
import { WORKBENCH_BACKGROUND } from 'vscode/vscode/vs/workbench/common/theme';
|
|
19
|
+
import { IContextMenuService } from 'monaco-editor/esm/vs/platform/contextview/browser/contextView.js';
|
|
20
|
+
import { verifiedPublisherIcon } from 'vscode/vscode/vs/workbench/contrib/extensions/browser/extensionsIcons';
|
|
21
|
+
|
|
22
|
+
const EXTENSION_LIST_ELEMENT_HEIGHT = 72;
|
|
23
|
+
class Delegate {
|
|
24
|
+
getHeight() { return EXTENSION_LIST_ELEMENT_HEIGHT; }
|
|
25
|
+
getTemplateId() { return 'extension'; }
|
|
26
|
+
}
|
|
27
|
+
let Renderer = class Renderer {
|
|
28
|
+
constructor(extensionViewState, options, instantiationService, notificationService, extensionService, extensionManagementServerService, extensionsWorkbenchService, contextMenuService) {
|
|
29
|
+
this.extensionViewState = extensionViewState;
|
|
30
|
+
this.options = options;
|
|
31
|
+
this.instantiationService = instantiationService;
|
|
32
|
+
this.notificationService = notificationService;
|
|
33
|
+
this.extensionService = extensionService;
|
|
34
|
+
this.extensionManagementServerService = extensionManagementServerService;
|
|
35
|
+
this.extensionsWorkbenchService = extensionsWorkbenchService;
|
|
36
|
+
this.contextMenuService = contextMenuService;
|
|
37
|
+
}
|
|
38
|
+
get templateId() { return 'extension'; }
|
|
39
|
+
renderTemplate(root) {
|
|
40
|
+
const recommendationWidget = this.instantiationService.createInstance(RecommendationWidget, append(root, $('.extension-bookmark-container')));
|
|
41
|
+
const preReleaseWidget = this.instantiationService.createInstance(PreReleaseBookmarkWidget, append(root, $('.extension-bookmark-container')));
|
|
42
|
+
const element = append(root, $('.extension-list-item'));
|
|
43
|
+
const iconContainer = append(element, $('.icon-container'));
|
|
44
|
+
const icon = append(iconContainer, $('img.icon', { alt: '' }));
|
|
45
|
+
const iconRemoteBadgeWidget = this.instantiationService.createInstance(RemoteBadgeWidget, iconContainer, false);
|
|
46
|
+
const extensionPackBadgeWidget = this.instantiationService.createInstance(ExtensionPackCountWidget, iconContainer);
|
|
47
|
+
const details = append(element, $('.details'));
|
|
48
|
+
const headerContainer = append(details, $('.header-container'));
|
|
49
|
+
const header = append(headerContainer, $('.header'));
|
|
50
|
+
const name = append(header, $('span.name'));
|
|
51
|
+
const installCount = append(header, $('span.install-count'));
|
|
52
|
+
const ratings = append(header, $('span.ratings'));
|
|
53
|
+
const syncIgnore = append(header, $('span.sync-ignored'));
|
|
54
|
+
const activationStatus = append(header, $('span.activation-status'));
|
|
55
|
+
const headerRemoteBadgeWidget = this.instantiationService.createInstance(RemoteBadgeWidget, header, false);
|
|
56
|
+
const description = append(details, $('.description.ellipsis'));
|
|
57
|
+
const footer = append(details, $('.footer'));
|
|
58
|
+
const publisher = append(footer, $('.author.ellipsis'));
|
|
59
|
+
const verifiedPublisherWidget = this.instantiationService.createInstance(VerifiedPublisherWidget, append(publisher, $(`.verified-publisher`)), true);
|
|
60
|
+
const publisherDisplayName = append(publisher, $('.publisher-name.ellipsis'));
|
|
61
|
+
const actionbar = ( new ActionBar(footer, {
|
|
62
|
+
animated: false,
|
|
63
|
+
actionViewItemProvider: (action) => {
|
|
64
|
+
if (action instanceof ActionWithDropDownAction) {
|
|
65
|
+
return ( new ExtensionActionWithDropdownActionViewItem(
|
|
66
|
+
action,
|
|
67
|
+
{ icon: true, label: true, menuActionsOrProvider: { getActions: () => action.menuActions }, menuActionClassNames: (action.class || '').split(' ') },
|
|
68
|
+
this.contextMenuService
|
|
69
|
+
));
|
|
70
|
+
}
|
|
71
|
+
if (action instanceof ExtensionDropDownAction) {
|
|
72
|
+
return action.createActionViewItem();
|
|
73
|
+
}
|
|
74
|
+
return undefined;
|
|
75
|
+
},
|
|
76
|
+
focusOnlyEnabledItems: true
|
|
77
|
+
}));
|
|
78
|
+
actionbar.setFocusable(false);
|
|
79
|
+
actionbar.onDidRun(({ error }) => error && this.notificationService.error(error));
|
|
80
|
+
const extensionStatusIconAction = this.instantiationService.createInstance(ExtensionStatusAction);
|
|
81
|
+
const actions = [
|
|
82
|
+
this.instantiationService.createInstance(ExtensionStatusLabelAction),
|
|
83
|
+
this.instantiationService.createInstance(MigrateDeprecatedExtensionAction, true),
|
|
84
|
+
this.instantiationService.createInstance(ReloadAction),
|
|
85
|
+
this.instantiationService.createInstance(ActionWithDropDownAction, 'extensions.updateActions', '', [[this.instantiationService.createInstance(UpdateAction, false)], [this.instantiationService.createInstance(SkipUpdateAction)]]),
|
|
86
|
+
this.instantiationService.createInstance(InstallDropdownAction),
|
|
87
|
+
this.instantiationService.createInstance(InstallingLabelAction),
|
|
88
|
+
this.instantiationService.createInstance(SetLanguageAction),
|
|
89
|
+
this.instantiationService.createInstance(ClearLanguageAction),
|
|
90
|
+
this.instantiationService.createInstance(RemoteInstallAction, false),
|
|
91
|
+
this.instantiationService.createInstance(LocalInstallAction),
|
|
92
|
+
this.instantiationService.createInstance(WebInstallAction),
|
|
93
|
+
extensionStatusIconAction,
|
|
94
|
+
this.instantiationService.createInstance(SwitchToReleasedVersionAction, true),
|
|
95
|
+
this.instantiationService.createInstance(SwitchToPreReleaseVersionAction, true),
|
|
96
|
+
this.instantiationService.createInstance(ManageExtensionAction)
|
|
97
|
+
];
|
|
98
|
+
const extensionHoverWidget = this.instantiationService.createInstance(ExtensionHoverWidget, { target: root, position: this.options.hoverOptions.position }, extensionStatusIconAction);
|
|
99
|
+
const widgets = [
|
|
100
|
+
recommendationWidget,
|
|
101
|
+
preReleaseWidget,
|
|
102
|
+
iconRemoteBadgeWidget,
|
|
103
|
+
extensionPackBadgeWidget,
|
|
104
|
+
headerRemoteBadgeWidget,
|
|
105
|
+
verifiedPublisherWidget,
|
|
106
|
+
extensionHoverWidget,
|
|
107
|
+
this.instantiationService.createInstance(SyncIgnoredWidget, syncIgnore),
|
|
108
|
+
this.instantiationService.createInstance(ExtensionActivationStatusWidget, activationStatus, true),
|
|
109
|
+
this.instantiationService.createInstance(InstallCountWidget, installCount, true),
|
|
110
|
+
this.instantiationService.createInstance(RatingsWidget, ratings, true),
|
|
111
|
+
];
|
|
112
|
+
const extensionContainers = this.instantiationService.createInstance(ExtensionContainers, [...actions, ...widgets]);
|
|
113
|
+
actionbar.push(actions, { icon: true, label: true });
|
|
114
|
+
const disposable = combinedDisposable(...actions, ...widgets, actionbar, extensionContainers);
|
|
115
|
+
return {
|
|
116
|
+
root, element, icon, name, installCount, ratings, description, publisherDisplayName, disposables: [disposable], actionbar,
|
|
117
|
+
extensionDisposables: [],
|
|
118
|
+
set extension(extension) {
|
|
119
|
+
extensionContainers.extension = extension;
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
renderPlaceholder(index, data) {
|
|
124
|
+
data.element.classList.add('loading');
|
|
125
|
+
data.root.removeAttribute('aria-label');
|
|
126
|
+
data.root.removeAttribute('data-extension-id');
|
|
127
|
+
data.extensionDisposables = dispose(data.extensionDisposables);
|
|
128
|
+
data.icon.src = '';
|
|
129
|
+
data.name.textContent = '';
|
|
130
|
+
data.description.textContent = '';
|
|
131
|
+
data.publisherDisplayName.textContent = '';
|
|
132
|
+
data.installCount.style.display = 'none';
|
|
133
|
+
data.ratings.style.display = 'none';
|
|
134
|
+
data.extension = null;
|
|
135
|
+
}
|
|
136
|
+
renderElement(extension, index, data) {
|
|
137
|
+
data.element.classList.remove('loading');
|
|
138
|
+
data.root.setAttribute('data-extension-id', extension.identifier.id);
|
|
139
|
+
if (extension.state !== 3 && !extension.server) {
|
|
140
|
+
extension = this.extensionsWorkbenchService.local.filter(e => e.server === extension.server && areSameExtensions(e.identifier, extension.identifier))[0] || extension;
|
|
141
|
+
}
|
|
142
|
+
data.extensionDisposables = dispose(data.extensionDisposables);
|
|
143
|
+
const computeEnablement = async () => {
|
|
144
|
+
if (extension.state === 3 ) {
|
|
145
|
+
if (!!extension.deprecationInfo) {
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
if (this.extensionsWorkbenchService.canSetLanguage(extension)) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
return !(await this.extensionsWorkbenchService.canInstall(extension));
|
|
152
|
+
}
|
|
153
|
+
else if (extension.local && !isLanguagePackExtension(extension.local.manifest)) {
|
|
154
|
+
const runningExtension = this.extensionService.extensions.filter(e => areSameExtensions({ id: e.identifier.value, uuid: e.uuid }, extension.identifier))[0];
|
|
155
|
+
return !(runningExtension && extension.server === this.extensionManagementServerService.getExtensionManagementServer(toExtension(runningExtension)));
|
|
156
|
+
}
|
|
157
|
+
return false;
|
|
158
|
+
};
|
|
159
|
+
const updateEnablement = async () => {
|
|
160
|
+
const disabled = await computeEnablement();
|
|
161
|
+
const deprecated = !!extension.deprecationInfo;
|
|
162
|
+
data.element.classList.toggle('deprecated', deprecated);
|
|
163
|
+
data.root.classList.toggle('disabled', disabled);
|
|
164
|
+
};
|
|
165
|
+
updateEnablement();
|
|
166
|
+
this.extensionService.onDidChangeExtensions(() => updateEnablement(), this, data.extensionDisposables);
|
|
167
|
+
data.extensionDisposables.push(addDisposableListener(data.icon, 'error', () => data.icon.src = extension.iconUrlFallback, { once: true }));
|
|
168
|
+
data.icon.src = extension.iconUrl;
|
|
169
|
+
if (!data.icon.complete) {
|
|
170
|
+
data.icon.style.visibility = 'hidden';
|
|
171
|
+
data.icon.onload = () => data.icon.style.visibility = 'inherit';
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
data.icon.style.visibility = 'inherit';
|
|
175
|
+
}
|
|
176
|
+
data.name.textContent = extension.displayName;
|
|
177
|
+
data.description.textContent = extension.description;
|
|
178
|
+
const updatePublisher = () => {
|
|
179
|
+
data.publisherDisplayName.textContent = extension.publisherDisplayName;
|
|
180
|
+
};
|
|
181
|
+
updatePublisher();
|
|
182
|
+
Event.filter(this.extensionsWorkbenchService.onChange, e => !!e && areSameExtensions(e.identifier, extension.identifier))(() => updatePublisher(), this, data.extensionDisposables);
|
|
183
|
+
data.installCount.style.display = '';
|
|
184
|
+
data.ratings.style.display = '';
|
|
185
|
+
data.extension = extension;
|
|
186
|
+
if (extension.gallery && extension.gallery.properties && extension.gallery.properties.localizedLanguages && extension.gallery.properties.localizedLanguages.length) {
|
|
187
|
+
data.description.textContent = ( extension.gallery.properties.localizedLanguages.map(name => name[0].toLocaleUpperCase() + name.slice(1))).join(', ');
|
|
188
|
+
}
|
|
189
|
+
this.extensionViewState.onFocus(e => {
|
|
190
|
+
if (areSameExtensions(extension.identifier, e.identifier)) {
|
|
191
|
+
data.actionbar.setFocusable(true);
|
|
192
|
+
}
|
|
193
|
+
}, this, data.extensionDisposables);
|
|
194
|
+
this.extensionViewState.onBlur(e => {
|
|
195
|
+
if (areSameExtensions(extension.identifier, e.identifier)) {
|
|
196
|
+
data.actionbar.setFocusable(false);
|
|
197
|
+
}
|
|
198
|
+
}, this, data.extensionDisposables);
|
|
199
|
+
}
|
|
200
|
+
disposeElement(extension, index, data) {
|
|
201
|
+
data.extensionDisposables = dispose(data.extensionDisposables);
|
|
202
|
+
}
|
|
203
|
+
disposeTemplate(data) {
|
|
204
|
+
data.extensionDisposables = dispose(data.extensionDisposables);
|
|
205
|
+
data.disposables = dispose(data.disposables);
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
Renderer = ( __decorate([
|
|
209
|
+
( __param(2, IInstantiationService)),
|
|
210
|
+
( __param(3, INotificationService)),
|
|
211
|
+
( __param(4, IExtensionService)),
|
|
212
|
+
( __param(5, IExtensionManagementServerService)),
|
|
213
|
+
( __param(6, IExtensionsWorkbenchService)),
|
|
214
|
+
( __param(7, IContextMenuService))
|
|
215
|
+
], Renderer));
|
|
216
|
+
registerThemingParticipant((theme, collector) => {
|
|
217
|
+
const verifiedPublisherIconColor = theme.getColor(extensionVerifiedPublisherIconColor);
|
|
218
|
+
if (verifiedPublisherIconColor) {
|
|
219
|
+
const disabledVerifiedPublisherIconColor = ( verifiedPublisherIconColor.transparent(.5)).makeOpaque(WORKBENCH_BACKGROUND(theme));
|
|
220
|
+
collector.addRule(`.extensions-list .monaco-list .monaco-list-row.disabled .author .verified-publisher ${ThemeIcon.asCSSSelector(verifiedPublisherIcon)} { color: ${disabledVerifiedPublisherIconColor}; }`);
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
export { Delegate, Renderer };
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { __decorate, __param } from '../../../../../../../external/tslib/tslib.es6.js';
|
|
2
|
+
import { PickerQuickAccessProvider } from 'vscode/vscode/vs/platform/quickinput/browser/pickerQuickAccess';
|
|
3
|
+
import { localizeWithPath } from 'monaco-editor/esm/vs/nls.js';
|
|
4
|
+
import { VIEWLET_ID } from 'vscode/vscode/vs/workbench/contrib/extensions/common/extensions';
|
|
5
|
+
import { IExtensionGalleryService, IExtensionManagementService } from 'vscode/vscode/vs/platform/extensionManagement/common/extensionManagement';
|
|
6
|
+
import { INotificationService } from 'monaco-editor/esm/vs/platform/notification/common/notification.js';
|
|
7
|
+
import { ILogService } from 'monaco-editor/esm/vs/platform/log/common/log.js';
|
|
8
|
+
import { IPaneCompositePartService } from 'vscode/vscode/vs/workbench/services/panecomposite/browser/panecomposite';
|
|
9
|
+
|
|
10
|
+
var InstallExtensionQuickAccessProvider_1, ManageExtensionsQuickAccessProvider_1;
|
|
11
|
+
let InstallExtensionQuickAccessProvider = class InstallExtensionQuickAccessProvider extends PickerQuickAccessProvider {
|
|
12
|
+
static { InstallExtensionQuickAccessProvider_1 = this; }
|
|
13
|
+
static { this.PREFIX = 'ext install '; }
|
|
14
|
+
constructor(paneCompositeService, galleryService, extensionsService, notificationService, logService) {
|
|
15
|
+
super(InstallExtensionQuickAccessProvider_1.PREFIX);
|
|
16
|
+
this.paneCompositeService = paneCompositeService;
|
|
17
|
+
this.galleryService = galleryService;
|
|
18
|
+
this.extensionsService = extensionsService;
|
|
19
|
+
this.notificationService = notificationService;
|
|
20
|
+
this.logService = logService;
|
|
21
|
+
}
|
|
22
|
+
_getPicks(filter, disposables, token) {
|
|
23
|
+
if (!filter) {
|
|
24
|
+
return [{
|
|
25
|
+
label: ( localizeWithPath(
|
|
26
|
+
'vs/workbench/contrib/extensions/browser/extensionsQuickAccess',
|
|
27
|
+
'type',
|
|
28
|
+
"Type an extension name to install or search."
|
|
29
|
+
))
|
|
30
|
+
}];
|
|
31
|
+
}
|
|
32
|
+
const genericSearchPickItem = {
|
|
33
|
+
label: ( localizeWithPath(
|
|
34
|
+
'vs/workbench/contrib/extensions/browser/extensionsQuickAccess',
|
|
35
|
+
'searchFor',
|
|
36
|
+
"Press Enter to search for extension '{0}'.",
|
|
37
|
+
filter
|
|
38
|
+
)),
|
|
39
|
+
accept: () => this.searchExtension(filter)
|
|
40
|
+
};
|
|
41
|
+
if (/\./.test(filter)) {
|
|
42
|
+
return this.getPicksForExtensionId(filter, genericSearchPickItem, token);
|
|
43
|
+
}
|
|
44
|
+
return [genericSearchPickItem];
|
|
45
|
+
}
|
|
46
|
+
async getPicksForExtensionId(filter, fallback, token) {
|
|
47
|
+
try {
|
|
48
|
+
const [galleryExtension] = await this.galleryService.getExtensions([{ id: filter }], token);
|
|
49
|
+
if (token.isCancellationRequested) {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
if (!galleryExtension) {
|
|
53
|
+
return [fallback];
|
|
54
|
+
}
|
|
55
|
+
return [{
|
|
56
|
+
label: ( localizeWithPath(
|
|
57
|
+
'vs/workbench/contrib/extensions/browser/extensionsQuickAccess',
|
|
58
|
+
'install',
|
|
59
|
+
"Press Enter to install extension '{0}'.",
|
|
60
|
+
filter
|
|
61
|
+
)),
|
|
62
|
+
accept: () => this.installExtension(galleryExtension, filter)
|
|
63
|
+
}];
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (token.isCancellationRequested) {
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
this.logService.error(error);
|
|
70
|
+
return [fallback];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async installExtension(extension, name) {
|
|
74
|
+
try {
|
|
75
|
+
await openExtensionsViewlet(this.paneCompositeService, `@id:${name}`);
|
|
76
|
+
await this.extensionsService.installFromGallery(extension);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
this.notificationService.error(error);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async searchExtension(name) {
|
|
83
|
+
openExtensionsViewlet(this.paneCompositeService, name);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
InstallExtensionQuickAccessProvider = InstallExtensionQuickAccessProvider_1 = ( __decorate([
|
|
87
|
+
( __param(0, IPaneCompositePartService)),
|
|
88
|
+
( __param(1, IExtensionGalleryService)),
|
|
89
|
+
( __param(2, IExtensionManagementService)),
|
|
90
|
+
( __param(3, INotificationService)),
|
|
91
|
+
( __param(4, ILogService))
|
|
92
|
+
], InstallExtensionQuickAccessProvider));
|
|
93
|
+
let ManageExtensionsQuickAccessProvider = class ManageExtensionsQuickAccessProvider extends PickerQuickAccessProvider {
|
|
94
|
+
static { ManageExtensionsQuickAccessProvider_1 = this; }
|
|
95
|
+
static { this.PREFIX = 'ext '; }
|
|
96
|
+
constructor(paneCompositeService) {
|
|
97
|
+
super(ManageExtensionsQuickAccessProvider_1.PREFIX);
|
|
98
|
+
this.paneCompositeService = paneCompositeService;
|
|
99
|
+
}
|
|
100
|
+
_getPicks() {
|
|
101
|
+
return [{
|
|
102
|
+
label: ( localizeWithPath(
|
|
103
|
+
'vs/workbench/contrib/extensions/browser/extensionsQuickAccess',
|
|
104
|
+
'manage',
|
|
105
|
+
"Press Enter to manage your extensions."
|
|
106
|
+
)),
|
|
107
|
+
accept: () => openExtensionsViewlet(this.paneCompositeService)
|
|
108
|
+
}];
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
ManageExtensionsQuickAccessProvider = ManageExtensionsQuickAccessProvider_1 = ( __decorate([
|
|
112
|
+
( __param(0, IPaneCompositePartService))
|
|
113
|
+
], ManageExtensionsQuickAccessProvider));
|
|
114
|
+
async function openExtensionsViewlet(paneCompositeService, search = '') {
|
|
115
|
+
const viewlet = await paneCompositeService.openPaneComposite(VIEWLET_ID, 0 , true);
|
|
116
|
+
const view = viewlet?.getViewPaneContainer();
|
|
117
|
+
view?.search(search);
|
|
118
|
+
view?.focus();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export { InstallExtensionQuickAccessProvider, ManageExtensionsQuickAccessProvider };
|