@codingame/monaco-vscode-extensions-service-override 2.2.1 → 3.0.0
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/extensions.js +1 -82
- package/package.json +9 -9
- package/vscode/src/vs/platform/extensionManagement/common/extensionManagementCLI.js +497 -0
- package/vscode/src/vs/workbench/api/browser/extensionHost.contribution.js +104 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadCLICommands.js +103 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChat.js +0 -7
- package/vscode/src/vs/workbench/api/browser/mainThreadChatAgents2.js +23 -8
- package/vscode/src/vs/workbench/api/browser/mainThreadChatProvider.js +147 -10
- package/vscode/src/vs/workbench/api/browser/mainThreadChatVariables.js +11 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadComments.js +9 -6
- package/vscode/src/vs/workbench/api/browser/mainThreadDebugService.js +17 -3
- package/vscode/src/vs/workbench/api/browser/mainThreadEditor.js +4 -1
- package/vscode/src/vs/workbench/api/browser/mainThreadFileSystemEventService.js +2 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures.js +18 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadMessageService.js +19 -3
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookSaveParticipant.js +2 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadSaveParticipant.js +2 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadSpeech.js +25 -20
- package/vscode/src/vs/workbench/api/browser/mainThreadTerminalService.js +6 -8
- package/vscode/src/vs/workbench/api/browser/mainThreadWorkspace.js +2 -10
- package/vscode/src/vs/workbench/services/extensions/common/abstractExtensionService.js +40 -0
- package/vscode/src/vs/workbench/services/extensions/common/extensionHostManager.js +10 -10
package/extensions.js
CHANGED
|
@@ -37,88 +37,7 @@ import { changeUrlDomain } from './tools/url.js';
|
|
|
37
37
|
import { CustomSchemas } from '@codingame/monaco-vscode-files-service-override';
|
|
38
38
|
import { registerAssets } from 'vscode/assets';
|
|
39
39
|
import { getForcedExtensionHostKind } from 'vscode/extensions';
|
|
40
|
-
import 'vscode/
|
|
41
|
-
import 'vscode/vscode/vs/workbench/services/themes/common/iconExtensionPoint';
|
|
42
|
-
import 'vscode/vscode/vs/nls';
|
|
43
|
-
import 'vscode/vscode/vs/workbench/services/extensions/common/extensionsRegistry';
|
|
44
|
-
import 'vscode/vscode/vs/platform/theme/common/tokenClassificationRegistry';
|
|
45
|
-
import 'vscode/vscode/vs/workbench/contrib/codeEditor/browser/languageConfigurationExtensionPoint';
|
|
46
|
-
import 'vscode/vscode/vs/workbench/api/browser/statusBarExtensionPoint';
|
|
47
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadLocalization.js';
|
|
48
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadBulkEdits.js';
|
|
49
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadChatProvider.js';
|
|
50
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadChatAgents2.js';
|
|
51
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadChatVariables.js';
|
|
52
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadCodeInsets.js';
|
|
53
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadClipboard.js';
|
|
54
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadCommands.js';
|
|
55
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadConfiguration.js';
|
|
56
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadConsole.js';
|
|
57
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadDebugService.js';
|
|
58
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadDecorations.js';
|
|
59
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadDiagnostics.js';
|
|
60
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadDialogs.js';
|
|
61
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadDocumentContentProviders.js';
|
|
62
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadDocuments.js';
|
|
63
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.js';
|
|
64
|
-
import 'vscode/vscode/vs/editor/common/config/editorOptions';
|
|
65
|
-
import 'vscode/vscode/vs/editor/contrib/snippet/browser/snippetController2';
|
|
66
|
-
import 'vscode/vscode/vs/editor/contrib/editorState/browser/keybindingCancellation';
|
|
67
|
-
import 'vscode/vscode/vs/editor/contrib/snippet/browser/snippetParser';
|
|
68
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadEditors.js';
|
|
69
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadEditorTabs.js';
|
|
70
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadErrors.js';
|
|
71
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadExtensionService.js';
|
|
72
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadFileSystem.js';
|
|
73
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadFileSystemEventService.js';
|
|
74
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures.js';
|
|
75
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadLanguages.js';
|
|
76
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadLogService.js';
|
|
77
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadMessageService.js';
|
|
78
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadManagedSockets.js';
|
|
79
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadOutputService.js';
|
|
80
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadProgress.js';
|
|
81
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadQuickDiff.js';
|
|
82
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadQuickOpen.js';
|
|
83
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadRemoteConnectionData.js';
|
|
84
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadSaveParticipant.js';
|
|
85
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadSpeech.js';
|
|
86
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadEditSessionIdentityParticipant.js';
|
|
87
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadSCM.js';
|
|
88
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadSearch.js';
|
|
89
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadStatusBar.js';
|
|
90
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadStorage.js';
|
|
91
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadTelemetry.js';
|
|
92
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadTerminalService.js';
|
|
93
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadTheming.js';
|
|
94
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadTreeViews.js';
|
|
95
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadDownloadService.js';
|
|
96
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadUrls.js';
|
|
97
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadUriOpeners.js';
|
|
98
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadWindow.js';
|
|
99
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadWebviewManager.js';
|
|
100
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadWorkspace.js';
|
|
101
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadComments.js';
|
|
102
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadNotebook.js';
|
|
103
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadNotebookKernels.js';
|
|
104
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadNotebookDocumentsAndEditors.js';
|
|
105
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadNotebookRenderers.js';
|
|
106
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadNotebookSaveParticipant.js';
|
|
107
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadInteractive.js';
|
|
108
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadInlineChat.js';
|
|
109
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadChat.js';
|
|
110
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadTask.js';
|
|
111
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadLabelService.js';
|
|
112
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadTunnelService.js';
|
|
113
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadAuthentication.js';
|
|
114
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadTimeline.js';
|
|
115
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadTesting.js';
|
|
116
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadSecretState.js';
|
|
117
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadShare.js';
|
|
118
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadProfilContentHandlers.js';
|
|
119
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadAiRelatedInformation.js';
|
|
120
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadAiEmbeddingVector.js';
|
|
121
|
-
import './vscode/src/vs/workbench/api/browser/mainThreadIssueReporter.js';
|
|
40
|
+
import './vscode/src/vs/workbench/api/browser/extensionHost.contribution.js';
|
|
122
41
|
import { IDialogService } from 'vscode/vscode/vs/platform/dialogs/common/dialogs';
|
|
123
42
|
|
|
124
43
|
let EsmWebWorkerExtensionHost = class EsmWebWorkerExtensionHost extends WebWorkerExtensionHost {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codingame/monaco-vscode-extensions-service-override",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"keywords": [],
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "CodinGame",
|
|
@@ -18,15 +18,15 @@
|
|
|
18
18
|
"module": "index.js",
|
|
19
19
|
"types": "index.d.ts",
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"vscode": "npm:@codingame/monaco-vscode-api@
|
|
21
|
+
"vscode": "npm:@codingame/monaco-vscode-api@3.0.0",
|
|
22
22
|
"vscode-marked": "npm:marked@=3.0.2",
|
|
23
23
|
"vscode-semver": "npm:semver@=5.5.0",
|
|
24
|
-
"@codingame/monaco-vscode-files-service-override": "
|
|
25
|
-
"@codingame/monaco-vscode-quickaccess-service-override": "
|
|
26
|
-
"@codingame/monaco-vscode-extensions-service-override": "
|
|
27
|
-
"@codingame/monaco-vscode-environment-service-override": "
|
|
28
|
-
"@codingame/monaco-vscode-layout-service-override": "
|
|
29
|
-
"@codingame/monaco-vscode-host-service-override": "
|
|
30
|
-
"@codingame/monaco-vscode-base-service-override": "
|
|
24
|
+
"@codingame/monaco-vscode-files-service-override": "3.0.0",
|
|
25
|
+
"@codingame/monaco-vscode-quickaccess-service-override": "3.0.0",
|
|
26
|
+
"@codingame/monaco-vscode-extensions-service-override": "3.0.0",
|
|
27
|
+
"@codingame/monaco-vscode-environment-service-override": "3.0.0",
|
|
28
|
+
"@codingame/monaco-vscode-layout-service-override": "3.0.0",
|
|
29
|
+
"@codingame/monaco-vscode-host-service-override": "3.0.0",
|
|
30
|
+
"@codingame/monaco-vscode-base-service-override": "3.0.0"
|
|
31
31
|
}
|
|
32
32
|
}
|
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
import { __decorate, __param } from '../../../../../../external/tslib/tslib.es6.js';
|
|
2
|
+
import { CancellationToken } from 'vscode/vscode/vs/base/common/cancellation';
|
|
3
|
+
import { getErrorMessage, isCancellationError } from 'vscode/vscode/vs/base/common/errors';
|
|
4
|
+
import { Schemas } from 'vscode/vscode/vs/base/common/network';
|
|
5
|
+
import { basename } from 'vscode/vscode/vs/base/common/resources';
|
|
6
|
+
import { gt } from 'vscode-semver';
|
|
7
|
+
import { URI } from 'vscode/vscode/vs/base/common/uri';
|
|
8
|
+
import { localizeWithPath } from 'vscode/vscode/vs/nls';
|
|
9
|
+
import { EXTENSION_IDENTIFIER_REGEX, IExtensionManagementService, IExtensionGalleryService } from 'vscode/vscode/vs/platform/extensionManagement/common/extensionManagement';
|
|
10
|
+
import { getIdAndVersion, areSameExtensions, getGalleryExtensionId, getExtensionId } from 'vscode/vscode/vs/platform/extensionManagement/common/extensionManagementUtil';
|
|
11
|
+
import { EXTENSION_CATEGORIES } from 'vscode/vscode/vs/platform/extensions/common/extensions';
|
|
12
|
+
|
|
13
|
+
const notFound = (id) => ( localizeWithPath(
|
|
14
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
15
|
+
'notFound',
|
|
16
|
+
"Extension '{0}' not found.",
|
|
17
|
+
id
|
|
18
|
+
));
|
|
19
|
+
const useId = ( localizeWithPath(
|
|
20
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
21
|
+
'useId',
|
|
22
|
+
"Make sure you use the full extension ID, including the publisher, e.g.: {0}",
|
|
23
|
+
'ms-dotnettools.csharp'
|
|
24
|
+
));
|
|
25
|
+
let ExtensionManagementCLI = class ExtensionManagementCLI {
|
|
26
|
+
constructor(logger, extensionManagementService, extensionGalleryService) {
|
|
27
|
+
this.logger = logger;
|
|
28
|
+
this.extensionManagementService = extensionManagementService;
|
|
29
|
+
this.extensionGalleryService = extensionGalleryService;
|
|
30
|
+
}
|
|
31
|
+
get location() {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
async listExtensions(showVersions, category, profileLocation) {
|
|
35
|
+
let extensions = await this.extensionManagementService.getInstalled(1 , profileLocation);
|
|
36
|
+
const categories = ( EXTENSION_CATEGORIES.map(c => c.toLowerCase()));
|
|
37
|
+
if (category && category !== '') {
|
|
38
|
+
if (categories.indexOf(category.toLowerCase()) < 0) {
|
|
39
|
+
this.logger.info('Invalid category please enter a valid category. To list valid categories run --category without a category specified');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
extensions = extensions.filter(e => {
|
|
43
|
+
if (e.manifest.categories) {
|
|
44
|
+
const lowerCaseCategories = ( e.manifest.categories.map(c => c.toLowerCase()));
|
|
45
|
+
return lowerCaseCategories.indexOf(category.toLowerCase()) > -1;
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
else if (category === '') {
|
|
51
|
+
this.logger.info('Possible Categories: ');
|
|
52
|
+
categories.forEach(category => {
|
|
53
|
+
this.logger.info(category);
|
|
54
|
+
});
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (this.location) {
|
|
58
|
+
this.logger.info(( localizeWithPath(
|
|
59
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
60
|
+
'listFromLocation',
|
|
61
|
+
"Extensions installed on {0}:",
|
|
62
|
+
this.location
|
|
63
|
+
)));
|
|
64
|
+
}
|
|
65
|
+
extensions = extensions.sort((e1, e2) => e1.identifier.id.localeCompare(e2.identifier.id));
|
|
66
|
+
let lastId = undefined;
|
|
67
|
+
for (const extension of extensions) {
|
|
68
|
+
if (lastId !== extension.identifier.id) {
|
|
69
|
+
lastId = extension.identifier.id;
|
|
70
|
+
this.logger.info(showVersions ? `${lastId}@${extension.manifest.version}` : lastId);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async installExtensions(extensions, builtinExtensions, installOptions, force) {
|
|
75
|
+
const failed = [];
|
|
76
|
+
try {
|
|
77
|
+
if (extensions.length) {
|
|
78
|
+
this.logger.info(this.location ? ( localizeWithPath(
|
|
79
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
80
|
+
'installingExtensionsOnLocation',
|
|
81
|
+
"Installing extensions on {0}...",
|
|
82
|
+
this.location
|
|
83
|
+
)) : ( localizeWithPath(
|
|
84
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
85
|
+
'installingExtensions',
|
|
86
|
+
"Installing extensions..."
|
|
87
|
+
)));
|
|
88
|
+
}
|
|
89
|
+
const installVSIXInfos = [];
|
|
90
|
+
const installExtensionInfos = [];
|
|
91
|
+
const addInstallExtensionInfo = (id, version, isBuiltin) => {
|
|
92
|
+
installExtensionInfos.push({ id, version: version !== 'prerelease' ? version : undefined, installOptions: { ...installOptions, isBuiltin, installPreReleaseVersion: version === 'prerelease' || installOptions.installPreReleaseVersion } });
|
|
93
|
+
};
|
|
94
|
+
for (const extension of extensions) {
|
|
95
|
+
if (extension instanceof URI) {
|
|
96
|
+
installVSIXInfos.push({ vsix: extension, installOptions });
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
const [id, version] = getIdAndVersion(extension);
|
|
100
|
+
addInstallExtensionInfo(id, version, false);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
for (const extension of builtinExtensions) {
|
|
104
|
+
if (extension instanceof URI) {
|
|
105
|
+
installVSIXInfos.push({ vsix: extension, installOptions: { ...installOptions, isBuiltin: true, donotIncludePackAndDependencies: true } });
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const [id, version] = getIdAndVersion(extension);
|
|
109
|
+
addInstallExtensionInfo(id, version, true);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const installed = await this.extensionManagementService.getInstalled(1 , installOptions.profileLocation);
|
|
113
|
+
if (installVSIXInfos.length) {
|
|
114
|
+
await Promise.all(( installVSIXInfos.map(async ({ vsix, installOptions }) => {
|
|
115
|
+
try {
|
|
116
|
+
await this.installVSIX(vsix, installOptions, force, installed);
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
this.logger.error(err);
|
|
120
|
+
failed.push(( vsix.toString()));
|
|
121
|
+
}
|
|
122
|
+
})));
|
|
123
|
+
}
|
|
124
|
+
if (installExtensionInfos.length) {
|
|
125
|
+
const failedGalleryExtensions = await this.installGalleryExtensions(installExtensionInfos, installed, force);
|
|
126
|
+
failed.push(...failedGalleryExtensions);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
this.logger.error(( localizeWithPath(
|
|
131
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
132
|
+
'error while installing extensions',
|
|
133
|
+
"Error while installing extensions: {0}",
|
|
134
|
+
getErrorMessage(error)
|
|
135
|
+
)));
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
if (failed.length) {
|
|
139
|
+
throw new Error(localizeWithPath('vs/platform/extensionManagement/common/extensionManagementCLI', 'installation failed', "Failed Installing Extensions: {0}", failed.join(', ')));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async updateExtensions(profileLocation) {
|
|
143
|
+
const installedExtensions = await this.extensionManagementService.getInstalled(1 , profileLocation);
|
|
144
|
+
const installedExtensionsQuery = [];
|
|
145
|
+
for (const extension of installedExtensions) {
|
|
146
|
+
if (!!extension.identifier.uuid) {
|
|
147
|
+
installedExtensionsQuery.push({ ...extension.identifier, preRelease: extension.preRelease });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
this.logger.trace(( localizeWithPath(
|
|
151
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
152
|
+
{ key: 'updateExtensionsQuery', comment: ['Placeholder is for the count of extensions'] },
|
|
153
|
+
"Fetching latest versions for {0} extensions",
|
|
154
|
+
installedExtensionsQuery.length
|
|
155
|
+
)));
|
|
156
|
+
const availableVersions = await this.extensionGalleryService.getExtensions(installedExtensionsQuery, { compatible: true }, CancellationToken.None);
|
|
157
|
+
const extensionsToUpdate = [];
|
|
158
|
+
for (const newVersion of availableVersions) {
|
|
159
|
+
for (const oldVersion of installedExtensions) {
|
|
160
|
+
if (areSameExtensions(oldVersion.identifier, newVersion.identifier) && gt(newVersion.version, oldVersion.manifest.version)) {
|
|
161
|
+
extensionsToUpdate.push({
|
|
162
|
+
extension: newVersion,
|
|
163
|
+
options: { operation: 3 , installPreReleaseVersion: oldVersion.isPreReleaseVersion }
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (!extensionsToUpdate.length) {
|
|
169
|
+
this.logger.info(( localizeWithPath(
|
|
170
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
171
|
+
'updateExtensionsNoExtensions',
|
|
172
|
+
"No extension to update"
|
|
173
|
+
)));
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
this.logger.info(( localizeWithPath(
|
|
177
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
178
|
+
'updateExtensionsNewVersionsAvailable',
|
|
179
|
+
"Updating extensions: {0}",
|
|
180
|
+
( extensionsToUpdate.map(ext => ext.extension.identifier.id)).join(', ')
|
|
181
|
+
)));
|
|
182
|
+
const installationResult = await this.extensionManagementService.installGalleryExtensions(extensionsToUpdate);
|
|
183
|
+
for (const extensionResult of installationResult) {
|
|
184
|
+
if (extensionResult.error) {
|
|
185
|
+
this.logger.error(( localizeWithPath(
|
|
186
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
187
|
+
'errorUpdatingExtension',
|
|
188
|
+
"Error while updating extension {0}: {1}",
|
|
189
|
+
extensionResult.identifier.id,
|
|
190
|
+
getErrorMessage(extensionResult.error)
|
|
191
|
+
)));
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
this.logger.info(( localizeWithPath(
|
|
195
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
196
|
+
'successUpdate',
|
|
197
|
+
"Extension '{0}' v{1} was successfully updated.",
|
|
198
|
+
extensionResult.identifier.id,
|
|
199
|
+
extensionResult.local?.manifest.version
|
|
200
|
+
)));
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async installGalleryExtensions(installExtensionInfos, installed, force) {
|
|
205
|
+
installExtensionInfos = installExtensionInfos.filter(({ id, version }) => {
|
|
206
|
+
const installedExtension = installed.find(i => areSameExtensions(i.identifier, { id }));
|
|
207
|
+
if (installedExtension) {
|
|
208
|
+
if (!force && (!version || (version === 'prerelease' && installedExtension.preRelease))) {
|
|
209
|
+
this.logger.info(( localizeWithPath(
|
|
210
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
211
|
+
'alreadyInstalled-checkAndUpdate',
|
|
212
|
+
"Extension '{0}' v{1} is already installed. Use '--force' option to update to latest version or provide '@<version>' to install a specific version, for example: '{2}@1.2.3'.",
|
|
213
|
+
id,
|
|
214
|
+
installedExtension.manifest.version,
|
|
215
|
+
id
|
|
216
|
+
)));
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
if (version && installedExtension.manifest.version === version) {
|
|
220
|
+
this.logger.info(( localizeWithPath(
|
|
221
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
222
|
+
'alreadyInstalled',
|
|
223
|
+
"Extension '{0}' is already installed.",
|
|
224
|
+
`${id}@${version}`
|
|
225
|
+
)));
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return true;
|
|
230
|
+
});
|
|
231
|
+
if (!installExtensionInfos.length) {
|
|
232
|
+
return [];
|
|
233
|
+
}
|
|
234
|
+
const failed = [];
|
|
235
|
+
const extensionsToInstall = [];
|
|
236
|
+
const galleryExtensions = await this.getGalleryExtensions(installExtensionInfos);
|
|
237
|
+
await Promise.all(( installExtensionInfos.map(async ({ id, version, installOptions }) => {
|
|
238
|
+
const gallery = galleryExtensions.get(id.toLowerCase());
|
|
239
|
+
if (!gallery) {
|
|
240
|
+
this.logger.error(`${notFound(version ? `${id}@${version}` : id)}\n${useId}`);
|
|
241
|
+
failed.push(id);
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
try {
|
|
245
|
+
const manifest = await this.extensionGalleryService.getManifest(gallery, CancellationToken.None);
|
|
246
|
+
if (manifest && !this.validateExtensionKind(manifest)) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
this.logger.error(err.message || err.stack || err);
|
|
252
|
+
failed.push(id);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const installedExtension = installed.find(e => areSameExtensions(e.identifier, gallery.identifier));
|
|
256
|
+
if (installedExtension) {
|
|
257
|
+
if (gallery.version === installedExtension.manifest.version) {
|
|
258
|
+
this.logger.info(( localizeWithPath(
|
|
259
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
260
|
+
'alreadyInstalled',
|
|
261
|
+
"Extension '{0}' is already installed.",
|
|
262
|
+
version ? `${id}@${version}` : id
|
|
263
|
+
)));
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
this.logger.info(( localizeWithPath(
|
|
267
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
268
|
+
'updateMessage',
|
|
269
|
+
"Updating the extension '{0}' to the version {1}",
|
|
270
|
+
id,
|
|
271
|
+
gallery.version
|
|
272
|
+
)));
|
|
273
|
+
}
|
|
274
|
+
if (installOptions.isBuiltin) {
|
|
275
|
+
this.logger.info(version ? ( localizeWithPath(
|
|
276
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
277
|
+
'installing builtin with version',
|
|
278
|
+
"Installing builtin extension '{0}' v{1}...",
|
|
279
|
+
id,
|
|
280
|
+
version
|
|
281
|
+
)) : ( localizeWithPath(
|
|
282
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
283
|
+
'installing builtin ',
|
|
284
|
+
"Installing builtin extension '{0}'...",
|
|
285
|
+
id
|
|
286
|
+
)));
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
this.logger.info(version ? ( localizeWithPath(
|
|
290
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
291
|
+
'installing with version',
|
|
292
|
+
"Installing extension '{0}' v{1}...",
|
|
293
|
+
id,
|
|
294
|
+
version
|
|
295
|
+
)) : ( localizeWithPath(
|
|
296
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
297
|
+
'installing',
|
|
298
|
+
"Installing extension '{0}'...",
|
|
299
|
+
id
|
|
300
|
+
)));
|
|
301
|
+
}
|
|
302
|
+
extensionsToInstall.push({
|
|
303
|
+
extension: gallery,
|
|
304
|
+
options: { ...installOptions, installGivenVersion: !!version },
|
|
305
|
+
});
|
|
306
|
+
})));
|
|
307
|
+
if (extensionsToInstall.length) {
|
|
308
|
+
const installationResult = await this.extensionManagementService.installGalleryExtensions(extensionsToInstall);
|
|
309
|
+
for (const extensionResult of installationResult) {
|
|
310
|
+
if (extensionResult.error) {
|
|
311
|
+
this.logger.error(( localizeWithPath(
|
|
312
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
313
|
+
'errorInstallingExtension',
|
|
314
|
+
"Error while installing extension {0}: {1}",
|
|
315
|
+
extensionResult.identifier.id,
|
|
316
|
+
getErrorMessage(extensionResult.error)
|
|
317
|
+
)));
|
|
318
|
+
failed.push(extensionResult.identifier.id);
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
this.logger.info(( localizeWithPath(
|
|
322
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
323
|
+
'successInstall',
|
|
324
|
+
"Extension '{0}' v{1} was successfully installed.",
|
|
325
|
+
extensionResult.identifier.id,
|
|
326
|
+
extensionResult.local?.manifest.version
|
|
327
|
+
)));
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return failed;
|
|
332
|
+
}
|
|
333
|
+
async installVSIX(vsix, installOptions, force, installedExtensions) {
|
|
334
|
+
const manifest = await this.extensionManagementService.getManifest(vsix);
|
|
335
|
+
if (!manifest) {
|
|
336
|
+
throw new Error('Invalid vsix');
|
|
337
|
+
}
|
|
338
|
+
const valid = await this.validateVSIX(manifest, force, installOptions.profileLocation, installedExtensions);
|
|
339
|
+
if (valid) {
|
|
340
|
+
try {
|
|
341
|
+
await this.extensionManagementService.install(vsix, installOptions);
|
|
342
|
+
this.logger.info(( localizeWithPath(
|
|
343
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
344
|
+
'successVsixInstall',
|
|
345
|
+
"Extension '{0}' was successfully installed.",
|
|
346
|
+
basename(vsix)
|
|
347
|
+
)));
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
if (isCancellationError(error)) {
|
|
351
|
+
this.logger.info(( localizeWithPath(
|
|
352
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
353
|
+
'cancelVsixInstall',
|
|
354
|
+
"Cancelled installing extension '{0}'.",
|
|
355
|
+
basename(vsix)
|
|
356
|
+
)));
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
throw error;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
async getGalleryExtensions(extensions) {
|
|
365
|
+
const galleryExtensions = ( new Map());
|
|
366
|
+
const preRelease = ( extensions.some(e => e.installOptions.installPreReleaseVersion));
|
|
367
|
+
const targetPlatform = await this.extensionManagementService.getTargetPlatform();
|
|
368
|
+
const extensionInfos = [];
|
|
369
|
+
for (const extension of extensions) {
|
|
370
|
+
if (EXTENSION_IDENTIFIER_REGEX.test(extension.id)) {
|
|
371
|
+
extensionInfos.push({ ...extension, preRelease });
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
if (extensionInfos.length) {
|
|
375
|
+
const result = await this.extensionGalleryService.getExtensions(extensionInfos, { targetPlatform }, CancellationToken.None);
|
|
376
|
+
for (const extension of result) {
|
|
377
|
+
galleryExtensions.set(extension.identifier.id.toLowerCase(), extension);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
return galleryExtensions;
|
|
381
|
+
}
|
|
382
|
+
validateExtensionKind(_manifest) {
|
|
383
|
+
return true;
|
|
384
|
+
}
|
|
385
|
+
async validateVSIX(manifest, force, profileLocation, installedExtensions) {
|
|
386
|
+
if (!force) {
|
|
387
|
+
const extensionIdentifier = { id: getGalleryExtensionId(manifest.publisher, manifest.name) };
|
|
388
|
+
const newer = installedExtensions.find(local => areSameExtensions(extensionIdentifier, local.identifier) && gt(local.manifest.version, manifest.version));
|
|
389
|
+
if (newer) {
|
|
390
|
+
this.logger.info(( localizeWithPath(
|
|
391
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
392
|
+
'forceDowngrade',
|
|
393
|
+
"A newer version of extension '{0}' v{1} is already installed. Use '--force' option to downgrade to older version.",
|
|
394
|
+
newer.identifier.id,
|
|
395
|
+
newer.manifest.version,
|
|
396
|
+
manifest.version
|
|
397
|
+
)));
|
|
398
|
+
return false;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return this.validateExtensionKind(manifest);
|
|
402
|
+
}
|
|
403
|
+
async uninstallExtensions(extensions, force, profileLocation) {
|
|
404
|
+
const getId = async (extensionDescription) => {
|
|
405
|
+
if (extensionDescription instanceof URI) {
|
|
406
|
+
const manifest = await this.extensionManagementService.getManifest(extensionDescription);
|
|
407
|
+
return getExtensionId(manifest.publisher, manifest.name);
|
|
408
|
+
}
|
|
409
|
+
return extensionDescription;
|
|
410
|
+
};
|
|
411
|
+
for (const extension of extensions) {
|
|
412
|
+
const id = await getId(extension);
|
|
413
|
+
const installed = await this.extensionManagementService.getInstalled(undefined, profileLocation);
|
|
414
|
+
const extensionsToUninstall = installed.filter(e => areSameExtensions(e.identifier, { id }));
|
|
415
|
+
if (!extensionsToUninstall.length) {
|
|
416
|
+
throw new Error(`${this.notInstalled(id)}\n${useId}`);
|
|
417
|
+
}
|
|
418
|
+
if (( extensionsToUninstall.some(e => e.type === 0 ))) {
|
|
419
|
+
this.logger.info(( localizeWithPath(
|
|
420
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
421
|
+
'builtin',
|
|
422
|
+
"Extension '{0}' is a Built-in extension and cannot be uninstalled",
|
|
423
|
+
id
|
|
424
|
+
)));
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
if (!force && ( extensionsToUninstall.some(e => e.isBuiltin))) {
|
|
428
|
+
this.logger.info(( localizeWithPath(
|
|
429
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
430
|
+
'forceUninstall',
|
|
431
|
+
"Extension '{0}' is marked as a Built-in extension by user. Please use '--force' option to uninstall it.",
|
|
432
|
+
id
|
|
433
|
+
)));
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
this.logger.info(( localizeWithPath(
|
|
437
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
438
|
+
'uninstalling',
|
|
439
|
+
"Uninstalling {0}...",
|
|
440
|
+
id
|
|
441
|
+
)));
|
|
442
|
+
for (const extensionToUninstall of extensionsToUninstall) {
|
|
443
|
+
await this.extensionManagementService.uninstall(extensionToUninstall, { profileLocation });
|
|
444
|
+
}
|
|
445
|
+
if (this.location) {
|
|
446
|
+
this.logger.info(( localizeWithPath(
|
|
447
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
448
|
+
'successUninstallFromLocation',
|
|
449
|
+
"Extension '{0}' was successfully uninstalled from {1}!",
|
|
450
|
+
id,
|
|
451
|
+
this.location
|
|
452
|
+
)));
|
|
453
|
+
}
|
|
454
|
+
else {
|
|
455
|
+
this.logger.info(( localizeWithPath(
|
|
456
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
457
|
+
'successUninstall',
|
|
458
|
+
"Extension '{0}' was successfully uninstalled!",
|
|
459
|
+
id
|
|
460
|
+
)));
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
async locateExtension(extensions) {
|
|
465
|
+
const installed = await this.extensionManagementService.getInstalled();
|
|
466
|
+
extensions.forEach(e => {
|
|
467
|
+
installed.forEach(i => {
|
|
468
|
+
if (i.identifier.id === e) {
|
|
469
|
+
if (i.location.scheme === Schemas.file) {
|
|
470
|
+
this.logger.info(i.location.fsPath);
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
notInstalled(id) {
|
|
478
|
+
return this.location ? ( localizeWithPath(
|
|
479
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
480
|
+
'notInstalleddOnLocation',
|
|
481
|
+
"Extension '{0}' is not installed on {1}.",
|
|
482
|
+
id,
|
|
483
|
+
this.location
|
|
484
|
+
)) : ( localizeWithPath(
|
|
485
|
+
'vs/platform/extensionManagement/common/extensionManagementCLI',
|
|
486
|
+
'notInstalled',
|
|
487
|
+
"Extension '{0}' is not installed.",
|
|
488
|
+
id
|
|
489
|
+
));
|
|
490
|
+
}
|
|
491
|
+
};
|
|
492
|
+
ExtensionManagementCLI = ( __decorate([
|
|
493
|
+
( __param(1, IExtensionManagementService)),
|
|
494
|
+
( __param(2, IExtensionGalleryService))
|
|
495
|
+
], ExtensionManagementCLI));
|
|
496
|
+
|
|
497
|
+
export { ExtensionManagementCLI };
|