@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.
Files changed (45) hide show
  1. package/package.json +10 -2
  2. package/userDataSync.js +19 -16
  3. package/vscode/src/vs/platform/userDataProfile/browser/userDataProfile.js +4 -4
  4. package/vscode/src/vs/platform/userDataProfile/common/userDataProfileStorageService.service.js +5 -0
  5. package/vscode/src/vs/platform/userDataSync/common/extensionsMerge.js +331 -0
  6. package/vscode/src/vs/platform/userDataSync/common/extensionsSync.js +302 -15
  7. package/vscode/src/vs/platform/userDataSync/common/globalStateMerge.js +102 -0
  8. package/vscode/src/vs/platform/userDataSync/common/globalStateSync.js +322 -13
  9. package/vscode/src/vs/platform/userDataSync/common/keybindingsSync.js +9 -8
  10. package/vscode/src/vs/platform/userDataSync/common/settingsSync.js +10 -9
  11. package/vscode/src/vs/platform/userDataSync/common/snippetsSync.js +10 -8
  12. package/vscode/src/vs/platform/userDataSync/common/tasksSync.js +9 -8
  13. package/vscode/src/vs/platform/userDataSync/common/userDataAutoSyncService.js +8 -7
  14. package/vscode/src/vs/platform/userDataSync/common/userDataProfilesManifestSync.js +9 -8
  15. package/vscode/src/vs/platform/userDataSync/common/userDataSyncAccount.js +45 -0
  16. package/vscode/src/vs/platform/userDataSync/common/userDataSyncEnablementService.js +5 -4
  17. package/vscode/src/vs/platform/userDataSync/common/userDataSyncLocalStoreService.js +7 -5
  18. package/vscode/src/vs/platform/userDataSync/common/userDataSyncLog.js +3 -2
  19. package/vscode/src/vs/platform/userDataSync/common/userDataSyncResourceProvider.js +8 -7
  20. package/vscode/src/vs/platform/userDataSync/common/userDataSyncService.js +10 -9
  21. package/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.js +9 -7
  22. package/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSync.js +39 -34
  23. package/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncConflictsView.js +17 -13
  24. package/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncTrigger.js +5 -5
  25. package/vscode/src/vs/workbench/contrib/userDataSync/browser/userDataSyncViews.js +18 -14
  26. package/vscode/src/vs/workbench/services/userData/browser/userDataInit.js +62 -0
  27. package/vscode/src/vs/workbench/services/userDataProfile/browser/extensionsResource.js +6 -5
  28. package/vscode/src/vs/workbench/services/userDataProfile/browser/globalStateResource.js +4 -4
  29. package/vscode/src/vs/workbench/services/userDataProfile/browser/iconSelectBox.js +2 -1
  30. package/vscode/src/vs/workbench/services/userDataProfile/browser/keybindingsResource.js +5 -4
  31. package/vscode/src/vs/workbench/services/userDataProfile/browser/settingsResource.js +6 -5
  32. package/vscode/src/vs/workbench/services/userDataProfile/browser/snippetsResource.js +4 -3
  33. package/vscode/src/vs/workbench/services/userDataProfile/browser/tasksResource.js +5 -4
  34. package/vscode/src/vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService.js +34 -30
  35. package/vscode/src/vs/workbench/services/userDataProfile/browser/userDataProfileInit.js +8 -7
  36. package/vscode/src/vs/workbench/services/userDataProfile/browser/userDataProfileManagement.js +13 -12
  37. package/vscode/src/vs/workbench/services/userDataSync/browser/userDataSyncEnablementService.js +1 -1
  38. package/vscode/src/vs/workbench/services/userDataSync/browser/userDataSyncInit.js +18 -17
  39. package/vscode/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.js +29 -27
  40. package/vscode/src/vs/workbench/services/userDataSync/browser/webUserDataSyncEnablementService.js +1 -1
  41. package/vscode/src/vs/workbench/services/userDataSync/common/userDataSyncUtil.js +2 -1
  42. package/override/vs/platform/dialogs/common/dialogs.js +0 -10
  43. package/override/vs/platform/userDataSync/common/extensionsSync.js +0 -6
  44. package/override/vs/platform/userDataSync/common/globalStateSync.js +0 -7
  45. 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.4.0",
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.4.0"
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 { IUserDataSyncAccountService, UserDataSyncAccountService } from 'vscode/vscode/vs/platform/userDataSync/common/userDataSyncAccount';
5
- import { IUserDataSyncMachinesService, UserDataSyncMachinesService } from 'vscode/vscode/vs/platform/userDataSync/common/userDataSyncMachines';
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 { IUserDataInitializationService, UserDataInitializationService } from 'vscode/vscode/vs/workbench/services/userData/browser/userDataInit';
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,5 @@
1
+ import { createDecorator } from 'vscode/vscode/vs/platform/instantiation/common/instantiation';
2
+
3
+ const IUserDataProfileStorageService = ( createDecorator('IUserDataProfileStorageService'));
4
+
5
+ export { IUserDataProfileStorageService };
@@ -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 };