5
5
6
6
import { distinct , flatten } from 'vs/base/common/arrays' ;
7
7
import { Emitter , Event } from 'vs/base/common/event' ;
8
- import { parse } from 'vs/base/common/json' ;
8
+ import { JSONPath , parse } from 'vs/base/common/json' ;
9
9
import { Disposable } from 'vs/base/common/lifecycle' ;
10
10
import { getIconClasses } from 'vs/editor/common/services/getIconClasses' ;
11
11
import { FileKind , IFileService } from 'vs/platform/files/common/files' ;
@@ -145,12 +145,20 @@ export class WorkspaceExtensionsConfigService extends Disposable implements IWor
145
145
private async addOrRemoveWorkspaceFolderRecommendation ( extensionId : string , workspaceFolder : IWorkspaceFolder , extensionsConfigContent : IExtensionsConfigContent , add : boolean ) : Promise < void > {
146
146
const values : IJSONValue [ ] = [ ] ;
147
147
if ( add ) {
148
- values . push ( { path : [ 'recommendations' ] , value : [ ...extensionsConfigContent . recommendations || [ ] , extensionId ] } ) ;
149
- if ( extensionsConfigContent . unwantedRecommendations && extensionsConfigContent . unwantedRecommendations . some ( e => e === extensionId ) ) {
150
- values . push ( { path : [ 'unwantedRecommendations' ] , value : extensionsConfigContent . unwantedRecommendations . filter ( e => e !== extensionId ) } ) ;
148
+ if ( Array . isArray ( extensionsConfigContent . recommendations ) ) {
149
+ values . push ( { path : [ 'recommendations' , - 1 ] , value : extensionId } ) ;
150
+ } else {
151
+ values . push ( { path : [ 'recommendations' ] , value : [ extensionId ] } ) ;
152
+ }
153
+ const unwantedRecommendationEdit = this . getEditToRemoveValueFromArray ( [ 'unwantedRecommendations' ] , extensionsConfigContent . unwantedRecommendations , extensionId ) ;
154
+ if ( unwantedRecommendationEdit ) {
155
+ values . push ( unwantedRecommendationEdit ) ;
151
156
}
152
157
} else if ( extensionsConfigContent . recommendations ) {
153
- values . push ( { path : [ 'recommendations' ] , value : extensionsConfigContent . recommendations . filter ( e => e !== extensionId ) } ) ;
158
+ const recommendationEdit = this . getEditToRemoveValueFromArray ( [ 'recommendations' ] , extensionsConfigContent . recommendations , extensionId ) ;
159
+ if ( recommendationEdit ) {
160
+ values . push ( recommendationEdit ) ;
161
+ }
154
162
}
155
163
156
164
if ( values . length ) {
@@ -162,12 +170,21 @@ export class WorkspaceExtensionsConfigService extends Disposable implements IWor
162
170
const values : IJSONValue [ ] = [ ] ;
163
171
if ( extensionsConfigContent ) {
164
172
if ( add ) {
165
- values . push ( { path : [ 'extensions' , 'recommendations' ] , value : [ ...extensionsConfigContent . recommendations || [ ] , extensionId ] } ) ;
166
- if ( extensionsConfigContent . unwantedRecommendations && extensionsConfigContent . unwantedRecommendations . some ( e => e === extensionId ) ) {
167
- values . push ( { path : [ 'extensions' , 'unwantedRecommendations' ] , value : extensionsConfigContent . unwantedRecommendations . filter ( e => e !== extensionId ) } ) ;
173
+ const path : JSONPath = [ 'extensions' , 'recommendations' ] ;
174
+ if ( Array . isArray ( extensionsConfigContent . recommendations ) ) {
175
+ values . push ( { path : [ ...path , - 1 ] , value : extensionId } ) ;
176
+ } else {
177
+ values . push ( { path, value : [ extensionId ] } ) ;
178
+ }
179
+ const unwantedRecommendationEdit = this . getEditToRemoveValueFromArray ( [ 'extensions' , 'unwantedRecommendations' ] , extensionsConfigContent . unwantedRecommendations , extensionId ) ;
180
+ if ( unwantedRecommendationEdit ) {
181
+ values . push ( unwantedRecommendationEdit ) ;
168
182
}
169
183
} else if ( extensionsConfigContent . recommendations ) {
170
- values . push ( { path : [ 'extensions' , 'recommendations' ] , value : extensionsConfigContent . recommendations . filter ( e => e !== extensionId ) } ) ;
184
+ const recommendationEdit = this . getEditToRemoveValueFromArray ( [ 'extensions' , 'recommendations' ] , extensionsConfigContent . recommendations , extensionId ) ;
185
+ if ( recommendationEdit ) {
186
+ values . push ( recommendationEdit ) ;
187
+ }
171
188
}
172
189
} else if ( add ) {
173
190
values . push ( { path : [ 'extensions' ] , value : { recommendations : [ extensionId ] } } ) ;
@@ -181,12 +198,21 @@ export class WorkspaceExtensionsConfigService extends Disposable implements IWor
181
198
private async addOrRemoveWorkspaceFolderUnwantedRecommendation ( extensionId : string , workspaceFolder : IWorkspaceFolder , extensionsConfigContent : IExtensionsConfigContent , add : boolean ) : Promise < void > {
182
199
const values : IJSONValue [ ] = [ ] ;
183
200
if ( add ) {
184
- values . push ( { path : [ 'unwantedRecommendations' ] , value : [ ...extensionsConfigContent . unwantedRecommendations || [ ] , extensionId ] } ) ;
185
- if ( extensionsConfigContent . recommendations && extensionsConfigContent . recommendations . some ( e => e === extensionId ) ) {
186
- values . push ( { path : [ 'recommendations' ] , value : extensionsConfigContent . recommendations . filter ( e => e !== extensionId ) } ) ;
201
+ const path : JSONPath = [ 'unwantedRecommendations' ] ;
202
+ if ( Array . isArray ( extensionsConfigContent . unwantedRecommendations ) ) {
203
+ values . push ( { path : [ ...path , - 1 ] , value : extensionId } ) ;
204
+ } else {
205
+ values . push ( { path, value : [ extensionId ] } ) ;
206
+ }
207
+ const recommendationEdit = this . getEditToRemoveValueFromArray ( [ 'recommendations' ] , extensionsConfigContent . recommendations , extensionId ) ;
208
+ if ( recommendationEdit ) {
209
+ values . push ( recommendationEdit ) ;
187
210
}
188
211
} else if ( extensionsConfigContent . unwantedRecommendations ) {
189
- values . push ( { path : [ 'unwantedRecommendations' ] , value : extensionsConfigContent . unwantedRecommendations . filter ( e => e !== extensionId ) } ) ;
212
+ const unwantedRecommendationEdit = this . getEditToRemoveValueFromArray ( [ 'unwantedRecommendations' ] , extensionsConfigContent . unwantedRecommendations , extensionId ) ;
213
+ if ( unwantedRecommendationEdit ) {
214
+ values . push ( unwantedRecommendationEdit ) ;
215
+ }
190
216
}
191
217
if ( values . length ) {
192
218
return this . jsonEditingService . write ( workspaceFolder . toResource ( EXTENSIONS_CONFIG ) , values , true ) ;
@@ -197,12 +223,21 @@ export class WorkspaceExtensionsConfigService extends Disposable implements IWor
197
223
const values : IJSONValue [ ] = [ ] ;
198
224
if ( extensionsConfigContent ) {
199
225
if ( add ) {
200
- values . push ( { path : [ 'extensions' , 'unwantedRecommendations' ] , value : [ ...extensionsConfigContent . unwantedRecommendations || [ ] , extensionId ] } ) ;
201
- if ( extensionsConfigContent . recommendations && extensionsConfigContent . recommendations . some ( e => e === extensionId ) ) {
202
- values . push ( { path : [ 'extensions' , 'recommendations' ] , value : extensionsConfigContent . recommendations . filter ( e => e !== extensionId ) } ) ;
226
+ const path : JSONPath = [ 'extensions' , 'unwantedRecommendations' ] ;
227
+ if ( Array . isArray ( extensionsConfigContent . recommendations ) ) {
228
+ values . push ( { path : [ ...path , - 1 ] , value : extensionId } ) ;
229
+ } else {
230
+ values . push ( { path, value : [ extensionId ] } ) ;
231
+ }
232
+ const recommendationEdit = this . getEditToRemoveValueFromArray ( [ 'extensions' , 'recommendations' ] , extensionsConfigContent . recommendations , extensionId ) ;
233
+ if ( recommendationEdit ) {
234
+ values . push ( recommendationEdit ) ;
203
235
}
204
236
} else if ( extensionsConfigContent . unwantedRecommendations ) {
205
- values . push ( { path : [ 'extensions' , 'unwantedRecommendations' ] , value : extensionsConfigContent . unwantedRecommendations . filter ( e => e !== extensionId ) } ) ;
237
+ const unwantedRecommendationEdit = this . getEditToRemoveValueFromArray ( [ 'extensions' , 'unwantedRecommendations' ] , extensionsConfigContent . unwantedRecommendations , extensionId ) ;
238
+ if ( unwantedRecommendationEdit ) {
239
+ values . push ( unwantedRecommendationEdit ) ;
240
+ }
206
241
}
207
242
} else if ( add ) {
208
243
values . push ( { path : [ 'extensions' ] , value : { unwantedRecommendations : [ extensionId ] } } ) ;
@@ -265,6 +300,14 @@ export class WorkspaceExtensionsConfigService extends Disposable implements IWor
265
300
} ;
266
301
}
267
302
303
+ private getEditToRemoveValueFromArray ( path : JSONPath , array : string [ ] | undefined , value : string ) : IJSONValue | undefined {
304
+ const index = array ?. indexOf ( value ) ;
305
+ if ( index !== undefined && index !== - 1 ) {
306
+ return { path : [ ...path , index ] , value : undefined } ;
307
+ }
308
+ return undefined ;
309
+ }
310
+
268
311
}
269
312
270
313
registerSingleton ( IWorkspaceExtensionsConfigService , WorkspaceExtensionsConfigService , InstantiationType . Delayed ) ;
0 commit comments