@codingame/monaco-vscode-extensions-service-override 8.0.3 → 9.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/assets/{webWorkerExtensionHostIframe.html → webWorkerExtensionHostIframe.esm.html} +51 -15
- package/extensions.js +15 -41
- package/package.json +3 -3
- package/vscode/src/vs/platform/extensionManagement/common/extensionManagementCLI.js +28 -28
- package/vscode/src/vs/workbench/api/browser/mainThreadAuthentication.js +42 -10
- package/vscode/src/vs/workbench/api/browser/mainThreadCLICommands.js +1 -1
- package/vscode/src/vs/workbench/api/browser/mainThreadChatAgents2.js +17 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadComments.js +5 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadCustomEditors.js +2 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadEditSessionIdentityParticipant.js +1 -1
- package/vscode/src/vs/workbench/api/browser/mainThreadExtensionService.js +11 -11
- package/vscode/src/vs/workbench/api/browser/mainThreadFileSystemEventService.js +20 -20
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures.js +1 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageModelTools.js +19 -5
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageModels.js +1 -1
- package/vscode/src/vs/workbench/api/browser/mainThreadMessageService.js +4 -4
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookDocuments.js +19 -8
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookEditors.js +1 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookSaveParticipant.js +1 -1
- package/vscode/src/vs/workbench/api/browser/mainThreadProgress.js +1 -1
- package/vscode/src/vs/workbench/api/browser/mainThreadQuickOpen.js +23 -16
- package/vscode/src/vs/workbench/api/browser/mainThreadSCM.js +3 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadSaveParticipant.js +1 -1
- package/vscode/src/vs/workbench/api/browser/mainThreadTask.js +1 -1
- package/vscode/src/vs/workbench/api/browser/mainThreadTerminalShellIntegration.js +1 -1
- package/vscode/src/vs/workbench/api/browser/mainThreadTesting.js +10 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadTunnelService.js +2 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadUriOpeners.js +2 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadWebviews.js +1 -1
- package/vscode/src/vs/workbench/api/browser/mainThreadWorkspace.js +8 -7
- package/vscode/src/vs/workbench/services/extensionManagement/browser/extensionBisect.js +23 -23
- package/vscode/src/vs/workbench/services/extensions/browser/extensionService.js +1 -1
- package/vscode/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.js +9 -6
- package/vscode/src/vs/workbench/services/extensions/common/abstractExtensionService.js +42 -28
- package/vscode/src/vs/workbench/services/extensions/common/extensionHostManager.js +6 -7
- package/vscode/src/vs/workbench/services/extensions/common/extensionsProposedApi.js +1 -1
- package/vscode/src/vs/workbench/services/extensions/common/extensionsUtil.js +4 -4
- package/vscode/src/vs/workbench/services/extensions/common/lazyCreateExtensionHostManager.js +3 -0
- package/vscode/src/vs/workbench/services/extensions/common/remoteExtensionHost.js +11 -5
|
@@ -4,21 +4,19 @@
|
|
|
4
4
|
<meta http-equiv="Content-Security-Policy" content="
|
|
5
5
|
default-src 'none';
|
|
6
6
|
child-src 'self' data: blob:;
|
|
7
|
-
script-src 'self' 'unsafe-eval' 'sha256-
|
|
7
|
+
script-src 'self' 'unsafe-eval' 'sha256-8MVeUdk5qF4PxUj/3OPSsosE9rIR9mo+m5ulCU+h+VI=' https: http://localhost:* blob:;
|
|
8
8
|
connect-src 'self' https: wss: http://localhost:* http://127.0.0.1:* ws://localhost:* ws://127.0.0.1:*;"/>
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<script>
|
|
12
|
-
(function() {
|
|
12
|
+
(function () {
|
|
13
13
|
const searchParams = new URL(document.location.href).searchParams;
|
|
14
14
|
const vscodeWebWorkerExtHostId = searchParams.get('vscodeWebWorkerExtHostId') || '';
|
|
15
|
-
const name = searchParams.get('debugged') ? '
|
|
15
|
+
const name = searchParams.get('debugged') ? 'DebugExtensionHostWorker' : 'ExtensionHostWorker';
|
|
16
16
|
const parentOrigin = searchParams.get('parentOrigin') || window.origin;
|
|
17
17
|
const salt = searchParams.get('salt');
|
|
18
|
-
const vscodeExtHostWorkerSrc = searchParams.get('vscodeExtHostWorkerSrc');
|
|
19
|
-
const vscodeExtHostWorkerOptions = JSON.parse(searchParams.get('vscodeExtHostWorkerOptions') ?? '{}');
|
|
20
18
|
|
|
21
|
-
(async function() {
|
|
19
|
+
(async function () {
|
|
22
20
|
const hostnameValidationMarker = 'v--';
|
|
23
21
|
const hostname = location.hostname;
|
|
24
22
|
if (!hostname.startsWith(hostnameValidationMarker)) {
|
|
@@ -30,8 +28,9 @@
|
|
|
30
28
|
return sendError(new Error(`Cannot validate in current context!`));
|
|
31
29
|
}
|
|
32
30
|
|
|
33
|
-
// Here the `parentOriginHash()` function from `src/vs/
|
|
31
|
+
// Here the `parentOriginHash()` function from `src/vs/base/browser/iframe.ts` is inlined
|
|
34
32
|
// compute a sha-256 composed of `parentOrigin` and `salt` converted to base 32
|
|
33
|
+
/** @type {string} */
|
|
35
34
|
let parentOriginHash;
|
|
36
35
|
try {
|
|
37
36
|
const strData = JSON.stringify({ parentOrigin, salt });
|
|
@@ -42,7 +41,7 @@
|
|
|
42
41
|
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
|
43
42
|
// sha256 has 256 bits, so we need at most ceil(lg(2^256-1)/lg(32)) = 52 chars to represent it in base 32
|
|
44
43
|
parentOriginHash = BigInt(`0x${hashHex}`).toString(32).padStart(52, '0');
|
|
45
|
-
} catch(err) {
|
|
44
|
+
} catch (err) {
|
|
46
45
|
return sendError(err instanceof Error ? err : new Error(String(err)));
|
|
47
46
|
}
|
|
48
47
|
|
|
@@ -67,13 +66,50 @@
|
|
|
67
66
|
}
|
|
68
67
|
|
|
69
68
|
function start() {
|
|
69
|
+
|
|
70
|
+
// Before we can load the worker, we need to get the current set of NLS
|
|
71
|
+
// configuration into this iframe. We ask the parent window to send it
|
|
72
|
+
// together with the necessary information to load the worker via Blob.
|
|
73
|
+
|
|
74
|
+
const bootstrapNlsType = 'vscode.bootstrap.nls';
|
|
75
|
+
|
|
76
|
+
self.onmessage = (event) => {
|
|
77
|
+
if (event.origin !== parentOrigin || event.data.type !== bootstrapNlsType) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const { data } = event.data;
|
|
81
|
+
createWorker(data.baseUrl, data.workerUrl, data.fileRoot, data.nls.messages, data.nls.language);
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
window.parent.postMessage({
|
|
85
|
+
vscodeWebWorkerExtHostId,
|
|
86
|
+
type: bootstrapNlsType
|
|
87
|
+
}, '*');
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function createWorker(baseUrl, workerUrl, fileRoot, nlsMessages, nlsLanguage) {
|
|
70
91
|
try {
|
|
71
|
-
|
|
72
|
-
if(globalThis.crossOriginIsolated) {
|
|
92
|
+
if (globalThis.crossOriginIsolated) {
|
|
73
93
|
workerUrl += '?vscode-coi=2'; // COEP
|
|
74
94
|
}
|
|
75
95
|
|
|
76
|
-
const
|
|
96
|
+
const isESM = true;
|
|
97
|
+
|
|
98
|
+
const blob = new Blob([[
|
|
99
|
+
`/*extensionHostWorker*/`,
|
|
100
|
+
`globalThis.MonacoEnvironment = { baseUrl: '${baseUrl}' };`,
|
|
101
|
+
`globalThis._VSCODE_NLS_MESSAGES = ${JSON.stringify(nlsMessages)};`,
|
|
102
|
+
`globalThis._VSCODE_NLS_LANGUAGE = ${JSON.stringify(nlsLanguage)};`,
|
|
103
|
+
`globalThis._VSCODE_FILE_ROOT = '${fileRoot}';`,
|
|
104
|
+
isESM ? `await import('${workerUrl}');` : `importScripts('${workerUrl}');`,
|
|
105
|
+
`/*extensionHostWorker*/`
|
|
106
|
+
].join('')], { type: 'application/javascript' });
|
|
107
|
+
|
|
108
|
+
const worker = new Worker(URL.createObjectURL(blob), { name, type: isESM ? 'module' : undefined });
|
|
109
|
+
if (!isESM) {
|
|
110
|
+
// Note: cannot postMessage into a worker that is ESM because imports are async
|
|
111
|
+
worker.postMessage('vs/workbench/api/worker/extensionHostWorker');
|
|
112
|
+
}
|
|
77
113
|
const nestedWorkers = new Map();
|
|
78
114
|
|
|
79
115
|
worker.onmessage = (event) => {
|
|
@@ -83,12 +119,12 @@
|
|
|
83
119
|
const { id, port, url, options } = data;
|
|
84
120
|
const newWorker = new Worker(url, options);
|
|
85
121
|
newWorker.postMessage(port, [port]);
|
|
86
|
-
|
|
122
|
+
newWorker.onerror = console.error.bind(console);
|
|
87
123
|
nestedWorkers.set(id, newWorker);
|
|
88
124
|
|
|
89
125
|
} else if (data?.type === '_terminateWorker') {
|
|
90
126
|
const { id } = data;
|
|
91
|
-
if(nestedWorkers.has(id)) {
|
|
127
|
+
if (nestedWorkers.has(id)) {
|
|
92
128
|
nestedWorkers.get(id).terminate();
|
|
93
129
|
nestedWorkers.delete(id);
|
|
94
130
|
}
|
|
@@ -111,8 +147,8 @@
|
|
|
111
147
|
return;
|
|
112
148
|
}
|
|
113
149
|
worker.postMessage(event.data, event.ports);
|
|
114
|
-
}
|
|
115
|
-
} catch(err) {
|
|
150
|
+
};
|
|
151
|
+
} catch (err) {
|
|
116
152
|
console.error(err);
|
|
117
153
|
sendError(err);
|
|
118
154
|
}
|
package/extensions.js
CHANGED
|
@@ -2,7 +2,7 @@ import { __decorate, __param } from 'vscode/external/tslib/tslib.es6.js';
|
|
|
2
2
|
import { IFileService } from 'vscode/vscode/vs/platform/files/common/files.service';
|
|
3
3
|
import { ILifecycleService } from 'vscode/vscode/vs/workbench/services/lifecycle/common/lifecycle.service';
|
|
4
4
|
import { IExtensionService } from 'vscode/vscode/vs/workbench/services/extensions/common/extensions.service';
|
|
5
|
-
import { ILogService
|
|
5
|
+
import { ILogService } from 'vscode/vscode/vs/platform/log/common/log.service';
|
|
6
6
|
import { IWorkspaceContextService } from 'vscode/vscode/vs/platform/workspace/common/workspace.service';
|
|
7
7
|
import { IInstantiationService } from 'vscode/vscode/vs/platform/instantiation/common/instantiation';
|
|
8
8
|
import { INotificationService } from 'vscode/vscode/vs/platform/notification/common/notification.service';
|
|
@@ -24,10 +24,6 @@ import { ExtensionsProposedApi } from './vscode/src/vs/workbench/services/extens
|
|
|
24
24
|
import { BrowserExtensionHostFactory, BrowserExtensionHostKindPicker, ExtensionService } from './vscode/src/vs/workbench/services/extensions/browser/extensionService.js';
|
|
25
25
|
export { ExtensionHostKind } from 'vscode/vscode/vs/workbench/services/extensions/common/extensionHostKind';
|
|
26
26
|
import { WebWorkerExtensionHost } from './vscode/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.js';
|
|
27
|
-
import { IUserDataProfilesService } from 'vscode/vscode/vs/platform/userDataProfile/common/userDataProfile.service';
|
|
28
|
-
import { ILayoutService } from 'vscode/vscode/vs/platform/layout/browser/layoutService.service';
|
|
29
|
-
import { IStorageService } from 'vscode/vscode/vs/platform/storage/common/storage.service';
|
|
30
|
-
import { ILabelService } from 'vscode/vscode/vs/platform/label/common/label.service';
|
|
31
27
|
import { IUserDataProfileService } from 'vscode/vscode/vs/workbench/services/userDataProfile/common/userDataProfile.service';
|
|
32
28
|
import { IWorkspaceTrustManagementService } from 'vscode/vscode/vs/platform/workspace/common/workspaceTrust.service';
|
|
33
29
|
import { IRemoteExplorerService } from 'vscode/vscode/vs/workbench/services/remote/common/remoteExplorerService.service';
|
|
@@ -122,41 +118,14 @@ import './vscode/src/vs/workbench/api/browser/mainThreadProfileContentHandlers.j
|
|
|
122
118
|
import './vscode/src/vs/workbench/api/browser/mainThreadAiRelatedInformation.js';
|
|
123
119
|
import './vscode/src/vs/workbench/api/browser/mainThreadAiEmbeddingVector.js';
|
|
124
120
|
|
|
125
|
-
let EsmWebWorkerExtensionHost = class EsmWebWorkerExtensionHost extends WebWorkerExtensionHost {
|
|
126
|
-
constructor(workerConfig, runningLocation, startup, _initDataProvider, _telemetryService, _contextService, _labelService, _logService, _loggerService, _environmentService, _userDataProfilesService, _productService, _layoutService, _storageService) {
|
|
127
|
-
super(runningLocation, startup, _initDataProvider, _telemetryService, _contextService, _labelService, _logService, _loggerService, _environmentService, _userDataProfilesService, _productService, _layoutService, _storageService);
|
|
128
|
-
this.workerConfig = workerConfig;
|
|
129
|
-
}
|
|
130
|
-
async _getWebWorkerExtensionHostIframeSrc() {
|
|
131
|
-
const url = new URL(await super._getWebWorkerExtensionHostIframeSrc(), window.location.href);
|
|
132
|
-
url.searchParams.set('vscodeExtHostWorkerSrc', this.workerConfig.url);
|
|
133
|
-
if (this.workerConfig.options != null) {
|
|
134
|
-
url.searchParams.set('vscodeExtHostWorkerOptions', JSON.stringify(this.workerConfig.options));
|
|
135
|
-
}
|
|
136
|
-
url.searchParams.set('parentOrigin', window.origin);
|
|
137
|
-
return ( url.toString());
|
|
138
|
-
}
|
|
139
|
-
};
|
|
140
|
-
EsmWebWorkerExtensionHost = __decorate([
|
|
141
|
-
( __param(4, ITelemetryService)),
|
|
142
|
-
( __param(5, IWorkspaceContextService)),
|
|
143
|
-
( __param(6, ILabelService)),
|
|
144
|
-
( __param(7, ILogService)),
|
|
145
|
-
( __param(8, ILoggerService)),
|
|
146
|
-
( __param(9, IBrowserWorkbenchEnvironmentService)),
|
|
147
|
-
( __param(10, IUserDataProfilesService)),
|
|
148
|
-
( __param(11, IProductService)),
|
|
149
|
-
( __param(12, ILayoutService)),
|
|
150
|
-
( __param(13, IStorageService))
|
|
151
|
-
], EsmWebWorkerExtensionHost);
|
|
152
121
|
let localExtensionHost;
|
|
153
122
|
function setLocalExtensionHost(_localExtensionHost) {
|
|
154
123
|
localExtensionHost = _localExtensionHost;
|
|
155
124
|
}
|
|
156
125
|
let BrowserExtensionHostFactoryOverride = class BrowserExtensionHostFactoryOverride extends BrowserExtensionHostFactory {
|
|
157
|
-
constructor(
|
|
126
|
+
constructor(workerExtHostEnabled, _extensionsProposedApi, _scanWebExtensions, _getExtensionRegistrySnapshotWhenReady, _instantiationService, _remoteAgentService, _remoteAuthorityResolverService, _extensionEnablementService, _logService) {
|
|
158
127
|
super(_extensionsProposedApi, _scanWebExtensions, _getExtensionRegistrySnapshotWhenReady, _instantiationService, _remoteAgentService, _remoteAuthorityResolverService, _extensionEnablementService, _logService);
|
|
159
|
-
this.
|
|
128
|
+
this.workerExtHostEnabled = workerExtHostEnabled;
|
|
160
129
|
}
|
|
161
130
|
createExtensionHost(runningLocations, runningLocation, isInitialStart) {
|
|
162
131
|
switch (runningLocation.kind) {
|
|
@@ -167,11 +136,11 @@ let BrowserExtensionHostFactoryOverride = class BrowserExtensionHostFactoryOverr
|
|
|
167
136
|
return this._instantiationService.createInstance(localExtensionHost, runningLocation, 1 , this._createLocalExtensionHostDataProvider(runningLocations, runningLocation, isInitialStart));
|
|
168
137
|
}
|
|
169
138
|
case 2 : {
|
|
170
|
-
if (this.
|
|
139
|
+
if (!this.workerExtHostEnabled) {
|
|
171
140
|
return null;
|
|
172
141
|
}
|
|
173
142
|
const startup = ((isInitialStart ? 2 : 1) );
|
|
174
|
-
return this._instantiationService.createInstance(
|
|
143
|
+
return this._instantiationService.createInstance(WebWorkerExtensionHost, runningLocation, startup, this._createLocalExtensionHostDataProvider(runningLocations, runningLocation, isInitialStart));
|
|
175
144
|
}
|
|
176
145
|
case 3 : {
|
|
177
146
|
return super.createExtensionHost(runningLocations, runningLocation, isInitialStart);
|
|
@@ -207,10 +176,10 @@ LocalBrowserExtensionHostKindPicker = __decorate([
|
|
|
207
176
|
( __param(1, ILogService))
|
|
208
177
|
], LocalBrowserExtensionHostKindPicker);
|
|
209
178
|
let ExtensionServiceOverride = class ExtensionServiceOverride extends ExtensionService {
|
|
210
|
-
constructor(
|
|
179
|
+
constructor(workerExtHostEnabled, instantiationService, notificationService, browserEnvironmentService, telemetryService, extensionEnablementService, fileService, productService, extensionManagementService, contextService, configurationService, extensionManifestPropertiesService, webExtensionsScannerService, logService, remoteAgentService, remoteExtensionsScannerService, lifecycleService, remoteAuthorityResolverService, userDataInitializationService, userDataProfileService, workspaceTrustManagementService, remoteExplorerService, dialogService) {
|
|
211
180
|
const extensionsProposedApi = instantiationService.createInstance(ExtensionsProposedApi);
|
|
212
|
-
const extensionHostFactory = new BrowserExtensionHostFactoryOverride(
|
|
213
|
-
super(extensionsProposedApi, extensionHostFactory, new LocalBrowserExtensionHostKindPicker(
|
|
181
|
+
const extensionHostFactory = new BrowserExtensionHostFactoryOverride(workerExtHostEnabled, extensionsProposedApi, async () => await this._scanWebExtensions(), () => this._getExtensionRegistrySnapshotWhenReady(), instantiationService, remoteAgentService, remoteAuthorityResolverService, extensionEnablementService, logService);
|
|
182
|
+
super(extensionsProposedApi, extensionHostFactory, new LocalBrowserExtensionHostKindPicker(workerExtHostEnabled ? [2 , 1 , 3 ] : [1 , 3 ], logService), instantiationService, notificationService, browserEnvironmentService, telemetryService, extensionEnablementService, fileService, productService, extensionManagementService, contextService, configurationService, extensionManifestPropertiesService, webExtensionsScannerService, logService, remoteAgentService, remoteExtensionsScannerService, lifecycleService, remoteAuthorityResolverService, userDataInitializationService, userDataProfileService, workspaceTrustManagementService, remoteExplorerService, dialogService);
|
|
214
183
|
}
|
|
215
184
|
async deltaExtensions(toAdd, toRemove) {
|
|
216
185
|
await this._handleDeltaExtensions(new DeltaExtensionsQueueItem(toAdd, toRemove));
|
|
@@ -246,12 +215,12 @@ class ExtensionResourceLoaderServiceOverride extends ExtensionResourceLoaderServ
|
|
|
246
215
|
const result = await this._fileService.readFile(uri);
|
|
247
216
|
return ( result.value.toString());
|
|
248
217
|
}
|
|
249
|
-
return super.readExtensionResource(uri);
|
|
218
|
+
return await super.readExtensionResource(uri);
|
|
250
219
|
}
|
|
251
220
|
}
|
|
252
221
|
let iframeAlternateDomains;
|
|
253
222
|
registerAssets({
|
|
254
|
-
'vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html': () => changeUrlDomain(new URL('./assets/webWorkerExtensionHostIframe.html', import.meta.url).href, iframeAlternateDomains)
|
|
223
|
+
'vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.esm.html': () => changeUrlDomain(new URL('./assets/webWorkerExtensionHostIframe.esm.html', import.meta.url).href, iframeAlternateDomains)
|
|
255
224
|
});
|
|
256
225
|
function getServiceOverride(workerConfig, _iframeAlternateDomains) {
|
|
257
226
|
if (_iframeAlternateDomains != null) {
|
|
@@ -263,6 +232,11 @@ function getServiceOverride(workerConfig, _iframeAlternateDomains) {
|
|
|
263
232
|
url: changeUrlDomain(workerConfig.url, iframeAlternateDomains)
|
|
264
233
|
}
|
|
265
234
|
: undefined;
|
|
235
|
+
if (workerConfig != null) {
|
|
236
|
+
registerAssets({
|
|
237
|
+
'vs/workbench/api/worker/extensionHostWorker.esm.js': () => workerConfig.url
|
|
238
|
+
});
|
|
239
|
+
}
|
|
266
240
|
return {
|
|
267
241
|
[( IExtensionService.toString())]: new SyncDescriptor(ExtensionServiceOverride, [_workerConfig], false),
|
|
268
242
|
[( IExtensionManifestPropertiesService.toString())]: new SyncDescriptor(ExtensionManifestPropertiesService, [], true),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codingame/monaco-vscode-extensions-service-override",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "9.0.0",
|
|
4
4
|
"keywords": [],
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "CodinGame",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
}
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"vscode": "npm:@codingame/monaco-vscode-api@
|
|
30
|
-
"@codingame/monaco-vscode-files-service-override": "
|
|
29
|
+
"vscode": "npm:@codingame/monaco-vscode-api@9.0.0",
|
|
30
|
+
"@codingame/monaco-vscode-files-service-override": "9.0.0"
|
|
31
31
|
}
|
|
32
32
|
}
|
|
@@ -11,9 +11,9 @@ import { IExtensionManagementService, IExtensionGalleryService } from 'vscode/vs
|
|
|
11
11
|
import { getIdAndVersion, areSameExtensions, getGalleryExtensionId, getExtensionId } from 'vscode/vscode/vs/platform/extensionManagement/common/extensionManagementUtil';
|
|
12
12
|
import { ExtensionType, EXTENSION_CATEGORIES } from 'vscode/vscode/vs/platform/extensions/common/extensions';
|
|
13
13
|
|
|
14
|
-
const notFound = (id) => ( localize(
|
|
14
|
+
const notFound = (id) => ( localize(9844, "Extension '{0}' not found.", id));
|
|
15
15
|
const useId = ( localize(
|
|
16
|
-
|
|
16
|
+
9845,
|
|
17
17
|
"Make sure you use the full extension ID, including the publisher, e.g.: {0}",
|
|
18
18
|
'ms-dotnettools.csharp'
|
|
19
19
|
));
|
|
@@ -50,7 +50,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
|
|
|
50
50
|
return;
|
|
51
51
|
}
|
|
52
52
|
if (this.location) {
|
|
53
|
-
this.logger.info(( localize(
|
|
53
|
+
this.logger.info(( localize(9846, "Extensions installed on {0}:", this.location)));
|
|
54
54
|
}
|
|
55
55
|
extensions = extensions.sort((e1, e2) => e1.identifier.id.localeCompare(e2.identifier.id));
|
|
56
56
|
let lastId = undefined;
|
|
@@ -65,7 +65,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
|
|
|
65
65
|
const failed = [];
|
|
66
66
|
try {
|
|
67
67
|
if (extensions.length) {
|
|
68
|
-
this.logger.info(this.location ? ( localize(
|
|
68
|
+
this.logger.info(this.location ? ( localize(9847, "Installing extensions on {0}...", this.location)) : ( localize(9848, "Installing extensions...")));
|
|
69
69
|
}
|
|
70
70
|
const installVSIXInfos = [];
|
|
71
71
|
const installExtensionInfos = [];
|
|
@@ -108,11 +108,11 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
|
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
110
|
catch (error) {
|
|
111
|
-
this.logger.error(( localize(
|
|
111
|
+
this.logger.error(( localize(9849, "Error while installing extensions: {0}", getErrorMessage(error))));
|
|
112
112
|
throw error;
|
|
113
113
|
}
|
|
114
114
|
if (failed.length) {
|
|
115
|
-
throw ( (new Error(localize(
|
|
115
|
+
throw ( (new Error(localize(9850, "Failed Installing Extensions: {0}", failed.join(', ')))));
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
118
|
async updateExtensions(profileLocation) {
|
|
@@ -124,7 +124,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
|
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
126
|
this.logger.trace(( localize(
|
|
127
|
-
|
|
127
|
+
9851,
|
|
128
128
|
"Fetching latest versions for {0} extensions",
|
|
129
129
|
installedExtensionsQuery.length
|
|
130
130
|
)));
|
|
@@ -141,11 +141,11 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
|
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
143
|
if (!extensionsToUpdate.length) {
|
|
144
|
-
this.logger.info(( localize(
|
|
144
|
+
this.logger.info(( localize(9852, "No extension to update")));
|
|
145
145
|
return;
|
|
146
146
|
}
|
|
147
147
|
this.logger.info(( localize(
|
|
148
|
-
|
|
148
|
+
9853,
|
|
149
149
|
"Updating extensions: {0}",
|
|
150
150
|
( (extensionsToUpdate.map(ext => ext.extension.identifier.id))).join(', ')
|
|
151
151
|
)));
|
|
@@ -153,7 +153,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
|
|
|
153
153
|
for (const extensionResult of installationResult) {
|
|
154
154
|
if (extensionResult.error) {
|
|
155
155
|
this.logger.error(( localize(
|
|
156
|
-
|
|
156
|
+
9854,
|
|
157
157
|
"Error while updating extension {0}: {1}",
|
|
158
158
|
extensionResult.identifier.id,
|
|
159
159
|
getErrorMessage(extensionResult.error)
|
|
@@ -161,7 +161,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
|
|
|
161
161
|
}
|
|
162
162
|
else {
|
|
163
163
|
this.logger.info(( localize(
|
|
164
|
-
|
|
164
|
+
9855,
|
|
165
165
|
"Extension '{0}' v{1} was successfully updated.",
|
|
166
166
|
extensionResult.identifier.id,
|
|
167
167
|
extensionResult.local?.manifest.version
|
|
@@ -175,7 +175,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
|
|
|
175
175
|
if (installedExtension) {
|
|
176
176
|
if (!force && (!version || (version === 'prerelease' && installedExtension.preRelease))) {
|
|
177
177
|
this.logger.info(( localize(
|
|
178
|
-
|
|
178
|
+
9856,
|
|
179
179
|
"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'.",
|
|
180
180
|
id,
|
|
181
181
|
installedExtension.manifest.version,
|
|
@@ -184,7 +184,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
|
|
|
184
184
|
return false;
|
|
185
185
|
}
|
|
186
186
|
if (version && installedExtension.manifest.version === version) {
|
|
187
|
-
this.logger.info(( localize(
|
|
187
|
+
this.logger.info(( localize(9857, "Extension '{0}' is already installed.", `${id}@${version}`)));
|
|
188
188
|
return false;
|
|
189
189
|
}
|
|
190
190
|
}
|
|
@@ -218,24 +218,24 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
|
|
|
218
218
|
if (installedExtension) {
|
|
219
219
|
if (gallery.version === installedExtension.manifest.version) {
|
|
220
220
|
this.logger.info(( localize(
|
|
221
|
-
|
|
221
|
+
9857,
|
|
222
222
|
"Extension '{0}' is already installed.",
|
|
223
223
|
version ? `${id}@${version}` : id
|
|
224
224
|
)));
|
|
225
225
|
return;
|
|
226
226
|
}
|
|
227
227
|
this.logger.info(( localize(
|
|
228
|
-
|
|
228
|
+
9858,
|
|
229
229
|
"Updating the extension '{0}' to the version {1}",
|
|
230
230
|
id,
|
|
231
231
|
gallery.version
|
|
232
232
|
)));
|
|
233
233
|
}
|
|
234
234
|
if (installOptions.isBuiltin) {
|
|
235
|
-
this.logger.info(version ? ( localize(
|
|
235
|
+
this.logger.info(version ? ( localize(9859, "Installing builtin extension '{0}' v{1}...", id, version)) : ( localize(9860, "Installing builtin extension '{0}'...", id)));
|
|
236
236
|
}
|
|
237
237
|
else {
|
|
238
|
-
this.logger.info(version ? ( localize(
|
|
238
|
+
this.logger.info(version ? ( localize(9861, "Installing extension '{0}' v{1}...", id, version)) : ( localize(9862, "Installing extension '{0}'...", id)));
|
|
239
239
|
}
|
|
240
240
|
extensionsToInstall.push({
|
|
241
241
|
extension: gallery,
|
|
@@ -247,7 +247,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
|
|
|
247
247
|
for (const extensionResult of installationResult) {
|
|
248
248
|
if (extensionResult.error) {
|
|
249
249
|
this.logger.error(( localize(
|
|
250
|
-
|
|
250
|
+
9863,
|
|
251
251
|
"Error while installing extension {0}: {1}",
|
|
252
252
|
extensionResult.identifier.id,
|
|
253
253
|
getErrorMessage(extensionResult.error)
|
|
@@ -256,7 +256,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
|
|
|
256
256
|
}
|
|
257
257
|
else {
|
|
258
258
|
this.logger.info(( localize(
|
|
259
|
-
|
|
259
|
+
9864,
|
|
260
260
|
"Extension '{0}' v{1} was successfully installed.",
|
|
261
261
|
extensionResult.identifier.id,
|
|
262
262
|
extensionResult.local?.manifest.version
|
|
@@ -275,11 +275,11 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
|
|
|
275
275
|
if (valid) {
|
|
276
276
|
try {
|
|
277
277
|
await this.extensionManagementService.install(vsix, { ...installOptions, installGivenVersion: true });
|
|
278
|
-
this.logger.info(( localize(
|
|
278
|
+
this.logger.info(( localize(9865, "Extension '{0}' was successfully installed.", basename(vsix))));
|
|
279
279
|
}
|
|
280
280
|
catch (error) {
|
|
281
281
|
if (isCancellationError(error)) {
|
|
282
|
-
this.logger.info(( localize(
|
|
282
|
+
this.logger.info(( localize(9866, "Cancelled installing extension '{0}'.", basename(vsix))));
|
|
283
283
|
}
|
|
284
284
|
else {
|
|
285
285
|
throw error;
|
|
@@ -314,7 +314,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
|
|
|
314
314
|
const newer = installedExtensions.find(local => areSameExtensions(extensionIdentifier, local.identifier) && semverExports.gt(local.manifest.version, manifest.version));
|
|
315
315
|
if (newer) {
|
|
316
316
|
this.logger.info(( localize(
|
|
317
|
-
|
|
317
|
+
9867,
|
|
318
318
|
"A newer version of extension '{0}' v{1} is already installed. Use '--force' option to downgrade to older version.",
|
|
319
319
|
newer.identifier.id,
|
|
320
320
|
newer.manifest.version,
|
|
@@ -342,7 +342,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
|
|
|
342
342
|
}
|
|
343
343
|
if (( (extensionsToUninstall.some(e => e.type === ExtensionType.System)))) {
|
|
344
344
|
this.logger.info(( localize(
|
|
345
|
-
|
|
345
|
+
9868,
|
|
346
346
|
"Extension '{0}' is a Built-in extension and cannot be uninstalled",
|
|
347
347
|
id
|
|
348
348
|
)));
|
|
@@ -350,26 +350,26 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
|
|
|
350
350
|
}
|
|
351
351
|
if (!force && ( (extensionsToUninstall.some(e => e.isBuiltin)))) {
|
|
352
352
|
this.logger.info(( localize(
|
|
353
|
-
|
|
353
|
+
9869,
|
|
354
354
|
"Extension '{0}' is marked as a Built-in extension by user. Please use '--force' option to uninstall it.",
|
|
355
355
|
id
|
|
356
356
|
)));
|
|
357
357
|
return;
|
|
358
358
|
}
|
|
359
|
-
this.logger.info(( localize(
|
|
359
|
+
this.logger.info(( localize(9870, "Uninstalling {0}...", id)));
|
|
360
360
|
for (const extensionToUninstall of extensionsToUninstall) {
|
|
361
361
|
await this.extensionManagementService.uninstall(extensionToUninstall, { profileLocation });
|
|
362
362
|
}
|
|
363
363
|
if (this.location) {
|
|
364
364
|
this.logger.info(( localize(
|
|
365
|
-
|
|
365
|
+
9871,
|
|
366
366
|
"Extension '{0}' was successfully uninstalled from {1}!",
|
|
367
367
|
id,
|
|
368
368
|
this.location
|
|
369
369
|
)));
|
|
370
370
|
}
|
|
371
371
|
else {
|
|
372
|
-
this.logger.info(( localize(
|
|
372
|
+
this.logger.info(( localize(9872, "Extension '{0}' was successfully uninstalled!", id)));
|
|
373
373
|
}
|
|
374
374
|
}
|
|
375
375
|
}
|
|
@@ -387,7 +387,7 @@ let ExtensionManagementCLI = class ExtensionManagementCLI {
|
|
|
387
387
|
});
|
|
388
388
|
}
|
|
389
389
|
notInstalled(id) {
|
|
390
|
-
return this.location ? ( localize(
|
|
390
|
+
return this.location ? ( localize(9873, "Extension '{0}' is not installed on {1}.", id, this.location)) : ( localize(9874, "Extension '{0}' is not installed.", id));
|
|
391
391
|
}
|
|
392
392
|
};
|
|
393
393
|
ExtensionManagementCLI = ( (__decorate([
|
|
@@ -17,6 +17,7 @@ import { IAuthenticationUsageService } from 'vscode/vscode/vs/workbench/services
|
|
|
17
17
|
import { getAuthenticationProviderActivationEvent } from 'vscode/vscode/vs/workbench/services/authentication/browser/authenticationService';
|
|
18
18
|
import { URI } from 'vscode/vscode/vs/base/common/uri';
|
|
19
19
|
import { IOpenerService } from 'vscode/vscode/vs/platform/opener/common/opener.service';
|
|
20
|
+
import { CancellationError } from 'vscode/vscode/vs/base/common/errors';
|
|
20
21
|
|
|
21
22
|
class MainThreadAuthenticationProvider extends Disposable {
|
|
22
23
|
constructor(_proxy, id, label, supportsMultipleAccounts, notificationService, onDidChangeSessionsEmitter) {
|
|
@@ -36,7 +37,7 @@ class MainThreadAuthenticationProvider extends Disposable {
|
|
|
36
37
|
}
|
|
37
38
|
async removeSession(sessionId) {
|
|
38
39
|
await this._proxy.$removeSession(this.id, sessionId);
|
|
39
|
-
this.notificationService.info(( localize(
|
|
40
|
+
this.notificationService.info(( localize(4946, "Successfully signed out.")));
|
|
40
41
|
}
|
|
41
42
|
}
|
|
42
43
|
let MainThreadAuthentication = class MainThreadAuthentication extends Disposable {
|
|
@@ -92,7 +93,7 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
92
93
|
let message;
|
|
93
94
|
if (provider.id.startsWith(INTERNAL_AUTH_PROVIDER_PREFIX)) {
|
|
94
95
|
message = ( localize(
|
|
95
|
-
|
|
96
|
+
4947,
|
|
96
97
|
"The extension '{0}' wants to access the language models provided by {1}.",
|
|
97
98
|
extensionName,
|
|
98
99
|
provider.label
|
|
@@ -101,13 +102,13 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
101
102
|
else {
|
|
102
103
|
message = recreatingSession
|
|
103
104
|
? ( localize(
|
|
104
|
-
|
|
105
|
+
4948,
|
|
105
106
|
"The extension '{0}' wants you to sign in again using {1}.",
|
|
106
107
|
extensionName,
|
|
107
108
|
provider.label
|
|
108
109
|
))
|
|
109
110
|
: ( localize(
|
|
110
|
-
|
|
111
|
+
4949,
|
|
111
112
|
"The extension '{0}' wants to sign in using {1}.",
|
|
112
113
|
extensionName,
|
|
113
114
|
provider.label
|
|
@@ -115,7 +116,7 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
115
116
|
}
|
|
116
117
|
const buttons = [
|
|
117
118
|
{
|
|
118
|
-
label: ( localize(
|
|
119
|
+
label: ( localize(4950, "&&Allow")),
|
|
119
120
|
run() {
|
|
120
121
|
return true;
|
|
121
122
|
},
|
|
@@ -123,7 +124,7 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
123
124
|
];
|
|
124
125
|
if (options?.learnMore) {
|
|
125
126
|
buttons.push({
|
|
126
|
-
label: ( localize(
|
|
127
|
+
label: ( localize(4951, "Learn more")),
|
|
127
128
|
run: async () => {
|
|
128
129
|
const result = this.loginPrompt(provider, extensionName, recreatingSession, options);
|
|
129
130
|
await this.openerService.open(URI.revive(options.learnMore), { allowCommands: true });
|
|
@@ -140,6 +141,33 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
140
141
|
});
|
|
141
142
|
return result ?? false;
|
|
142
143
|
}
|
|
144
|
+
async continueWithIncorrectAccountPrompt(chosenAccountLabel, requestedAccountLabel) {
|
|
145
|
+
const result = await this.dialogService.prompt({
|
|
146
|
+
message: ( localize(4952, "Incorrect account detected")),
|
|
147
|
+
detail: ( localize(
|
|
148
|
+
4953,
|
|
149
|
+
"The chosen account, {0}, does not match the requested account, {1}.",
|
|
150
|
+
chosenAccountLabel,
|
|
151
|
+
requestedAccountLabel
|
|
152
|
+
)),
|
|
153
|
+
type: Severity$1.Warning,
|
|
154
|
+
cancelButton: true,
|
|
155
|
+
buttons: [
|
|
156
|
+
{
|
|
157
|
+
label: ( localize(4954, 'Keep {0}', chosenAccountLabel)),
|
|
158
|
+
run: () => chosenAccountLabel
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
label: ( localize(4955, 'Login with {0}', requestedAccountLabel)),
|
|
162
|
+
run: () => requestedAccountLabel
|
|
163
|
+
}
|
|
164
|
+
],
|
|
165
|
+
});
|
|
166
|
+
if (!result.result) {
|
|
167
|
+
throw ( (new CancellationError()));
|
|
168
|
+
}
|
|
169
|
+
return result.result === chosenAccountLabel;
|
|
170
|
+
}
|
|
143
171
|
async doGetSession(providerId, scopes, extensionId, extensionName, options) {
|
|
144
172
|
const sessions = await this.authenticationService.getSessions(providerId, scopes, options.account, true);
|
|
145
173
|
const provider = this.authenticationService.getProvider(providerId);
|
|
@@ -192,12 +220,16 @@ let MainThreadAuthentication = class MainThreadAuthentication extends Disposable
|
|
|
192
220
|
: sessions[0];
|
|
193
221
|
}
|
|
194
222
|
else {
|
|
195
|
-
let
|
|
196
|
-
if (!
|
|
223
|
+
let accountToCreate = options.account;
|
|
224
|
+
if (!accountToCreate) {
|
|
197
225
|
const sessionIdToRecreate = this.authenticationExtensionsService.getSessionPreference(providerId, extensionId, scopes);
|
|
198
|
-
|
|
226
|
+
accountToCreate = sessionIdToRecreate ? sessions.find(session => session.id === sessionIdToRecreate)?.account : undefined;
|
|
199
227
|
}
|
|
200
|
-
|
|
228
|
+
do {
|
|
229
|
+
session = await this.authenticationService.createSession(providerId, scopes, { activateImmediate: true, account: accountToCreate });
|
|
230
|
+
} while (accountToCreate
|
|
231
|
+
&& accountToCreate.label !== session.account.label
|
|
232
|
+
&& !(await this.continueWithIncorrectAccountPrompt(session.account.label, accountToCreate.label)));
|
|
201
233
|
}
|
|
202
234
|
this.authenticationAccessService.updateAllowedExtensions(providerId, session.account.label, [{ id: extensionId, name: extensionName, allowed: true }]);
|
|
203
235
|
this.authenticationExtensionsService.updateSessionPreference(providerId, extensionId, session);
|
|
@@ -85,7 +85,7 @@ let RemoteExtensionManagementCLI = class RemoteExtensionManagementCLI extends Ex
|
|
|
85
85
|
if (!this._extensionManifestPropertiesService.canExecuteOnWorkspace(manifest)
|
|
86
86
|
&& !(isWeb && this._extensionManifestPropertiesService.canExecuteOnWeb(manifest))) {
|
|
87
87
|
this.logger.info(( localize(
|
|
88
|
-
|
|
88
|
+
4897,
|
|
89
89
|
"Cannot install the '{0}' extension because it is declared to not run in this setup.",
|
|
90
90
|
getExtensionId(manifest.publisher, manifest.name)
|
|
91
91
|
)));
|