@codingame/monaco-vscode-user-data-sync-service-override 4.4.0 → 4.5.0-improve-code-splitting.1
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/package.json +10 -2
- package/userDataSync.js +19 -16
- package/vscode/src/vs/platform/userDataProfile/browser/userDataProfile.js +4 -4
- package/vscode/src/vs/platform/userDataProfile/common/userDataProfileStorageService.service.js +5 -0
- package/vscode/src/vs/platform/userDataSync/common/extensionsMerge.js +331 -0
- package/vscode/src/vs/platform/userDataSync/common/extensionsSync.js +302 -15
- package/vscode/src/vs/platform/userDataSync/common/globalStateMerge.js +102 -0
- package/vscode/src/vs/platform/userDataSync/common/globalStateSync.js +322 -13
- package/vscode/src/vs/platform/userDataSync/common/keybindingsSync.js +9 -8
- package/vscode/src/vs/platform/userDataSync/common/settingsSync.js +10 -9
- package/vscode/src/vs/platform/userDataSync/common/snippetsSync.js +10 -8
- package/vscode/src/vs/platform/userDataSync/common/tasksSync.js +9 -8
- package/vscode/src/vs/platform/userDataSync/common/userDataAutoSyncService.js +8 -7
- package/vscode/src/vs/platform/userDataSync/common/userDataProfilesManifestSync.js +9 -8
- package/vscode/src/vs/platform/userDataSync/common/userDataSyncAccount.js +45 -0
- package/vscode/src/vs/platform/userDataSync/common/userDataSyncEnablementService.js +5 -4
- package/vscode/src/vs/platform/userDataSync/common/userDataSyncLocalStoreService.js +7 -5
- package/vscode/src/vs/platform/userDataSync/common/userDataSyncLog.js +3 -2
- package/vscode/src/vs/platform/userDataSync/common/userDataSyncResourceProvider.js +8 -7
- package/vscode/src/vs/platform/userDataSync/common/userDataSyncService.js +10 -9
- package/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.js +9 -7
- package/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSync.js +39 -34
- package/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncConflictsView.js +17 -13
- package/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncTrigger.js +5 -5
- package/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncViews.js +18 -14
- package/vscode/src/vs/workbench/services/userData/browser/userDataInit.js +62 -0
- package/vscode/src/vs/workbench/services/userDataProfile/browser/extensionsResource.js +6 -5
- package/vscode/src/vs/workbench/services/userDataProfile/browser/globalStateResource.js +4 -4
- package/vscode/src/vs/workbench/services/userDataProfile/browser/iconSelectBox.js +2 -1
- package/vscode/src/vs/workbench/services/userDataProfile/browser/keybindingsResource.js +5 -4
- package/vscode/src/vs/workbench/services/userDataProfile/browser/settingsResource.js +6 -5
- package/vscode/src/vs/workbench/services/userDataProfile/browser/snippetsResource.js +4 -3
- package/vscode/src/vs/workbench/services/userDataProfile/browser/tasksResource.js +5 -4
- package/vscode/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.js +34 -30
- package/vscode/src/vs/workbench/services/userDataProfile/browser/userDataProfileInit.js +8 -7
- package/vscode/src/vs/workbench/services/userDataProfile/browser/userDataProfileManagement.js +13 -12
- package/vscode/src/vs/workbench/services/userDataSync/browser/userDataSyncEnablementService.js +1 -1
- package/vscode/src/vs/workbench/services/userDataSync/browser/userDataSyncInit.js +18 -17
- package/vscode/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.js +29 -27
- package/vscode/src/vs/workbench/services/userDataSync/browser/webUserDataSyncEnablementService.js +1 -1
- package/vscode/src/vs/workbench/services/userDataSync/common/userDataSyncUtil.js +2 -1
- package/override/vs/platform/dialogs/common/dialogs.js +0 -10
- package/override/vs/platform/userDataSync/common/extensionsSync.js +0 -6
- package/override/vs/platform/userDataSync/common/globalStateSync.js +0 -7
- package/vscode/src/vs/platform/userDataProfile/common/userDataProfileStorageService.js +0 -10
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codingame/monaco-vscode-user-data-sync-service-override",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.5.0-improve-code-splitting.1",
|
|
4
4
|
"keywords": [],
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "CodinGame",
|
|
@@ -17,7 +17,15 @@
|
|
|
17
17
|
"main": "index.js",
|
|
18
18
|
"module": "index.js",
|
|
19
19
|
"types": "index.d.ts",
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"default": "./index.js"
|
|
23
|
+
},
|
|
24
|
+
"./vscode/*": {
|
|
25
|
+
"default": "./vscode/src/*.js"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
20
28
|
"dependencies": {
|
|
21
|
-
"vscode": "npm:@codingame/monaco-vscode-api@4.
|
|
29
|
+
"vscode": "npm:@codingame/monaco-vscode-api@4.5.0-improve-code-splitting.1"
|
|
22
30
|
}
|
|
23
31
|
}
|
package/userDataSync.js
CHANGED
|
@@ -1,35 +1,38 @@
|
|
|
1
1
|
import { __decorate, __param } from 'vscode/external/tslib/tslib.es6.js';
|
|
2
2
|
import { SyncDescriptor } from 'vscode/vscode/vs/platform/instantiation/common/descriptors';
|
|
3
|
-
import { IUserDataSyncStoreManagementService, IUserDataAutoSyncService, IUserDataSyncStoreService, IUserDataSyncEnablementService, IUserDataSyncService, IUserDataSyncLogService, IUserDataSyncResourceProviderService, IUserDataSyncLocalStoreService, IUserDataSyncUtilService } from 'vscode/vscode/vs/platform/userDataSync/common/userDataSync';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { IUserDataSyncStoreManagementService, IUserDataAutoSyncService, IUserDataSyncStoreService, IUserDataSyncEnablementService, IUserDataSyncService, IUserDataSyncLogService, IUserDataSyncResourceProviderService, IUserDataSyncLocalStoreService, IUserDataSyncUtilService } from 'vscode/vscode/vs/platform/userDataSync/common/userDataSync.service';
|
|
4
|
+
import { UserDataSyncAccountService } from './vscode/src/vs/platform/userDataSync/common/userDataSyncAccount.js';
|
|
5
|
+
import { IUserDataSyncAccountService } from 'vscode/vscode/vs/platform/userDataSync/common/userDataSyncAccount.service';
|
|
6
|
+
import { UserDataSyncMachinesService } from 'vscode/vscode/vs/platform/userDataSync/common/userDataSyncMachines';
|
|
7
|
+
import { IUserDataSyncMachinesService } from 'vscode/vscode/vs/platform/userDataSync/common/userDataSyncMachines.service';
|
|
6
8
|
import { UserDataSyncStoreManagementService, UserDataSyncStoreService } from 'vscode/vscode/vs/platform/userDataSync/common/userDataSyncStoreService';
|
|
7
9
|
import { UserDataAutoSyncService } from './vscode/src/vs/platform/userDataSync/common/userDataAutoSyncService.js';
|
|
8
10
|
import { WebUserDataSyncEnablementService } from './vscode/src/vs/workbench/services/userDataSync/browser/webUserDataSyncEnablementService.js';
|
|
9
11
|
import { UserDataSyncService } from './vscode/src/vs/platform/userDataSync/common/userDataSyncService.js';
|
|
10
12
|
import { UserDataSyncLogService } from './vscode/src/vs/platform/userDataSync/common/userDataSyncLog.js';
|
|
11
13
|
import { BrowserUserDataProfilesService } from './vscode/src/vs/platform/userDataProfile/browser/userDataProfile.js';
|
|
12
|
-
import { IUserDataProfilesService } from 'vscode/vscode/vs/platform/userDataProfile/common/userDataProfile';
|
|
14
|
+
import { IUserDataProfilesService } from 'vscode/vscode/vs/platform/userDataProfile/common/userDataProfile.service';
|
|
13
15
|
import { UserDataSyncResourceProviderService } from './vscode/src/vs/platform/userDataSync/common/userDataSyncResourceProvider.js';
|
|
14
16
|
import { UserDataSyncLocalStoreService } from './vscode/src/vs/platform/userDataSync/common/userDataSyncLocalStoreService.js';
|
|
15
17
|
import { UserDataSyncWorkbenchService } from './vscode/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.js';
|
|
16
|
-
import { IUserDataSyncWorkbenchService } from 'vscode/vscode/vs/workbench/services/userDataSync/common/userDataSync';
|
|
18
|
+
import { IUserDataSyncWorkbenchService } from 'vscode/vscode/vs/workbench/services/userDataSync/common/userDataSync.service';
|
|
17
19
|
import './vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.js';
|
|
18
|
-
import {
|
|
20
|
+
import { UserDataInitializationService } from './vscode/src/vs/workbench/services/userData/browser/userDataInit.js';
|
|
21
|
+
import { IUserDataInitializationService } from 'vscode/vscode/vs/workbench/services/userData/browser/userDataInit.service';
|
|
19
22
|
import { UserDataSyncInitializer } from './vscode/src/vs/workbench/services/userDataSync/browser/userDataSyncInit.js';
|
|
20
23
|
import { UserDataProfileInitializer } from './vscode/src/vs/workbench/services/userDataProfile/browser/userDataProfileInit.js';
|
|
21
|
-
import { IBrowserWorkbenchEnvironmentService } from 'vscode/vscode/vs/workbench/services/environment/browser/environmentService';
|
|
22
|
-
import { ISecretStorageService } from 'vscode/vscode/vs/platform/secrets/common/secrets';
|
|
23
|
-
import { IFileService } from 'vscode/vscode/vs/platform/files/common/files';
|
|
24
|
-
import { IStorageService } from 'vscode/vscode/vs/platform/storage/common/storage';
|
|
25
|
-
import { IProductService } from 'vscode/vscode/vs/platform/product/common/productService';
|
|
26
|
-
import { IRequestService } from 'vscode/vscode/vs/platform/request/common/request';
|
|
27
|
-
import { ILogService } from 'vscode/vscode/vs/platform/log/common/log';
|
|
28
|
-
import { IUriIdentityService } from 'vscode/vscode/vs/platform/uriIdentity/common/uriIdentity';
|
|
29
|
-
import { IUserDataProfileService, IUserDataProfileImportExportService, IUserDataProfileManagementService } from 'vscode/vscode/vs/workbench/services/userDataProfile/common/userDataProfile';
|
|
24
|
+
import { IBrowserWorkbenchEnvironmentService } from 'vscode/vscode/vs/workbench/services/environment/browser/environmentService.service';
|
|
25
|
+
import { ISecretStorageService } from 'vscode/vscode/vs/platform/secrets/common/secrets.service';
|
|
26
|
+
import { IFileService } from 'vscode/vscode/vs/platform/files/common/files.service';
|
|
27
|
+
import { IStorageService } from 'vscode/vscode/vs/platform/storage/common/storage.service';
|
|
28
|
+
import { IProductService } from 'vscode/vscode/vs/platform/product/common/productService.service';
|
|
29
|
+
import { IRequestService } from 'vscode/vscode/vs/platform/request/common/request.service';
|
|
30
|
+
import { ILogService } from 'vscode/vscode/vs/platform/log/common/log.service';
|
|
31
|
+
import { IUriIdentityService } from 'vscode/vscode/vs/platform/uriIdentity/common/uriIdentity.service';
|
|
32
|
+
import { IUserDataProfileService, IUserDataProfileImportExportService, IUserDataProfileManagementService } from 'vscode/vscode/vs/workbench/services/userDataProfile/common/userDataProfile.service';
|
|
30
33
|
import { mark } from 'vscode/vscode/vs/base/common/performance';
|
|
31
34
|
import { timeout } from 'vscode/vscode/vs/base/common/async';
|
|
32
|
-
import { IWorkbenchConfigurationService } from 'vscode/vscode/vs/workbench/services/configuration/common/configuration';
|
|
35
|
+
import { IWorkbenchConfigurationService } from 'vscode/vscode/vs/workbench/services/configuration/common/configuration.service';
|
|
33
36
|
import { UserDataSyncUtilService } from './vscode/src/vs/workbench/services/userDataSync/common/userDataSyncUtil.js';
|
|
34
37
|
import { UserDataProfileImportExportService } from './vscode/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.js';
|
|
35
38
|
import { UserDataProfileManagementService } from './vscode/src/vs/workbench/services/userDataProfile/browser/userDataProfileManagement.js';
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { __decorate, __param } from 'vscode/external/tslib/tslib.es6.js';
|
|
2
2
|
import { BroadcastDataChannel } from 'vscode/vscode/vs/base/browser/broadcast';
|
|
3
3
|
import { revive } from 'vscode/vscode/vs/base/common/marshalling';
|
|
4
|
-
import { IEnvironmentService } from 'vscode/vscode/vs/platform/environment/common/environment';
|
|
5
|
-
import { IFileService } from 'vscode/vscode/vs/platform/files/common/files';
|
|
6
|
-
import { ILogService } from 'vscode/vscode/vs/platform/log/common/log';
|
|
7
|
-
import { IUriIdentityService } from 'vscode/vscode/vs/platform/uriIdentity/common/uriIdentity';
|
|
4
|
+
import { IEnvironmentService } from 'vscode/vscode/vs/platform/environment/common/environment.service';
|
|
5
|
+
import { IFileService } from 'vscode/vscode/vs/platform/files/common/files.service';
|
|
6
|
+
import { ILogService } from 'vscode/vscode/vs/platform/log/common/log.service';
|
|
7
|
+
import { IUriIdentityService } from 'vscode/vscode/vs/platform/uriIdentity/common/uriIdentity.service';
|
|
8
8
|
import { UserDataProfilesService, reviveProfile } from 'vscode/vscode/vs/platform/userDataProfile/common/userDataProfile';
|
|
9
9
|
|
|
10
10
|
let BrowserUserDataProfilesService = class BrowserUserDataProfilesService extends UserDataProfilesService {
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import { deepClone, equals } from 'vscode/vscode/vs/base/common/objects';
|
|
2
|
+
import { semverExports } from 'vscode/external/vscode-semver/semver.js';
|
|
3
|
+
import { assertIsDefined } from 'vscode/vscode/vs/base/common/types';
|
|
4
|
+
|
|
5
|
+
function merge(localExtensions, remoteExtensions, lastSyncExtensions, skippedExtensions, ignoredExtensions, lastSyncBuiltinExtensions) {
|
|
6
|
+
const added = [];
|
|
7
|
+
const removed = [];
|
|
8
|
+
const updated = [];
|
|
9
|
+
if (!remoteExtensions) {
|
|
10
|
+
const remote = localExtensions.filter(({ identifier }) => ignoredExtensions.every(id => id.toLowerCase() !== identifier.id.toLowerCase()));
|
|
11
|
+
return {
|
|
12
|
+
local: {
|
|
13
|
+
added,
|
|
14
|
+
removed,
|
|
15
|
+
updated,
|
|
16
|
+
},
|
|
17
|
+
remote: remote.length > 0 ? {
|
|
18
|
+
added: remote,
|
|
19
|
+
updated: [],
|
|
20
|
+
removed: [],
|
|
21
|
+
all: remote
|
|
22
|
+
} : null
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
localExtensions = ( localExtensions.map(massageIncomingExtension));
|
|
26
|
+
remoteExtensions = ( remoteExtensions.map(massageIncomingExtension));
|
|
27
|
+
lastSyncExtensions = lastSyncExtensions ? ( lastSyncExtensions.map(massageIncomingExtension)) : null;
|
|
28
|
+
const uuids = ( new Map());
|
|
29
|
+
const addUUID = (identifier) => { if (identifier.uuid) {
|
|
30
|
+
uuids.set(identifier.id.toLowerCase(), identifier.uuid);
|
|
31
|
+
} };
|
|
32
|
+
localExtensions.forEach(({ identifier }) => addUUID(identifier));
|
|
33
|
+
remoteExtensions.forEach(({ identifier }) => addUUID(identifier));
|
|
34
|
+
lastSyncExtensions?.forEach(({ identifier }) => addUUID(identifier));
|
|
35
|
+
skippedExtensions?.forEach(({ identifier }) => addUUID(identifier));
|
|
36
|
+
lastSyncBuiltinExtensions?.forEach(identifier => addUUID(identifier));
|
|
37
|
+
const getKey = (extension) => {
|
|
38
|
+
const uuid = extension.identifier.uuid || uuids.get(extension.identifier.id.toLowerCase());
|
|
39
|
+
return uuid ? `uuid:${uuid}` : `id:${extension.identifier.id.toLowerCase()}`;
|
|
40
|
+
};
|
|
41
|
+
const addExtensionToMap = (map, extension) => {
|
|
42
|
+
map.set(getKey(extension), extension);
|
|
43
|
+
return map;
|
|
44
|
+
};
|
|
45
|
+
const localExtensionsMap = localExtensions.reduce(addExtensionToMap, ( new Map()));
|
|
46
|
+
const remoteExtensionsMap = remoteExtensions.reduce(addExtensionToMap, ( new Map()));
|
|
47
|
+
const newRemoteExtensionsMap = remoteExtensions.reduce((map, extension) => addExtensionToMap(map, deepClone(extension)), ( new Map()));
|
|
48
|
+
const lastSyncExtensionsMap = lastSyncExtensions ? lastSyncExtensions.reduce(addExtensionToMap, ( new Map())) : null;
|
|
49
|
+
const skippedExtensionsMap = skippedExtensions.reduce(addExtensionToMap, ( new Map()));
|
|
50
|
+
const ignoredExtensionsSet = ignoredExtensions.reduce((set, id) => {
|
|
51
|
+
const uuid = uuids.get(id.toLowerCase());
|
|
52
|
+
return set.add(uuid ? `uuid:${uuid}` : `id:${id.toLowerCase()}`);
|
|
53
|
+
}, ( new Set()));
|
|
54
|
+
const lastSyncBuiltinExtensionsSet = lastSyncBuiltinExtensions ? lastSyncBuiltinExtensions.reduce((set, { id, uuid }) => {
|
|
55
|
+
uuid = uuid ?? uuids.get(id.toLowerCase());
|
|
56
|
+
return set.add(uuid ? `uuid:${uuid}` : `id:${id.toLowerCase()}`);
|
|
57
|
+
}, ( new Set())) : null;
|
|
58
|
+
const localToRemote = compare(localExtensionsMap, remoteExtensionsMap, ignoredExtensionsSet, false);
|
|
59
|
+
if (localToRemote.added.size > 0 || localToRemote.removed.size > 0 || localToRemote.updated.size > 0) {
|
|
60
|
+
const baseToLocal = compare(lastSyncExtensionsMap, localExtensionsMap, ignoredExtensionsSet, false);
|
|
61
|
+
const baseToRemote = compare(lastSyncExtensionsMap, remoteExtensionsMap, ignoredExtensionsSet, true);
|
|
62
|
+
const merge = (key, localExtension, remoteExtension, preferred) => {
|
|
63
|
+
let pinned, version, preRelease;
|
|
64
|
+
if (localExtension.installed) {
|
|
65
|
+
pinned = preferred.pinned;
|
|
66
|
+
preRelease = preferred.preRelease;
|
|
67
|
+
if (pinned) {
|
|
68
|
+
version = preferred.version;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
pinned = remoteExtension.pinned;
|
|
73
|
+
preRelease = remoteExtension.preRelease;
|
|
74
|
+
if (pinned) {
|
|
75
|
+
version = remoteExtension.version;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (pinned === undefined ) {
|
|
79
|
+
pinned = localExtension.pinned;
|
|
80
|
+
if (pinned) {
|
|
81
|
+
version = localExtension.version;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (preRelease === undefined ) {
|
|
85
|
+
preRelease = localExtension.preRelease;
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
...preferred,
|
|
89
|
+
installed: localExtension.installed || remoteExtension.installed,
|
|
90
|
+
pinned,
|
|
91
|
+
preRelease,
|
|
92
|
+
version: version ?? (remoteExtension.version && (!localExtension.installed || semverExports.gt(remoteExtension.version, localExtension.version)) ? remoteExtension.version : localExtension.version),
|
|
93
|
+
state: mergeExtensionState(localExtension, remoteExtension, lastSyncExtensionsMap?.get(key)),
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
for (const key of ( baseToRemote.removed.values())) {
|
|
97
|
+
const localExtension = localExtensionsMap.get(key);
|
|
98
|
+
if (!localExtension) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const baseExtension = assertIsDefined(lastSyncExtensionsMap?.get(key));
|
|
102
|
+
const wasAnInstalledExtensionDuringLastSync = lastSyncBuiltinExtensionsSet && !( lastSyncBuiltinExtensionsSet.has(key)) && baseExtension.installed;
|
|
103
|
+
if (localExtension.installed && wasAnInstalledExtensionDuringLastSync ) {
|
|
104
|
+
removed.push(localExtension.identifier);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
newRemoteExtensionsMap.set(key, localExtension);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
for (const key of ( baseToRemote.added.values())) {
|
|
111
|
+
const remoteExtension = assertIsDefined(remoteExtensionsMap.get(key));
|
|
112
|
+
const localExtension = localExtensionsMap.get(key);
|
|
113
|
+
if (localExtension) {
|
|
114
|
+
if (( localToRemote.updated.has(key))) {
|
|
115
|
+
const mergedExtension = merge(key, localExtension, remoteExtension, remoteExtension);
|
|
116
|
+
if (!areSame(localExtension, remoteExtension, false, false)) {
|
|
117
|
+
updated.push(massageOutgoingExtension(mergedExtension, key));
|
|
118
|
+
}
|
|
119
|
+
newRemoteExtensionsMap.set(key, mergedExtension);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
if (remoteExtension.installed) {
|
|
124
|
+
added.push(massageOutgoingExtension(remoteExtension, key));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
for (const key of ( baseToRemote.updated.values())) {
|
|
129
|
+
const remoteExtension = assertIsDefined(remoteExtensionsMap.get(key));
|
|
130
|
+
const baseExtension = assertIsDefined(lastSyncExtensionsMap?.get(key));
|
|
131
|
+
const localExtension = localExtensionsMap.get(key);
|
|
132
|
+
if (localExtension) {
|
|
133
|
+
const wasAnInstalledExtensionDuringLastSync = lastSyncBuiltinExtensionsSet && !( lastSyncBuiltinExtensionsSet.has(key)) && baseExtension.installed;
|
|
134
|
+
if (wasAnInstalledExtensionDuringLastSync && localExtension.installed && !remoteExtension.installed) {
|
|
135
|
+
removed.push(localExtension.identifier);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
const mergedExtension = merge(key, localExtension, remoteExtension, remoteExtension);
|
|
139
|
+
updated.push(massageOutgoingExtension(mergedExtension, key));
|
|
140
|
+
newRemoteExtensionsMap.set(key, mergedExtension);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
else if (remoteExtension.installed) {
|
|
144
|
+
added.push(massageOutgoingExtension(remoteExtension, key));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
for (const key of ( baseToLocal.added.values())) {
|
|
148
|
+
if (( baseToRemote.added.has(key))) {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
newRemoteExtensionsMap.set(key, assertIsDefined(localExtensionsMap.get(key)));
|
|
152
|
+
}
|
|
153
|
+
for (const key of ( baseToLocal.updated.values())) {
|
|
154
|
+
if (( baseToRemote.removed.has(key))) {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if (( baseToRemote.updated.has(key))) {
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const localExtension = assertIsDefined(localExtensionsMap.get(key));
|
|
161
|
+
const remoteExtension = assertIsDefined(remoteExtensionsMap.get(key));
|
|
162
|
+
newRemoteExtensionsMap.set(key, merge(key, localExtension, remoteExtension, localExtension));
|
|
163
|
+
}
|
|
164
|
+
for (const key of ( baseToLocal.removed.values())) {
|
|
165
|
+
if (( baseToRemote.updated.has(key))) {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
if (( baseToRemote.removed.has(key))) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
if (( skippedExtensionsMap.has(key))) {
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
if (!assertIsDefined(remoteExtensionsMap.get(key)).installed) {
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
if (!lastSyncBuiltinExtensionsSet) {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
if (( lastSyncBuiltinExtensionsSet.has(key)) || !assertIsDefined(lastSyncExtensionsMap?.get(key)).installed) {
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
newRemoteExtensionsMap.delete(key);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const remote = [];
|
|
187
|
+
const remoteChanges = compare(remoteExtensionsMap, newRemoteExtensionsMap, ( new Set()), true);
|
|
188
|
+
const hasRemoteChanges = remoteChanges.added.size > 0 || remoteChanges.updated.size > 0 || remoteChanges.removed.size > 0;
|
|
189
|
+
if (hasRemoteChanges) {
|
|
190
|
+
newRemoteExtensionsMap.forEach((value, key) => remote.push(massageOutgoingExtension(value, key)));
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
local: { added, removed, updated },
|
|
194
|
+
remote: hasRemoteChanges ? {
|
|
195
|
+
added: ( [...remoteChanges.added].map(id => newRemoteExtensionsMap.get(id))),
|
|
196
|
+
updated: ( [...remoteChanges.updated].map(id => newRemoteExtensionsMap.get(id))),
|
|
197
|
+
removed: ( [...remoteChanges.removed].map(id => remoteExtensionsMap.get(id))),
|
|
198
|
+
all: remote
|
|
199
|
+
} : null
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
function compare(from, to, ignoredExtensions, checkVersionProperty) {
|
|
203
|
+
const fromKeys = from ? [...( from.keys())].filter(key => !( ignoredExtensions.has(key))) : [];
|
|
204
|
+
const toKeys = [...( to.keys())].filter(key => !( ignoredExtensions.has(key)));
|
|
205
|
+
const added = toKeys.filter(key => !fromKeys.includes(key)).reduce((r, key) => { r.add(key); return r; }, ( new Set()));
|
|
206
|
+
const removed = fromKeys.filter(key => !toKeys.includes(key)).reduce((r, key) => { r.add(key); return r; }, ( new Set()));
|
|
207
|
+
const updated = ( new Set());
|
|
208
|
+
for (const key of fromKeys) {
|
|
209
|
+
if (( removed.has(key))) {
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
const fromExtension = from.get(key);
|
|
213
|
+
const toExtension = to.get(key);
|
|
214
|
+
if (!toExtension || !areSame(fromExtension, toExtension, checkVersionProperty, true)) {
|
|
215
|
+
updated.add(key);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return { added, removed, updated };
|
|
219
|
+
}
|
|
220
|
+
function areSame(fromExtension, toExtension, checkVersionProperty, checkInstalledProperty) {
|
|
221
|
+
if (fromExtension.disabled !== toExtension.disabled) {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
if (!!fromExtension.isApplicationScoped !== !!toExtension.isApplicationScoped) {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
if (checkInstalledProperty && fromExtension.installed !== toExtension.installed) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
if (fromExtension.installed && toExtension.installed) {
|
|
231
|
+
if (fromExtension.preRelease !== toExtension.preRelease) {
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
if (fromExtension.pinned !== toExtension.pinned) {
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
if (toExtension.pinned && fromExtension.version !== toExtension.version) {
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (!isSameExtensionState(fromExtension.state, toExtension.state)) {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
if ((checkVersionProperty && fromExtension.version !== toExtension.version)) {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
function mergeExtensionState(localExtension, remoteExtension, lastSyncExtension) {
|
|
250
|
+
const localState = localExtension.state;
|
|
251
|
+
const remoteState = remoteExtension.state;
|
|
252
|
+
const baseState = lastSyncExtension?.state;
|
|
253
|
+
if (!remoteExtension.version) {
|
|
254
|
+
return localState;
|
|
255
|
+
}
|
|
256
|
+
if (localState && semverExports.gt(localExtension.version, remoteExtension.version)) {
|
|
257
|
+
return localState;
|
|
258
|
+
}
|
|
259
|
+
if (remoteState && semverExports.gt(remoteExtension.version, localExtension.version)) {
|
|
260
|
+
return remoteState;
|
|
261
|
+
}
|
|
262
|
+
if (!localState) {
|
|
263
|
+
return remoteState;
|
|
264
|
+
}
|
|
265
|
+
if (!remoteState) {
|
|
266
|
+
return localState;
|
|
267
|
+
}
|
|
268
|
+
const mergedState = deepClone(localState);
|
|
269
|
+
const baseToRemote = baseState ? compareExtensionState(baseState, remoteState) : { added: ( Object.keys(remoteState)).reduce((r, k) => { r.add(k); return r; }, ( new Set())), removed: ( new Set()), updated: ( new Set()) };
|
|
270
|
+
const baseToLocal = baseState ? compareExtensionState(baseState, localState) : { added: ( Object.keys(localState)).reduce((r, k) => { r.add(k); return r; }, ( new Set())), removed: ( new Set()), updated: ( new Set()) };
|
|
271
|
+
for (const key of [...( baseToRemote.added.values()), ...( baseToRemote.updated.values())]) {
|
|
272
|
+
mergedState[key] = remoteState[key];
|
|
273
|
+
}
|
|
274
|
+
for (const key of ( baseToRemote.removed.values())) {
|
|
275
|
+
if (!( baseToLocal.updated.has(key))) {
|
|
276
|
+
delete mergedState[key];
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return mergedState;
|
|
280
|
+
}
|
|
281
|
+
function compareExtensionState(from, to) {
|
|
282
|
+
const fromKeys = ( Object.keys(from));
|
|
283
|
+
const toKeys = ( Object.keys(to));
|
|
284
|
+
const added = toKeys.filter(key => !fromKeys.includes(key)).reduce((r, key) => { r.add(key); return r; }, ( new Set()));
|
|
285
|
+
const removed = fromKeys.filter(key => !toKeys.includes(key)).reduce((r, key) => { r.add(key); return r; }, ( new Set()));
|
|
286
|
+
const updated = ( new Set());
|
|
287
|
+
for (const key of fromKeys) {
|
|
288
|
+
if (( removed.has(key))) {
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
const value1 = from[key];
|
|
292
|
+
const value2 = to[key];
|
|
293
|
+
if (!equals(value1, value2)) {
|
|
294
|
+
updated.add(key);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return { added, removed, updated };
|
|
298
|
+
}
|
|
299
|
+
function isSameExtensionState(a = {}, b = {}) {
|
|
300
|
+
const { added, removed, updated } = compareExtensionState(a, b);
|
|
301
|
+
return added.size === 0 && removed.size === 0 && updated.size === 0;
|
|
302
|
+
}
|
|
303
|
+
function massageIncomingExtension(extension) {
|
|
304
|
+
return { ...extension, ...{ disabled: !!extension.disabled, installed: !!extension.installed } };
|
|
305
|
+
}
|
|
306
|
+
function massageOutgoingExtension(extension, key) {
|
|
307
|
+
const massagedExtension = {
|
|
308
|
+
...extension,
|
|
309
|
+
identifier: {
|
|
310
|
+
id: extension.identifier.id,
|
|
311
|
+
uuid: key.startsWith('uuid:') ? key.substring('uuid:'.length) : undefined
|
|
312
|
+
},
|
|
313
|
+
preRelease: !!extension.preRelease,
|
|
314
|
+
pinned: !!extension.pinned,
|
|
315
|
+
};
|
|
316
|
+
if (!extension.disabled) {
|
|
317
|
+
delete massagedExtension.disabled;
|
|
318
|
+
}
|
|
319
|
+
if (!extension.installed) {
|
|
320
|
+
delete massagedExtension.installed;
|
|
321
|
+
}
|
|
322
|
+
if (!extension.state) {
|
|
323
|
+
delete massagedExtension.state;
|
|
324
|
+
}
|
|
325
|
+
if (!extension.isApplicationScoped) {
|
|
326
|
+
delete massagedExtension.isApplicationScoped;
|
|
327
|
+
}
|
|
328
|
+
return massagedExtension;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export { merge };
|