@codingame/monaco-vscode-extensions-service-override 25.1.1 → 26.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/index.js +7 -0
- package/package.json +3 -3
- package/vscode/src/vs/base/common/console.js +24 -15
- package/vscode/src/vs/platform/extensionManagement/common/extensionManagementCLI.d.ts +4 -1
- package/vscode/src/vs/platform/extensionManagement/common/extensionManagementCLI.js +149 -84
- package/vscode/src/vs/platform/extensionResourceLoader/browser/extensionResourceLoaderService.js +20 -12
- package/vscode/src/vs/platform/extensionResourceLoader/common/extensionResourceLoader.js +38 -21
- package/vscode/src/vs/platform/remote/common/managedSocket.js +7 -10
- package/vscode/src/vs/workbench/api/browser/mainThreadAiEmbeddingVector.js +5 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadAiRelatedInformation.js +5 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadAiSettingsSearch.js +4 -1
- package/vscode/src/vs/workbench/api/browser/mainThreadAuthentication.js +200 -143
- package/vscode/src/vs/workbench/api/browser/mainThreadBulkEdits.js +10 -14
- package/vscode/src/vs/workbench/api/browser/mainThreadCLICommands.js +41 -31
- package/vscode/src/vs/workbench/api/browser/mainThreadChatAgents2.d.ts +9 -12
- package/vscode/src/vs/workbench/api/browser/mainThreadChatAgents2.js +168 -115
- package/vscode/src/vs/workbench/api/browser/mainThreadChatCodeMapper.js +11 -13
- package/vscode/src/vs/workbench/api/browser/mainThreadChatContext.d.ts +5 -5
- package/vscode/src/vs/workbench/api/browser/mainThreadChatContext.js +42 -15
- package/vscode/src/vs/workbench/api/browser/mainThreadChatOutputRenderer.js +8 -7
- package/vscode/src/vs/workbench/api/browser/mainThreadChatSessions.d.ts +4 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadChatSessions.js +170 -99
- package/vscode/src/vs/workbench/api/browser/mainThreadChatStatus.js +2 -5
- package/vscode/src/vs/workbench/api/browser/mainThreadClipboard.js +4 -9
- package/vscode/src/vs/workbench/api/browser/mainThreadCodeInsets.js +13 -12
- package/vscode/src/vs/workbench/api/browser/mainThreadCommands.js +16 -19
- package/vscode/src/vs/workbench/api/browser/mainThreadComments.js +127 -70
- package/vscode/src/vs/workbench/api/browser/mainThreadConfiguration.js +80 -26
- package/vscode/src/vs/workbench/api/browser/mainThreadConsole.js +5 -11
- package/vscode/src/vs/workbench/api/browser/mainThreadCustomEditors.js +199 -97
- package/vscode/src/vs/workbench/api/browser/mainThreadDataChannels.js +1 -4
- package/vscode/src/vs/workbench/api/browser/mainThreadDebugService.js +88 -73
- package/vscode/src/vs/workbench/api/browser/mainThreadDecorations.js +5 -5
- package/vscode/src/vs/workbench/api/browser/mainThreadDiagnostics.js +16 -12
- package/vscode/src/vs/workbench/api/browser/mainThreadDialogs.js +10 -8
- package/vscode/src/vs/workbench/api/browser/mainThreadDocumentContentProviders.js +14 -6
- package/vscode/src/vs/workbench/api/browser/mainThreadDocuments.js +52 -37
- package/vscode/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.js +78 -58
- package/vscode/src/vs/workbench/api/browser/mainThreadEditSessionIdentityParticipant.js +5 -7
- package/vscode/src/vs/workbench/api/browser/mainThreadEditor.js +75 -63
- package/vscode/src/vs/workbench/api/browser/mainThreadEditorTabs.js +99 -91
- package/vscode/src/vs/workbench/api/browser/mainThreadEditors.js +93 -55
- package/vscode/src/vs/workbench/api/browser/mainThreadEmbeddings.js +3 -7
- package/vscode/src/vs/workbench/api/browser/mainThreadExtensionService.js +85 -60
- package/vscode/src/vs/workbench/api/browser/mainThreadFileSystem.js +49 -45
- package/vscode/src/vs/workbench/api/browser/mainThreadFileSystemEventService.js +114 -72
- package/vscode/src/vs/workbench/api/browser/mainThreadInteractive.js +4 -7
- package/vscode/src/vs/workbench/api/browser/mainThreadLabelService.js +1 -4
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures.d.ts +2 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageFeatures.js +381 -238
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageModelTools.d.ts +7 -3
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageModelTools.js +90 -13
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageModels.js +81 -58
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguages.js +9 -10
- package/vscode/src/vs/workbench/api/browser/mainThreadLocalization.js +2 -7
- package/vscode/src/vs/workbench/api/browser/mainThreadLogService.js +6 -10
- package/vscode/src/vs/workbench/api/browser/mainThreadManagedSockets.js +12 -10
- package/vscode/src/vs/workbench/api/browser/mainThreadMcp.d.ts +3 -2
- package/vscode/src/vs/workbench/api/browser/mainThreadMcp.js +162 -97
- package/vscode/src/vs/workbench/api/browser/mainThreadMessageService.js +32 -26
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebook.js +38 -32
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookDocuments.js +48 -46
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookDocumentsAndEditors.js +22 -18
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookDto.js +5 -8
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookEditors.js +35 -21
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookKernels.js +31 -28
- package/vscode/src/vs/workbench/api/browser/mainThreadNotebookSaveParticipant.js +5 -7
- package/vscode/src/vs/workbench/api/browser/mainThreadOutputService.js +47 -23
- package/vscode/src/vs/workbench/api/browser/mainThreadProfileContentHandlers.js +15 -12
- package/vscode/src/vs/workbench/api/browser/mainThreadProgress.js +17 -18
- package/vscode/src/vs/workbench/api/browser/mainThreadQuickDiff.js +6 -7
- package/vscode/src/vs/workbench/api/browser/mainThreadQuickOpen.js +83 -66
- package/vscode/src/vs/workbench/api/browser/mainThreadRemoteConnectionData.js +1 -5
- package/vscode/src/vs/workbench/api/browser/mainThreadSCM.js +250 -92
- package/vscode/src/vs/workbench/api/browser/mainThreadSaveParticipant.js +6 -8
- package/vscode/src/vs/workbench/api/browser/mainThreadSearch.js +37 -26
- package/vscode/src/vs/workbench/api/browser/mainThreadSecretState.js +34 -21
- package/vscode/src/vs/workbench/api/browser/mainThreadShare.js +3 -6
- package/vscode/src/vs/workbench/api/browser/mainThreadSpeech.js +19 -14
- package/vscode/src/vs/workbench/api/browser/mainThreadStatusBar.js +41 -16
- package/vscode/src/vs/workbench/api/browser/mainThreadStorage.js +18 -17
- package/vscode/src/vs/workbench/api/browser/mainThreadTask.js +145 -145
- package/vscode/src/vs/workbench/api/browser/mainThreadTelemetry.js +19 -11
- package/vscode/src/vs/workbench/api/browser/mainThreadTerminalService.js +176 -80
- package/vscode/src/vs/workbench/api/browser/mainThreadTerminalShellIntegration.js +52 -21
- package/vscode/src/vs/workbench/api/browser/mainThreadTesting.js +26 -24
- package/vscode/src/vs/workbench/api/browser/mainThreadTheming.js +1 -4
- package/vscode/src/vs/workbench/api/browser/mainThreadTimeline.js +5 -8
- package/vscode/src/vs/workbench/api/browser/mainThreadTreeViews.d.ts +4 -1
- package/vscode/src/vs/workbench/api/browser/mainThreadTreeViews.js +106 -46
- package/vscode/src/vs/workbench/api/browser/mainThreadTunnelService.js +83 -65
- package/vscode/src/vs/workbench/api/browser/mainThreadUriOpeners.js +20 -20
- package/vscode/src/vs/workbench/api/browser/mainThreadUrls.js +14 -9
- package/vscode/src/vs/workbench/api/browser/mainThreadWebviewManager.js +17 -9
- package/vscode/src/vs/workbench/api/browser/mainThreadWebviewPanels.js +49 -38
- package/vscode/src/vs/workbench/api/browser/mainThreadWebviewViews.js +10 -13
- package/vscode/src/vs/workbench/api/browser/mainThreadWebviews.js +38 -27
- package/vscode/src/vs/workbench/api/browser/mainThreadWindow.js +5 -11
- package/vscode/src/vs/workbench/api/browser/mainThreadWorkspace.d.ts +4 -1
- package/vscode/src/vs/workbench/api/browser/mainThreadWorkspace.js +73 -43
- package/vscode/src/vs/workbench/api/common/shared/dataTransferCache.js +2 -2
- package/vscode/src/vs/workbench/contrib/customEditor/common/customTextEditorModel.js +17 -10
- package/vscode/src/vs/workbench/contrib/externalUriOpener/common/contributedOpeners.js +17 -11
- package/vscode/src/vs/workbench/services/extensionManagement/browser/extensionBisect.js +107 -80
- package/vscode/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.js +336 -175
- package/vscode/src/vs/workbench/services/extensions/browser/extensionService.js +126 -71
- package/vscode/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.js +76 -54
- package/vscode/src/vs/workbench/services/extensions/browser/webWorkerFileSystemProvider.js +1 -2
- package/vscode/src/vs/workbench/services/extensions/common/abstractExtensionService.d.ts +2 -0
- package/vscode/src/vs/workbench/services/extensions/common/abstractExtensionService.js +343 -192
- package/vscode/src/vs/workbench/services/extensions/common/extHostCustomers.js +5 -3
- package/vscode/src/vs/workbench/services/extensions/common/extensionHostManager.d.ts +0 -1
- package/vscode/src/vs/workbench/services/extensions/common/extensionHostManager.js +75 -68
- package/vscode/src/vs/workbench/services/extensions/common/extensionRunningLocationTracker.js +135 -36
- package/vscode/src/vs/workbench/services/extensions/common/extensionsProposedApi.js +22 -18
- package/vscode/src/vs/workbench/services/extensions/common/extensionsUtil.js +14 -12
- package/vscode/src/vs/workbench/services/extensions/common/lazyCreateExtensionHostManager.js +21 -9
- package/vscode/src/vs/workbench/services/extensions/common/remoteExtensionHost.js +48 -25
- package/vscode/src/vs/workbench/services/themes/browser/cssExtensionPoint.d.ts +24 -0
- package/vscode/src/vs/workbench/services/themes/browser/cssExtensionPoint.js +300 -0
package/vscode/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.js
CHANGED
|
@@ -46,20 +46,31 @@ import { IUriIdentityService } from '@codingame/monaco-vscode-api/vscode/vs/plat
|
|
|
46
46
|
|
|
47
47
|
function isGalleryExtensionInfo(obj) {
|
|
48
48
|
const galleryExtensionInfo = obj;
|
|
49
|
-
return typeof galleryExtensionInfo?.id ===
|
|
50
|
-
&& (galleryExtensionInfo.preRelease === undefined || typeof galleryExtensionInfo.preRelease === 'boolean')
|
|
51
|
-
&& (galleryExtensionInfo.migrateStorageFrom === undefined || typeof galleryExtensionInfo.migrateStorageFrom === 'string');
|
|
49
|
+
return typeof galleryExtensionInfo?.id === "string" && (galleryExtensionInfo.preRelease === undefined || typeof galleryExtensionInfo.preRelease === "boolean") && (galleryExtensionInfo.migrateStorageFrom === undefined || typeof galleryExtensionInfo.migrateStorageFrom === "string");
|
|
52
50
|
}
|
|
53
51
|
function isUriComponents(obj) {
|
|
54
52
|
if (!obj) {
|
|
55
53
|
return false;
|
|
56
54
|
}
|
|
57
55
|
const thing = obj;
|
|
58
|
-
return typeof thing?.path ===
|
|
59
|
-
typeof thing?.scheme === 'string';
|
|
56
|
+
return typeof thing?.path === "string" && typeof thing?.scheme === "string";
|
|
60
57
|
}
|
|
61
58
|
let WebExtensionsScannerService = class WebExtensionsScannerService extends Disposable {
|
|
62
|
-
constructor(
|
|
59
|
+
constructor(
|
|
60
|
+
environmentService,
|
|
61
|
+
builtinExtensionsScannerService,
|
|
62
|
+
fileService,
|
|
63
|
+
logService,
|
|
64
|
+
galleryService,
|
|
65
|
+
extensionManifestPropertiesService,
|
|
66
|
+
extensionResourceLoaderService,
|
|
67
|
+
extensionStorageService,
|
|
68
|
+
storageService,
|
|
69
|
+
productService,
|
|
70
|
+
userDataProfilesService,
|
|
71
|
+
uriIdentityService,
|
|
72
|
+
lifecycleService
|
|
73
|
+
) {
|
|
63
74
|
super();
|
|
64
75
|
this.environmentService = environmentService;
|
|
65
76
|
this.builtinExtensionsScannerService = builtinExtensionsScannerService;
|
|
@@ -77,8 +88,11 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
77
88
|
this.customBuiltinExtensionsCacheResource = undefined;
|
|
78
89
|
this.resourcesAccessQueueMap = ( new ResourceMap());
|
|
79
90
|
if (isWeb) {
|
|
80
|
-
this.systemExtensionsCacheResource = joinPath(environmentService.userRoamingDataHome,
|
|
81
|
-
this.customBuiltinExtensionsCacheResource = joinPath(
|
|
91
|
+
this.systemExtensionsCacheResource = joinPath(environmentService.userRoamingDataHome, "systemExtensionsCache.json");
|
|
92
|
+
this.customBuiltinExtensionsCacheResource = joinPath(
|
|
93
|
+
environmentService.userRoamingDataHome,
|
|
94
|
+
"customBuiltinExtensionsCache.json"
|
|
95
|
+
);
|
|
82
96
|
lifecycleService.when(LifecyclePhase.Eventually).then(() => this.updateCaches());
|
|
83
97
|
}
|
|
84
98
|
this.extensionsEnabledWithApiProposalVersion = productService.extensionsEnabledWithApiProposalVersion?.map(id => id.toLowerCase()) ?? [];
|
|
@@ -90,24 +104,23 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
90
104
|
const extensionLocations = [];
|
|
91
105
|
const extensionGalleryResources = [];
|
|
92
106
|
const extensionsToMigrate = [];
|
|
93
|
-
const customBuiltinExtensionsInfo = this.environmentService.options && Array.isArray(this.environmentService.options.additionalBuiltinExtensions)
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
))
|
|
97
|
-
: [];
|
|
107
|
+
const customBuiltinExtensionsInfo = this.environmentService.options && Array.isArray(this.environmentService.options.additionalBuiltinExtensions) ? ( this.environmentService.options.additionalBuiltinExtensions.map(additionalBuiltinExtension => isString(additionalBuiltinExtension) ? {
|
|
108
|
+
id: additionalBuiltinExtension
|
|
109
|
+
} : additionalBuiltinExtension)) : [];
|
|
98
110
|
for (const e of customBuiltinExtensionsInfo) {
|
|
99
111
|
if (isGalleryExtensionInfo(e)) {
|
|
100
|
-
extensions.push({
|
|
112
|
+
extensions.push({
|
|
113
|
+
id: e.id,
|
|
114
|
+
preRelease: !!e.preRelease
|
|
115
|
+
});
|
|
101
116
|
if (e.migrateStorageFrom) {
|
|
102
117
|
extensionsToMigrate.push([e.migrateStorageFrom, e.id]);
|
|
103
118
|
}
|
|
104
|
-
}
|
|
105
|
-
else if (isUriComponents(e)) {
|
|
119
|
+
} else if (isUriComponents(e)) {
|
|
106
120
|
const extensionLocation = URI.revive(e);
|
|
107
121
|
if (await this.extensionResourceLoaderService.isExtensionGalleryResource(extensionLocation)) {
|
|
108
122
|
extensionGalleryResources.push(extensionLocation);
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
123
|
+
} else {
|
|
111
124
|
extensionLocations.push(extensionLocation);
|
|
112
125
|
}
|
|
113
126
|
}
|
|
@@ -116,15 +129,23 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
116
129
|
extensions = await this.checkAdditionalBuiltinExtensions(extensions);
|
|
117
130
|
}
|
|
118
131
|
if (extensions.length) {
|
|
119
|
-
this.logService.info(
|
|
132
|
+
this.logService.info("Found additional builtin gallery extensions in env", extensions);
|
|
120
133
|
}
|
|
121
134
|
if (extensionLocations.length) {
|
|
122
|
-
this.logService.info(
|
|
135
|
+
this.logService.info("Found additional builtin location extensions in env", ( extensionLocations.map(e => ( e.toString()))));
|
|
123
136
|
}
|
|
124
137
|
if (extensionGalleryResources.length) {
|
|
125
|
-
this.logService.info(
|
|
138
|
+
this.logService.info(
|
|
139
|
+
"Found additional builtin extension gallery resources in env",
|
|
140
|
+
( extensionGalleryResources.map(e => ( e.toString())))
|
|
141
|
+
);
|
|
126
142
|
}
|
|
127
|
-
return {
|
|
143
|
+
return {
|
|
144
|
+
extensions,
|
|
145
|
+
extensionsToMigrate,
|
|
146
|
+
extensionLocations,
|
|
147
|
+
extensionGalleryResources
|
|
148
|
+
};
|
|
128
149
|
})();
|
|
129
150
|
}
|
|
130
151
|
return this._customBuiltinExtensionsInfoPromise;
|
|
@@ -133,17 +154,25 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
133
154
|
const extensionsControlManifest = await this.galleryService.getExtensionsControlManifest();
|
|
134
155
|
const result = [];
|
|
135
156
|
for (const extension of extensions) {
|
|
136
|
-
if (isMalicious({
|
|
137
|
-
|
|
157
|
+
if (isMalicious({
|
|
158
|
+
id: extension.id
|
|
159
|
+
}, extensionsControlManifest.malicious)) {
|
|
160
|
+
this.logService.info(
|
|
161
|
+
`Checking additional builtin extensions: Ignoring '${extension.id}' because it is reported to be malicious.`
|
|
162
|
+
);
|
|
138
163
|
continue;
|
|
139
164
|
}
|
|
140
165
|
const deprecationInfo = extensionsControlManifest.deprecated[extension.id.toLowerCase()];
|
|
141
166
|
if (deprecationInfo?.extension?.autoMigrate) {
|
|
142
167
|
const preReleaseExtensionId = deprecationInfo.extension.id;
|
|
143
|
-
this.logService.info(
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
168
|
+
this.logService.info(
|
|
169
|
+
`Checking additional builtin extensions: '${extension.id}' is deprecated, instead using '${preReleaseExtensionId}'`
|
|
170
|
+
);
|
|
171
|
+
result.push({
|
|
172
|
+
id: preReleaseExtensionId,
|
|
173
|
+
preRelease: !!extension.preRelease
|
|
174
|
+
});
|
|
175
|
+
} else {
|
|
147
176
|
result.push(extension);
|
|
148
177
|
}
|
|
149
178
|
}
|
|
@@ -167,30 +196,35 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
167
196
|
async readCustomBuiltinExtensions(scanOptions) {
|
|
168
197
|
const [customBuiltinExtensionsFromLocations, customBuiltinExtensionsFromGallery] = await Promise.all([
|
|
169
198
|
this.getCustomBuiltinExtensionsFromLocations(scanOptions),
|
|
170
|
-
this.getCustomBuiltinExtensionsFromGallery(scanOptions)
|
|
199
|
+
this.getCustomBuiltinExtensionsFromGallery(scanOptions)
|
|
171
200
|
]);
|
|
172
|
-
const customBuiltinExtensions = [
|
|
201
|
+
const customBuiltinExtensions = [
|
|
202
|
+
...customBuiltinExtensionsFromLocations,
|
|
203
|
+
...customBuiltinExtensionsFromGallery
|
|
204
|
+
];
|
|
173
205
|
await this.migrateExtensionsStorage(customBuiltinExtensions);
|
|
174
206
|
return customBuiltinExtensions;
|
|
175
207
|
}
|
|
176
208
|
async getCustomBuiltinExtensionsFromLocations(scanOptions) {
|
|
177
|
-
const {
|
|
209
|
+
const {
|
|
210
|
+
extensionLocations
|
|
211
|
+
} = await this.readCustomBuiltinExtensionsInfoFromEnv();
|
|
178
212
|
if (!extensionLocations.length) {
|
|
179
213
|
return [];
|
|
180
214
|
}
|
|
181
215
|
const result = [];
|
|
182
|
-
await Promise.allSettled(( extensionLocations.map(async
|
|
216
|
+
await Promise.allSettled(( extensionLocations.map(async extensionLocation => {
|
|
183
217
|
try {
|
|
184
218
|
const webExtension = await this.toWebExtension(extensionLocation);
|
|
185
219
|
const extension = await this.toScannedExtension(webExtension, true);
|
|
186
220
|
if (extension.isValid || !scanOptions?.skipInvalidExtensions) {
|
|
187
221
|
result.push(extension);
|
|
222
|
+
} else {
|
|
223
|
+
this.logService.info(
|
|
224
|
+
`Skipping invalid additional builtin extension ${webExtension.identifier.id}`
|
|
225
|
+
);
|
|
188
226
|
}
|
|
189
|
-
|
|
190
|
-
this.logService.info(`Skipping invalid additional builtin extension ${webExtension.identifier.id}`);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
catch (error) {
|
|
227
|
+
} catch (error) {
|
|
194
228
|
this.logService.info(`Error while fetching the additional builtin extension ${( extensionLocation.toString())}.`, getErrorMessage(error));
|
|
195
229
|
}
|
|
196
230
|
})));
|
|
@@ -198,38 +232,58 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
198
232
|
}
|
|
199
233
|
async getCustomBuiltinExtensionsFromGallery(scanOptions) {
|
|
200
234
|
if (!this.galleryService.isEnabled()) {
|
|
201
|
-
this.logService.info(
|
|
235
|
+
this.logService.info(
|
|
236
|
+
"Ignoring fetching additional builtin extensions from gallery as it is disabled."
|
|
237
|
+
);
|
|
202
238
|
return [];
|
|
203
239
|
}
|
|
204
240
|
const result = [];
|
|
205
|
-
const {
|
|
241
|
+
const {
|
|
242
|
+
extensions,
|
|
243
|
+
extensionGalleryResources
|
|
244
|
+
} = await this.readCustomBuiltinExtensionsInfoFromEnv();
|
|
206
245
|
try {
|
|
207
246
|
const cacheValue = JSON.stringify({
|
|
208
247
|
extensions: extensions.sort((a, b) => a.id.localeCompare(b.id)),
|
|
209
248
|
extensionGalleryResources: ( extensionGalleryResources.map(e => ( e.toString()))).sort()
|
|
210
249
|
});
|
|
211
|
-
const useCache = this.storageService.get(
|
|
250
|
+
const useCache = this.storageService.get("additionalBuiltinExtensions", StorageScope.APPLICATION, "{}") === cacheValue;
|
|
212
251
|
const webExtensions = await (useCache ? this.getCustomBuiltinExtensionsFromCache() : this.updateCustomBuiltinExtensionsCache());
|
|
213
252
|
if (webExtensions.length) {
|
|
214
|
-
await Promise.all(( webExtensions.map(async
|
|
253
|
+
await Promise.all(( webExtensions.map(async webExtension => {
|
|
215
254
|
try {
|
|
216
255
|
const extension = await this.toScannedExtension(webExtension, true);
|
|
217
256
|
if (extension.isValid || !scanOptions?.skipInvalidExtensions) {
|
|
218
257
|
result.push(extension);
|
|
258
|
+
} else {
|
|
259
|
+
this.logService.info(
|
|
260
|
+
`Skipping invalid additional builtin gallery extension ${webExtension.identifier.id}`
|
|
261
|
+
);
|
|
219
262
|
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
this.logService.info(`Ignoring additional builtin extension ${webExtension.identifier.id} because there is an error while converting it into scanned extension`, getErrorMessage(error));
|
|
263
|
+
} catch (error) {
|
|
264
|
+
this.logService.info(
|
|
265
|
+
`Ignoring additional builtin extension ${webExtension.identifier.id} because there is an error while converting it into scanned extension`,
|
|
266
|
+
getErrorMessage(error)
|
|
267
|
+
);
|
|
226
268
|
}
|
|
227
269
|
})));
|
|
228
270
|
}
|
|
229
|
-
this.storageService.store(
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
271
|
+
this.storageService.store(
|
|
272
|
+
"additionalBuiltinExtensions",
|
|
273
|
+
cacheValue,
|
|
274
|
+
StorageScope.APPLICATION,
|
|
275
|
+
StorageTarget.MACHINE
|
|
276
|
+
);
|
|
277
|
+
} catch (error) {
|
|
278
|
+
this.logService.info(
|
|
279
|
+
"Ignoring following additional builtin extensions as there is an error while fetching them from gallery",
|
|
280
|
+
( extensions.map((
|
|
281
|
+
{
|
|
282
|
+
id
|
|
283
|
+
}
|
|
284
|
+
) => id)),
|
|
285
|
+
getErrorMessage(error)
|
|
286
|
+
);
|
|
233
287
|
}
|
|
234
288
|
return result;
|
|
235
289
|
}
|
|
@@ -253,27 +307,35 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
253
307
|
async migrateExtensionsStorage(customBuiltinExtensions) {
|
|
254
308
|
if (!this._migrateExtensionsStoragePromise) {
|
|
255
309
|
this._migrateExtensionsStoragePromise = (async () => {
|
|
256
|
-
const {
|
|
310
|
+
const {
|
|
311
|
+
extensionsToMigrate
|
|
312
|
+
} = await this.readCustomBuiltinExtensionsInfoFromEnv();
|
|
257
313
|
if (!extensionsToMigrate.length) {
|
|
258
314
|
return;
|
|
259
315
|
}
|
|
260
|
-
const fromExtensions = await this.galleryService.getExtensions(( extensionsToMigrate.map(([id]) => ({
|
|
316
|
+
const fromExtensions = await this.galleryService.getExtensions(( extensionsToMigrate.map(([id]) => ({
|
|
317
|
+
id
|
|
318
|
+
}))), CancellationToken.None);
|
|
261
319
|
try {
|
|
262
320
|
await Promise.allSettled(( extensionsToMigrate.map(async ([from, to]) => {
|
|
263
|
-
const toExtension = customBuiltinExtensions.find(extension => areSameExtensions(extension.identifier, {
|
|
321
|
+
const toExtension = customBuiltinExtensions.find(extension => areSameExtensions(extension.identifier, {
|
|
322
|
+
id: to
|
|
323
|
+
}));
|
|
264
324
|
if (toExtension) {
|
|
265
|
-
const fromExtension = fromExtensions.find(extension => areSameExtensions(extension.identifier, {
|
|
325
|
+
const fromExtension = fromExtensions.find(extension => areSameExtensions(extension.identifier, {
|
|
326
|
+
id: from
|
|
327
|
+
}));
|
|
266
328
|
const fromExtensionManifest = fromExtension ? await this.galleryService.getManifest(fromExtension, CancellationToken.None) : null;
|
|
267
329
|
const fromExtensionId = fromExtensionManifest ? getExtensionId(fromExtensionManifest.publisher, fromExtensionManifest.name) : from;
|
|
268
330
|
const toExtensionId = getExtensionId(toExtension.manifest.publisher, toExtension.manifest.name);
|
|
269
331
|
this.extensionStorageService.addToMigrationList(fromExtensionId, toExtensionId);
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
|
|
332
|
+
} else {
|
|
333
|
+
this.logService.info(
|
|
334
|
+
`Skipped migrating extension storage from '${from}' to '${to}', because the '${to}' extension is not found.`
|
|
335
|
+
);
|
|
273
336
|
}
|
|
274
337
|
})));
|
|
275
|
-
}
|
|
276
|
-
catch (error) {
|
|
338
|
+
} catch (error) {
|
|
277
339
|
this.logService.error(error);
|
|
278
340
|
}
|
|
279
341
|
})();
|
|
@@ -286,8 +348,7 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
286
348
|
}
|
|
287
349
|
async updateSystemExtensionsCache() {
|
|
288
350
|
const systemExtensions = await this.builtinExtensionsScannerService.scanBuiltinExtensions();
|
|
289
|
-
const cachedSystemExtensions = (await this.readSystemExtensionsCache())
|
|
290
|
-
.filter(cached => {
|
|
351
|
+
const cachedSystemExtensions = (await this.readSystemExtensionsCache()).filter(cached => {
|
|
291
352
|
const systemExtension = systemExtensions.find(e => areSameExtensions(e.identifier, cached.identifier));
|
|
292
353
|
return systemExtension && semverExports.gt(cached.version, systemExtension.manifest.version);
|
|
293
354
|
});
|
|
@@ -296,8 +357,11 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
296
357
|
async updateCustomBuiltinExtensionsCache() {
|
|
297
358
|
if (!this._updateCustomBuiltinExtensionsCachePromise) {
|
|
298
359
|
this._updateCustomBuiltinExtensionsCachePromise = (async () => {
|
|
299
|
-
this.logService.info(
|
|
300
|
-
const {
|
|
360
|
+
this.logService.info("Updating additional builtin extensions cache");
|
|
361
|
+
const {
|
|
362
|
+
extensions,
|
|
363
|
+
extensionGalleryResources
|
|
364
|
+
} = await this.readCustomBuiltinExtensionsInfoFromEnv();
|
|
301
365
|
const [galleryWebExtensions, extensionGalleryResourceWebExtensions] = await Promise.all([
|
|
302
366
|
this.resolveBuiltinGalleryExtensions(extensions),
|
|
303
367
|
this.resolveBuiltinExtensionGalleryResources(extensionGalleryResources)
|
|
@@ -320,14 +384,19 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
320
384
|
}
|
|
321
385
|
const result = ( new Map());
|
|
322
386
|
const extensionInfos = [];
|
|
323
|
-
await Promise.all(( extensionGalleryResources.map(async
|
|
387
|
+
await Promise.all(( extensionGalleryResources.map(async extensionGalleryResource => {
|
|
324
388
|
try {
|
|
325
389
|
const webExtension = await this.toWebExtensionFromExtensionGalleryResource(extensionGalleryResource);
|
|
326
390
|
result.set(webExtension.identifier.id.toLowerCase(), webExtension);
|
|
327
|
-
extensionInfos.push({
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
391
|
+
extensionInfos.push({
|
|
392
|
+
id: webExtension.identifier.id,
|
|
393
|
+
version: webExtension.version
|
|
394
|
+
});
|
|
395
|
+
} catch (error) {
|
|
396
|
+
this.logService.info(
|
|
397
|
+
`Ignoring additional builtin extension from gallery resource ${( extensionGalleryResource.toString())} because there is an error while converting it into web extension`,
|
|
398
|
+
getErrorMessage(error)
|
|
399
|
+
);
|
|
331
400
|
}
|
|
332
401
|
})));
|
|
333
402
|
const galleryExtensions = await this.galleryService.getExtensions(extensionInfos, CancellationToken.None);
|
|
@@ -336,10 +405,18 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
336
405
|
if (webExtension) {
|
|
337
406
|
result.set(galleryExtension.identifier.id.toLowerCase(), {
|
|
338
407
|
...webExtension,
|
|
339
|
-
identifier: {
|
|
408
|
+
identifier: {
|
|
409
|
+
id: webExtension.identifier.id,
|
|
410
|
+
uuid: galleryExtension.identifier.uuid
|
|
411
|
+
},
|
|
340
412
|
readmeUri: galleryExtension.assets.readme ? ( URI.parse(galleryExtension.assets.readme.uri)) : undefined,
|
|
341
413
|
changelogUri: galleryExtension.assets.changelog ? ( URI.parse(galleryExtension.assets.changelog.uri)) : undefined,
|
|
342
|
-
metadata: {
|
|
414
|
+
metadata: {
|
|
415
|
+
isPreReleaseVersion: galleryExtension.properties.isPreReleaseVersion,
|
|
416
|
+
preRelease: galleryExtension.properties.isPreReleaseVersion,
|
|
417
|
+
isBuiltin: true,
|
|
418
|
+
pinned: true
|
|
419
|
+
}
|
|
343
420
|
});
|
|
344
421
|
}
|
|
345
422
|
}
|
|
@@ -351,17 +428,30 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
351
428
|
}
|
|
352
429
|
const webExtensions = [];
|
|
353
430
|
const galleryExtensionsMap = await this.getExtensionsWithDependenciesAndPackedExtensions(extensions);
|
|
354
|
-
const missingExtensions = extensions.filter((
|
|
431
|
+
const missingExtensions = extensions.filter((
|
|
432
|
+
{
|
|
433
|
+
id
|
|
434
|
+
}
|
|
435
|
+
) => !( galleryExtensionsMap.has(id.toLowerCase())));
|
|
355
436
|
if (missingExtensions.length) {
|
|
356
|
-
this.logService.info(
|
|
437
|
+
this.logService.info(
|
|
438
|
+
"Skipping the additional builtin extensions because their compatible versions are not found.",
|
|
439
|
+
missingExtensions
|
|
440
|
+
);
|
|
357
441
|
}
|
|
358
|
-
await Promise.all(( [...( galleryExtensionsMap.values())].map(async
|
|
442
|
+
await Promise.all(( [...( galleryExtensionsMap.values())].map(async gallery => {
|
|
359
443
|
try {
|
|
360
|
-
const webExtension = await this.toWebExtensionFromGallery(gallery, {
|
|
444
|
+
const webExtension = await this.toWebExtensionFromGallery(gallery, {
|
|
445
|
+
isPreReleaseVersion: gallery.properties.isPreReleaseVersion,
|
|
446
|
+
preRelease: gallery.properties.isPreReleaseVersion,
|
|
447
|
+
isBuiltin: true
|
|
448
|
+
});
|
|
361
449
|
webExtensions.push(webExtension);
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
|
|
450
|
+
} catch (error) {
|
|
451
|
+
this.logService.info(
|
|
452
|
+
`Ignoring additional builtin extension ${gallery.identifier.id} because there is an error while converting it into web extension`,
|
|
453
|
+
getErrorMessage(error)
|
|
454
|
+
);
|
|
365
455
|
}
|
|
366
456
|
})));
|
|
367
457
|
return webExtensions;
|
|
@@ -369,9 +459,15 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
369
459
|
async resolveDependenciesAndPackedExtensions(webExtensions, result) {
|
|
370
460
|
const extensionInfos = [];
|
|
371
461
|
for (const webExtension of webExtensions) {
|
|
372
|
-
for (const e of [
|
|
462
|
+
for (const e of [
|
|
463
|
+
...(webExtension.manifest?.extensionDependencies ?? []),
|
|
464
|
+
...(webExtension.manifest?.extensionPack ?? [])
|
|
465
|
+
]) {
|
|
373
466
|
if (!( result.has(e.toLowerCase()))) {
|
|
374
|
-
extensionInfos.push({
|
|
467
|
+
extensionInfos.push({
|
|
468
|
+
id: e,
|
|
469
|
+
version: webExtension.version
|
|
470
|
+
});
|
|
375
471
|
}
|
|
376
472
|
}
|
|
377
473
|
}
|
|
@@ -379,32 +475,55 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
379
475
|
return;
|
|
380
476
|
}
|
|
381
477
|
const galleryExtensions = await this.getExtensionsWithDependenciesAndPackedExtensions(extensionInfos, ( new Set([...( result.keys())])));
|
|
382
|
-
await Promise.all(( [...( galleryExtensions.values())].map(async
|
|
478
|
+
await Promise.all(( [...( galleryExtensions.values())].map(async gallery => {
|
|
383
479
|
try {
|
|
384
|
-
const webExtension = await this.toWebExtensionFromGallery(gallery, {
|
|
480
|
+
const webExtension = await this.toWebExtensionFromGallery(gallery, {
|
|
481
|
+
isPreReleaseVersion: gallery.properties.isPreReleaseVersion,
|
|
482
|
+
preRelease: gallery.properties.isPreReleaseVersion,
|
|
483
|
+
isBuiltin: true
|
|
484
|
+
});
|
|
385
485
|
result.set(webExtension.identifier.id.toLowerCase(), webExtension);
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
|
|
486
|
+
} catch (error) {
|
|
487
|
+
this.logService.info(
|
|
488
|
+
`Ignoring additional builtin extension ${gallery.identifier.id} because there is an error while converting it into web extension`,
|
|
489
|
+
getErrorMessage(error)
|
|
490
|
+
);
|
|
389
491
|
}
|
|
390
492
|
})));
|
|
391
493
|
}
|
|
392
|
-
async getExtensionsWithDependenciesAndPackedExtensions(
|
|
494
|
+
async getExtensionsWithDependenciesAndPackedExtensions(
|
|
495
|
+
toGet,
|
|
496
|
+
seen = ( new Set()),
|
|
497
|
+
result = ( new Map())
|
|
498
|
+
) {
|
|
393
499
|
if (toGet.length === 0) {
|
|
394
500
|
return result;
|
|
395
501
|
}
|
|
396
|
-
const extensions = await this.galleryService.getExtensions(toGet, {
|
|
502
|
+
const extensions = await this.galleryService.getExtensions(toGet, {
|
|
503
|
+
compatible: true,
|
|
504
|
+
targetPlatform: TargetPlatform.WEB
|
|
505
|
+
}, CancellationToken.None);
|
|
397
506
|
const packsAndDependencies = ( new Map());
|
|
398
507
|
for (const extension of extensions) {
|
|
399
508
|
result.set(extension.identifier.id.toLowerCase(), extension);
|
|
400
|
-
for (const id of [
|
|
509
|
+
for (const id of [
|
|
510
|
+
...(isNonEmptyArray(extension.properties.dependencies) ? extension.properties.dependencies : []),
|
|
511
|
+
...(isNonEmptyArray(extension.properties.extensionPack) ? extension.properties.extensionPack : [])
|
|
512
|
+
]) {
|
|
401
513
|
if (!( result.has(id.toLowerCase())) && !( packsAndDependencies.has(id.toLowerCase())) && !( seen.has(id.toLowerCase()))) {
|
|
402
514
|
const extensionInfo = toGet.find(e => areSameExtensions(e, extension.identifier));
|
|
403
|
-
packsAndDependencies.set(id.toLowerCase(), {
|
|
515
|
+
packsAndDependencies.set(id.toLowerCase(), {
|
|
516
|
+
id,
|
|
517
|
+
preRelease: extensionInfo?.preRelease
|
|
518
|
+
});
|
|
404
519
|
}
|
|
405
520
|
}
|
|
406
521
|
}
|
|
407
|
-
return this.getExtensionsWithDependenciesAndPackedExtensions([...( packsAndDependencies.values())].filter((
|
|
522
|
+
return this.getExtensionsWithDependenciesAndPackedExtensions([...( packsAndDependencies.values())].filter((
|
|
523
|
+
{
|
|
524
|
+
id
|
|
525
|
+
}
|
|
526
|
+
) => !( result.has(id.toLowerCase()))), seen, result);
|
|
408
527
|
}
|
|
409
528
|
async scanSystemExtensions() {
|
|
410
529
|
return this.readSystemExtensions();
|
|
@@ -425,18 +544,18 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
425
544
|
const devExtensions = this.environmentService.options?.developmentOptions?.extensions;
|
|
426
545
|
const result = [];
|
|
427
546
|
if (Array.isArray(devExtensions)) {
|
|
428
|
-
await Promise.allSettled(( devExtensions.map(async
|
|
547
|
+
await Promise.allSettled(( devExtensions.map(async devExtension => {
|
|
429
548
|
try {
|
|
430
549
|
const location = URI.revive(devExtension);
|
|
431
550
|
if (URI.isUri(location)) {
|
|
432
551
|
const webExtension = await this.toWebExtension(location);
|
|
433
552
|
result.push(await this.toScannedExtension(webExtension, false));
|
|
553
|
+
} else {
|
|
554
|
+
this.logService.info(
|
|
555
|
+
`Skipping the extension under development ${devExtension} as it is not URI type.`
|
|
556
|
+
);
|
|
434
557
|
}
|
|
435
|
-
|
|
436
|
-
this.logService.info(`Skipping the extension under development ${devExtension} as it is not URI type.`);
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
catch (error) {
|
|
558
|
+
} catch (error) {
|
|
440
559
|
this.logService.info(`Error while fetching the extension under development ${( devExtension.toString())}.`, getErrorMessage(error));
|
|
441
560
|
}
|
|
442
561
|
})));
|
|
@@ -454,8 +573,7 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
454
573
|
async scanExtensionManifest(extensionLocation) {
|
|
455
574
|
try {
|
|
456
575
|
return await this.getExtensionManifest(extensionLocation);
|
|
457
|
-
}
|
|
458
|
-
catch (error) {
|
|
576
|
+
} catch (error) {
|
|
459
577
|
this.logService.warn(`Error while fetching manifest from ${( extensionLocation.toString())}`, getErrorMessage(error));
|
|
460
578
|
return null;
|
|
461
579
|
}
|
|
@@ -465,13 +583,24 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
465
583
|
return this.addWebExtension(webExtension, profileLocation);
|
|
466
584
|
}
|
|
467
585
|
async addExtension(location, metadata, profileLocation) {
|
|
468
|
-
const webExtension = await this.toWebExtension(
|
|
586
|
+
const webExtension = await this.toWebExtension(
|
|
587
|
+
location,
|
|
588
|
+
undefined,
|
|
589
|
+
undefined,
|
|
590
|
+
undefined,
|
|
591
|
+
undefined,
|
|
592
|
+
undefined,
|
|
593
|
+
undefined,
|
|
594
|
+
metadata
|
|
595
|
+
);
|
|
469
596
|
const extension = await this.toScannedExtension(webExtension, false);
|
|
470
597
|
await this.addToInstalledExtensions([webExtension], profileLocation);
|
|
471
598
|
return extension;
|
|
472
599
|
}
|
|
473
600
|
async removeExtension(extension, profileLocation) {
|
|
474
|
-
await this.writeInstalledExtensions(profileLocation, installedExtensions => installedExtensions.filter(
|
|
601
|
+
await this.writeInstalledExtensions(profileLocation, installedExtensions => installedExtensions.filter(
|
|
602
|
+
installedExtension => !areSameExtensions(installedExtension.identifier, extension.identifier)
|
|
603
|
+
));
|
|
475
604
|
}
|
|
476
605
|
async updateMetadata(extension, metadata, profileLocation) {
|
|
477
606
|
let updatedExtension = undefined;
|
|
@@ -479,25 +608,27 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
479
608
|
const result = [];
|
|
480
609
|
for (const installedExtension of installedExtensions) {
|
|
481
610
|
if (areSameExtensions(extension.identifier, installedExtension.identifier)) {
|
|
482
|
-
installedExtension.metadata = {
|
|
611
|
+
installedExtension.metadata = {
|
|
612
|
+
...installedExtension.metadata,
|
|
613
|
+
...metadata
|
|
614
|
+
};
|
|
483
615
|
updatedExtension = installedExtension;
|
|
484
616
|
result.push(installedExtension);
|
|
485
|
-
}
|
|
486
|
-
else {
|
|
617
|
+
} else {
|
|
487
618
|
result.push(installedExtension);
|
|
488
619
|
}
|
|
489
620
|
}
|
|
490
621
|
return result;
|
|
491
622
|
});
|
|
492
623
|
if (!updatedExtension) {
|
|
493
|
-
throw ( new Error(
|
|
624
|
+
throw ( new Error("Extension not found"));
|
|
494
625
|
}
|
|
495
626
|
return this.toScannedExtension(updatedExtension, extension.isBuiltin);
|
|
496
627
|
}
|
|
497
628
|
async copyExtensions(fromProfileLocation, toProfileLocation, filter) {
|
|
498
629
|
const extensionsToCopy = [];
|
|
499
630
|
const fromWebExtensions = await this.readInstalledExtensions(fromProfileLocation);
|
|
500
|
-
await Promise.all(( fromWebExtensions.map(async
|
|
631
|
+
await Promise.all(( fromWebExtensions.map(async webExtension => {
|
|
501
632
|
const scannedExtension = await this.toScannedExtension(webExtension, false);
|
|
502
633
|
if (filter(scannedExtension)) {
|
|
503
634
|
extensionsToCopy.push(webExtension);
|
|
@@ -513,7 +644,9 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
513
644
|
const extension = await this.toScannedExtension(webExtension, isBuiltin);
|
|
514
645
|
if (isSystem) {
|
|
515
646
|
await this.writeSystemExtensionsCache(systemExtensions => {
|
|
516
|
-
systemExtensions = systemExtensions.filter(
|
|
647
|
+
systemExtensions = systemExtensions.filter(
|
|
648
|
+
extension => !areSameExtensions(extension.identifier, webExtension.identifier)
|
|
649
|
+
);
|
|
517
650
|
systemExtensions.push(webExtension);
|
|
518
651
|
return systemExtensions;
|
|
519
652
|
});
|
|
@@ -521,7 +654,9 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
521
654
|
}
|
|
522
655
|
if (isBuiltin) {
|
|
523
656
|
await this.writeCustomBuiltinExtensionsCache(customBuiltinExtensions => {
|
|
524
|
-
customBuiltinExtensions = customBuiltinExtensions.filter(
|
|
657
|
+
customBuiltinExtensions = customBuiltinExtensions.filter(
|
|
658
|
+
extension => !areSameExtensions(extension.identifier, webExtension.identifier)
|
|
659
|
+
);
|
|
525
660
|
customBuiltinExtensions.push(webExtension);
|
|
526
661
|
return customBuiltinExtensions;
|
|
527
662
|
});
|
|
@@ -545,12 +680,17 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
545
680
|
}
|
|
546
681
|
async scanInstalledExtensions(profileLocation, scanOptions) {
|
|
547
682
|
let installedExtensions = await this.readInstalledExtensions(profileLocation);
|
|
548
|
-
if (!this.uriIdentityService.extUri.isEqual(
|
|
683
|
+
if (!this.uriIdentityService.extUri.isEqual(
|
|
684
|
+
profileLocation,
|
|
685
|
+
this.userDataProfilesService.defaultProfile.extensionsResource
|
|
686
|
+
)) {
|
|
549
687
|
installedExtensions = installedExtensions.filter(i => !i.metadata?.isApplicationScoped);
|
|
550
688
|
const defaultProfileExtensions = await this.readInstalledExtensions(this.userDataProfilesService.defaultProfile.extensionsResource);
|
|
551
689
|
installedExtensions.push(...defaultProfileExtensions.filter(i => i.metadata?.isApplicationScoped));
|
|
552
690
|
}
|
|
553
|
-
installedExtensions.sort(
|
|
691
|
+
installedExtensions.sort(
|
|
692
|
+
(a, b) => a.identifier.id < b.identifier.id ? -1 : a.identifier.id > b.identifier.id ? 1 : semverExports.rcompare(a.version, b.version)
|
|
693
|
+
);
|
|
554
694
|
const result = ( new Map());
|
|
555
695
|
for (const webExtension of installedExtensions) {
|
|
556
696
|
const existing = result.get(webExtension.identifier.id.toLowerCase());
|
|
@@ -560,8 +700,7 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
560
700
|
const extension = await this.toScannedExtension(webExtension, false);
|
|
561
701
|
if (extension.isValid || !scanOptions?.skipInvalidExtensions) {
|
|
562
702
|
result.set(extension.identifier.id.toLowerCase(), extension);
|
|
563
|
-
}
|
|
564
|
-
else {
|
|
703
|
+
} else {
|
|
565
704
|
this.logService.info(`Skipping invalid installed extension ${webExtension.identifier.id}`);
|
|
566
705
|
}
|
|
567
706
|
}
|
|
@@ -573,17 +712,32 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
573
712
|
name: galleryExtension.name,
|
|
574
713
|
version: galleryExtension.version,
|
|
575
714
|
targetPlatform: galleryExtension.properties.targetPlatform === TargetPlatform.WEB ? TargetPlatform.WEB : undefined
|
|
576
|
-
},
|
|
715
|
+
}, "extension");
|
|
577
716
|
if (!extensionLocation) {
|
|
578
|
-
throw ( new Error(
|
|
717
|
+
throw ( new Error("No extension gallery service configured."));
|
|
579
718
|
}
|
|
580
|
-
return this.toWebExtensionFromExtensionGalleryResource(
|
|
719
|
+
return this.toWebExtensionFromExtensionGalleryResource(
|
|
720
|
+
extensionLocation,
|
|
721
|
+
galleryExtension.identifier,
|
|
722
|
+
galleryExtension.assets.readme ? ( URI.parse(galleryExtension.assets.readme.uri)) : undefined,
|
|
723
|
+
galleryExtension.assets.changelog ? ( URI.parse(galleryExtension.assets.changelog.uri)) : undefined,
|
|
724
|
+
metadata
|
|
725
|
+
);
|
|
581
726
|
}
|
|
582
727
|
async toWebExtensionFromExtensionGalleryResource(extensionLocation, identifier, readmeUri, changelogUri, metadata) {
|
|
583
728
|
const extensionResources = await this.listExtensionResources(extensionLocation);
|
|
584
729
|
const packageNLSResources = this.getPackageNLSResourceMapFromResources(extensionResources);
|
|
585
|
-
const fallbackPackageNLSResource = extensionResources.find(e => basename(e) ===
|
|
586
|
-
return this.toWebExtension(
|
|
730
|
+
const fallbackPackageNLSResource = extensionResources.find(e => basename(e) === "package.nls.json");
|
|
731
|
+
return this.toWebExtension(
|
|
732
|
+
extensionLocation,
|
|
733
|
+
identifier,
|
|
734
|
+
undefined,
|
|
735
|
+
packageNLSResources,
|
|
736
|
+
fallbackPackageNLSResource ? ( URI.parse(fallbackPackageNLSResource)) : null,
|
|
737
|
+
readmeUri,
|
|
738
|
+
changelogUri,
|
|
739
|
+
metadata
|
|
740
|
+
);
|
|
587
741
|
}
|
|
588
742
|
getPackageNLSResourceMapFromResources(extensionResources) {
|
|
589
743
|
const packageNLSResources = ( new Map());
|
|
@@ -595,34 +749,44 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
595
749
|
});
|
|
596
750
|
return packageNLSResources;
|
|
597
751
|
}
|
|
598
|
-
async toWebExtension(
|
|
752
|
+
async toWebExtension(
|
|
753
|
+
extensionLocation,
|
|
754
|
+
identifier,
|
|
755
|
+
manifest,
|
|
756
|
+
packageNLSUris,
|
|
757
|
+
fallbackPackageNLSUri,
|
|
758
|
+
readmeUri,
|
|
759
|
+
changelogUri,
|
|
760
|
+
metadata
|
|
761
|
+
) {
|
|
599
762
|
if (!manifest) {
|
|
600
763
|
try {
|
|
601
764
|
manifest = await this.getExtensionManifest(extensionLocation);
|
|
602
|
-
}
|
|
603
|
-
catch (error) {
|
|
765
|
+
} catch (error) {
|
|
604
766
|
throw ( new Error(`Error while fetching manifest from the location '${( extensionLocation.toString())}'. ${getErrorMessage(error)}`));
|
|
605
767
|
}
|
|
606
768
|
}
|
|
607
769
|
if (!this.extensionManifestPropertiesService.canExecuteOnWeb(manifest)) {
|
|
608
770
|
throw ( new Error(( localize(
|
|
609
|
-
|
|
771
|
+
14316,
|
|
610
772
|
"Cannot add '{0}' because this extension is not a web extension.",
|
|
611
773
|
manifest.displayName || manifest.name
|
|
612
774
|
))));
|
|
613
775
|
}
|
|
614
776
|
if (fallbackPackageNLSUri === undefined) {
|
|
615
777
|
try {
|
|
616
|
-
fallbackPackageNLSUri = joinPath(extensionLocation,
|
|
778
|
+
fallbackPackageNLSUri = joinPath(extensionLocation, "package.nls.json");
|
|
617
779
|
await this.extensionResourceLoaderService.readExtensionResource(fallbackPackageNLSUri);
|
|
618
|
-
}
|
|
619
|
-
catch (error) {
|
|
780
|
+
} catch (error) {
|
|
620
781
|
fallbackPackageNLSUri = undefined;
|
|
621
782
|
}
|
|
622
783
|
}
|
|
623
784
|
const defaultManifestTranslations = fallbackPackageNLSUri ? URI.isUri(fallbackPackageNLSUri) ? await this.getTranslations(fallbackPackageNLSUri) : fallbackPackageNLSUri : null;
|
|
624
785
|
return {
|
|
625
|
-
identifier: {
|
|
786
|
+
identifier: {
|
|
787
|
+
id: getGalleryExtensionId(manifest.publisher, manifest.name),
|
|
788
|
+
uuid: identifier?.uuid
|
|
789
|
+
},
|
|
626
790
|
version: manifest.version,
|
|
627
791
|
location: extensionLocation,
|
|
628
792
|
manifest,
|
|
@@ -631,7 +795,7 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
631
795
|
packageNLSUris,
|
|
632
796
|
fallbackPackageNLSUri: URI.isUri(fallbackPackageNLSUri) ? fallbackPackageNLSUri : undefined,
|
|
633
797
|
defaultManifestTranslations,
|
|
634
|
-
metadata
|
|
798
|
+
metadata
|
|
635
799
|
};
|
|
636
800
|
}
|
|
637
801
|
async toScannedExtension(webExtension, isBuiltin, type = ExtensionType.User) {
|
|
@@ -640,31 +804,41 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
640
804
|
if (!manifest) {
|
|
641
805
|
try {
|
|
642
806
|
manifest = await this.getExtensionManifest(webExtension.location);
|
|
643
|
-
}
|
|
644
|
-
|
|
645
|
-
|
|
807
|
+
} catch (error) {
|
|
808
|
+
validations.push([
|
|
809
|
+
Severity.Error,
|
|
810
|
+
`Error while fetching manifest from the location '${webExtension.location}'. ${getErrorMessage(error)}`
|
|
811
|
+
]);
|
|
646
812
|
}
|
|
647
813
|
}
|
|
648
814
|
if (!manifest) {
|
|
649
|
-
const [publisher, name] = webExtension.identifier.id.split(
|
|
815
|
+
const [publisher, name] = webExtension.identifier.id.split(".");
|
|
650
816
|
manifest = {
|
|
651
817
|
name,
|
|
652
818
|
publisher,
|
|
653
819
|
version: webExtension.version,
|
|
654
|
-
engines: {
|
|
820
|
+
engines: {
|
|
821
|
+
vscode: "*"
|
|
822
|
+
}
|
|
655
823
|
};
|
|
656
824
|
}
|
|
657
825
|
const packageNLSUri = webExtension.packageNLSUris?.get(Language.value().toLowerCase());
|
|
658
826
|
const fallbackPackageNLS = webExtension.defaultManifestTranslations ?? webExtension.fallbackPackageNLSUri;
|
|
659
827
|
if (packageNLSUri) {
|
|
660
828
|
manifest = await this.translateManifest(manifest, packageNLSUri, fallbackPackageNLS);
|
|
661
|
-
}
|
|
662
|
-
else if (fallbackPackageNLS) {
|
|
829
|
+
} else if (fallbackPackageNLS) {
|
|
663
830
|
manifest = await this.translateManifest(manifest, fallbackPackageNLS);
|
|
664
831
|
}
|
|
665
832
|
const uuid = webExtension.metadata?.id;
|
|
666
833
|
const validateApiVersion = this.extensionsEnabledWithApiProposalVersion.includes(webExtension.identifier.id.toLowerCase());
|
|
667
|
-
validations.push(...validateExtensionManifest(
|
|
834
|
+
validations.push(...validateExtensionManifest(
|
|
835
|
+
this.productService.version,
|
|
836
|
+
this.productService.date,
|
|
837
|
+
webExtension.location,
|
|
838
|
+
manifest,
|
|
839
|
+
false,
|
|
840
|
+
validateApiVersion
|
|
841
|
+
));
|
|
668
842
|
let isValid = true;
|
|
669
843
|
for (const [severity, message] of validations) {
|
|
670
844
|
if (severity === Severity.Error) {
|
|
@@ -676,7 +850,10 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
676
850
|
manifest.enabledApiProposals = parseEnabledApiProposalNames([...manifest.enabledApiProposals]);
|
|
677
851
|
}
|
|
678
852
|
return {
|
|
679
|
-
identifier: {
|
|
853
|
+
identifier: {
|
|
854
|
+
id: webExtension.identifier.id,
|
|
855
|
+
uuid: webExtension.identifier.uuid || uuid
|
|
856
|
+
},
|
|
680
857
|
location: webExtension.location,
|
|
681
858
|
manifest,
|
|
682
859
|
type,
|
|
@@ -687,16 +864,15 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
687
864
|
targetPlatform: TargetPlatform.WEB,
|
|
688
865
|
validations,
|
|
689
866
|
isValid,
|
|
690
|
-
preRelease: !!webExtension.metadata?.preRelease
|
|
867
|
+
preRelease: !!webExtension.metadata?.preRelease
|
|
691
868
|
};
|
|
692
869
|
}
|
|
693
870
|
async listExtensionResources(extensionLocation) {
|
|
694
871
|
try {
|
|
695
872
|
const result = await this.extensionResourceLoaderService.readExtensionResource(extensionLocation);
|
|
696
873
|
return JSON.parse(result);
|
|
697
|
-
}
|
|
698
|
-
|
|
699
|
-
this.logService.warn('Error while fetching extension resources list', getErrorMessage(error));
|
|
874
|
+
} catch (error) {
|
|
875
|
+
this.logService.warn("Error while fetching extension resources list", getErrorMessage(error));
|
|
700
876
|
}
|
|
701
877
|
return [];
|
|
702
878
|
}
|
|
@@ -707,12 +883,11 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
707
883
|
if (translations) {
|
|
708
884
|
manifest = localizeManifest(this.logService, manifest, translations, fallbackTranslations);
|
|
709
885
|
}
|
|
710
|
-
}
|
|
711
|
-
catch (error) { }
|
|
886
|
+
} catch (error) {}
|
|
712
887
|
return manifest;
|
|
713
888
|
}
|
|
714
889
|
async getExtensionManifest(location) {
|
|
715
|
-
const url = joinPath(location,
|
|
890
|
+
const url = joinPath(location, "package.json");
|
|
716
891
|
const content = await this.extensionResourceLoaderService.readExtensionResource(url);
|
|
717
892
|
return JSON.parse(content);
|
|
718
893
|
}
|
|
@@ -720,8 +895,7 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
720
895
|
try {
|
|
721
896
|
const content = await this.extensionResourceLoaderService.readExtensionResource(nlsUrl);
|
|
722
897
|
return JSON.parse(content);
|
|
723
|
-
}
|
|
724
|
-
catch (error) {
|
|
898
|
+
} catch (error) {
|
|
725
899
|
this.logService.error(`Error while fetching translations of an extension`, ( nlsUrl.toString()), getErrorMessage(error));
|
|
726
900
|
}
|
|
727
901
|
return undefined;
|
|
@@ -755,7 +929,7 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
755
929
|
const storedWebExtensions = JSON.parse(( content.value.toString()));
|
|
756
930
|
for (const e of storedWebExtensions) {
|
|
757
931
|
if (!e.location || !e.identifier || !e.version) {
|
|
758
|
-
this.logService.info(
|
|
932
|
+
this.logService.info("Ignoring invalid extension while scanning", storedWebExtensions);
|
|
759
933
|
continue;
|
|
760
934
|
}
|
|
761
935
|
let packageNLSUris;
|
|
@@ -774,17 +948,15 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
774
948
|
fallbackPackageNLSUri: URI.revive(e.fallbackPackageNLSUri),
|
|
775
949
|
defaultManifestTranslations: e.defaultManifestTranslations,
|
|
776
950
|
packageNLSUri: URI.revive(e.packageNLSUri),
|
|
777
|
-
metadata: e.metadata
|
|
951
|
+
metadata: e.metadata
|
|
778
952
|
});
|
|
779
953
|
}
|
|
780
954
|
try {
|
|
781
955
|
webExtensions = await this.migrateWebExtensions(webExtensions, file);
|
|
782
|
-
}
|
|
783
|
-
catch (error) {
|
|
956
|
+
} catch (error) {
|
|
784
957
|
this.logService.error(`Error while migrating scanned extensions in ${( file.toString())}`, getErrorMessage(error));
|
|
785
958
|
}
|
|
786
|
-
}
|
|
787
|
-
catch (error) {
|
|
959
|
+
} catch (error) {
|
|
788
960
|
if (error.fileOperationResult !== FileOperationResult.FILE_NOT_FOUND) {
|
|
789
961
|
this.logService.error(error);
|
|
790
962
|
}
|
|
@@ -797,13 +969,12 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
797
969
|
}
|
|
798
970
|
async migrateWebExtensions(webExtensions, file) {
|
|
799
971
|
let update = false;
|
|
800
|
-
webExtensions = await Promise.all(( webExtensions.map(async
|
|
972
|
+
webExtensions = await Promise.all(( webExtensions.map(async webExtension => {
|
|
801
973
|
if (!webExtension.manifest) {
|
|
802
974
|
try {
|
|
803
975
|
webExtension.manifest = await this.getExtensionManifest(webExtension.location);
|
|
804
976
|
update = true;
|
|
805
|
-
}
|
|
806
|
-
catch (error) {
|
|
977
|
+
} catch (error) {
|
|
807
978
|
this.logService.error(`Error while updating manifest of an extension in ${( file.toString())}`, webExtension.identifier.id, getErrorMessage(error));
|
|
808
979
|
}
|
|
809
980
|
}
|
|
@@ -813,12 +984,14 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
813
984
|
const content = await this.extensionResourceLoaderService.readExtensionResource(webExtension.fallbackPackageNLSUri);
|
|
814
985
|
webExtension.defaultManifestTranslations = JSON.parse(content);
|
|
815
986
|
update = true;
|
|
987
|
+
} catch (error) {
|
|
988
|
+
this.logService.error(
|
|
989
|
+
`Error while fetching default manifest translations of an extension`,
|
|
990
|
+
webExtension.identifier.id,
|
|
991
|
+
getErrorMessage(error)
|
|
992
|
+
);
|
|
816
993
|
}
|
|
817
|
-
|
|
818
|
-
this.logService.error(`Error while fetching default manifest translations of an extension`, webExtension.identifier.id, getErrorMessage(error));
|
|
819
|
-
}
|
|
820
|
-
}
|
|
821
|
-
else {
|
|
994
|
+
} else {
|
|
822
995
|
update = true;
|
|
823
996
|
webExtension.defaultManifestTranslations = null;
|
|
824
997
|
}
|
|
@@ -870,27 +1043,13 @@ let WebExtensionsScannerService = class WebExtensionsScannerService extends Disp
|
|
|
870
1043
|
return resourceQueue;
|
|
871
1044
|
}
|
|
872
1045
|
};
|
|
873
|
-
WebExtensionsScannerService = ( __decorate([
|
|
874
|
-
( __param(0, IBrowserWorkbenchEnvironmentService)),
|
|
875
|
-
( __param(1, IBuiltinExtensionsScannerService)),
|
|
876
|
-
( __param(2, IFileService)),
|
|
877
|
-
( __param(3, ILogService)),
|
|
878
|
-
( __param(4, IExtensionGalleryService)),
|
|
879
|
-
( __param(5, IExtensionManifestPropertiesService)),
|
|
880
|
-
( __param(6, IExtensionResourceLoaderService)),
|
|
881
|
-
( __param(7, IExtensionStorageService)),
|
|
882
|
-
( __param(8, IStorageService)),
|
|
883
|
-
( __param(9, IProductService)),
|
|
884
|
-
( __param(10, IUserDataProfilesService)),
|
|
885
|
-
( __param(11, IUriIdentityService)),
|
|
886
|
-
( __param(12, ILifecycleService))
|
|
887
|
-
], WebExtensionsScannerService));
|
|
1046
|
+
WebExtensionsScannerService = ( __decorate([( __param(0, IBrowserWorkbenchEnvironmentService)), ( __param(1, IBuiltinExtensionsScannerService)), ( __param(2, IFileService)), ( __param(3, ILogService)), ( __param(4, IExtensionGalleryService)), ( __param(5, IExtensionManifestPropertiesService)), ( __param(6, IExtensionResourceLoaderService)), ( __param(7, IExtensionStorageService)), ( __param(8, IStorageService)), ( __param(9, IProductService)), ( __param(10, IUserDataProfilesService)), ( __param(11, IUriIdentityService)), ( __param(12, ILifecycleService))], WebExtensionsScannerService));
|
|
888
1047
|
if (isWeb) {
|
|
889
1048
|
registerAction2(class extends Action2 {
|
|
890
1049
|
constructor() {
|
|
891
1050
|
super({
|
|
892
|
-
id:
|
|
893
|
-
title: ( localize2(
|
|
1051
|
+
id: "workbench.extensions.action.openInstalledWebExtensionsResource",
|
|
1052
|
+
title: ( localize2(14317, "Open Installed Web Extensions Resource")),
|
|
894
1053
|
category: Categories.Developer,
|
|
895
1054
|
f1: true,
|
|
896
1055
|
precondition: IsWebContext
|
|
@@ -899,7 +1058,9 @@ if (isWeb) {
|
|
|
899
1058
|
run(serviceAccessor) {
|
|
900
1059
|
const editorService = serviceAccessor.get(IEditorService);
|
|
901
1060
|
const userDataProfileService = serviceAccessor.get(IUserDataProfileService);
|
|
902
|
-
editorService.openEditor({
|
|
1061
|
+
editorService.openEditor({
|
|
1062
|
+
resource: userDataProfileService.currentProfile.extensionsResource
|
|
1063
|
+
});
|
|
903
1064
|
}
|
|
904
1065
|
});
|
|
905
1066
|
}
|