@theia/vsx-registry 1.45.1 → 1.46.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 (30) hide show
  1. package/lib/browser/vsx-extension.d.ts +3 -0
  2. package/lib/browser/vsx-extension.d.ts.map +1 -1
  3. package/lib/browser/vsx-extension.js +28 -8
  4. package/lib/browser/vsx-extension.js.map +1 -1
  5. package/lib/browser/vsx-extensions-contribution.d.ts.map +1 -1
  6. package/lib/browser/vsx-extensions-contribution.js +5 -0
  7. package/lib/browser/vsx-extensions-contribution.js.map +1 -1
  8. package/lib/browser/vsx-extensions-model.d.ts +4 -1
  9. package/lib/browser/vsx-extensions-model.d.ts.map +1 -1
  10. package/lib/browser/vsx-extensions-model.js +59 -13
  11. package/lib/browser/vsx-extensions-model.js.map +1 -1
  12. package/lib/browser/vsx-extensions-preferences.d.ts +12 -0
  13. package/lib/browser/vsx-extensions-preferences.d.ts.map +1 -0
  14. package/lib/browser/vsx-extensions-preferences.js +47 -0
  15. package/lib/browser/vsx-extensions-preferences.js.map +1 -0
  16. package/lib/browser/vsx-extensions-search-bar.d.ts +10 -2
  17. package/lib/browser/vsx-extensions-search-bar.d.ts.map +1 -1
  18. package/lib/browser/vsx-extensions-search-bar.js +35 -4
  19. package/lib/browser/vsx-extensions-search-bar.js.map +1 -1
  20. package/lib/browser/vsx-registry-frontend-module.d.ts.map +1 -1
  21. package/lib/browser/vsx-registry-frontend-module.js +2 -0
  22. package/lib/browser/vsx-registry-frontend-module.js.map +1 -1
  23. package/package.json +10 -10
  24. package/src/browser/style/index.css +65 -2
  25. package/src/browser/vsx-extension.tsx +39 -10
  26. package/src/browser/vsx-extensions-contribution.ts +6 -0
  27. package/src/browser/vsx-extensions-model.ts +61 -14
  28. package/src/browser/vsx-extensions-preferences.ts +58 -0
  29. package/src/browser/vsx-extensions-search-bar.tsx +52 -14
  30. package/src/browser/vsx-registry-frontend-module.ts +2 -0
@@ -28,26 +28,49 @@ exports.VSXExtensionsSearchBar = void 0;
28
28
  const React = require("@theia/core/shared/react");
29
29
  const inversify_1 = require("@theia/core/shared/inversify");
30
30
  const widgets_1 = require("@theia/core/lib/browser/widgets");
31
+ const browser_1 = require("@theia/core/lib/browser");
31
32
  const vsx_extensions_search_model_1 = require("./vsx-extensions-search-model");
33
+ const vsx_extensions_model_1 = require("./vsx-extensions-model");
32
34
  const nls_1 = require("@theia/core/lib/common/nls");
33
35
  let VSXExtensionsSearchBar = class VSXExtensionsSearchBar extends widgets_1.ReactWidget {
34
36
  constructor() {
35
37
  super(...arguments);
36
- this.updateQuery = (e) => this.model.query = e.target.value;
38
+ this.updateQuery = (e) => this.searchModel.query = e.target.value;
37
39
  }
38
40
  init() {
41
+ this.onlyShowVerifiedExtensions = this.preferenceService.get('extensions.onlyShowVerifiedExtensions');
39
42
  this.id = 'vsx-extensions-search-bar';
40
43
  this.addClass('theia-vsx-extensions-search-bar');
41
- this.model.onDidChangeQuery((query) => this.updateSearchTerm(query));
44
+ this.searchModel.onDidChangeQuery((query) => this.updateSearchTerm(query));
45
+ this.preferenceService.onPreferenceChanged(change => {
46
+ if (change.preferenceName === 'extensions.onlyShowVerifiedExtensions') {
47
+ this.extensionsModel.setOnlyShowVerifiedExtensions(!!change.newValue);
48
+ this.onlyShowVerifiedExtensions = change.newValue;
49
+ this.update();
50
+ }
51
+ });
42
52
  }
43
53
  render() {
44
- return React.createElement("input", { type: 'text', ref: input => this.input = input || undefined, defaultValue: this.model.query, spellCheck: false, className: 'theia-input', placeholder: nls_1.nls.localize('theia/vsx-registry/searchPlaceholder', 'Search Extensions in {0}', 'Open VSX Registry'), onChange: this.updateQuery });
54
+ return React.createElement("div", { className: 'vsx-search-container' },
55
+ React.createElement("input", { type: 'text', ref: input => this.input = input || undefined, defaultValue: this.searchModel.query, spellCheck: false, className: 'theia-input', placeholder: nls_1.nls.localize('theia/vsx-registry/searchPlaceholder', 'Search Extensions in {0}', 'Open VSX Registry'), onChange: this.updateQuery }),
56
+ this.renderOptionContainer());
45
57
  }
46
58
  updateSearchTerm(term) {
47
59
  if (this.input) {
48
60
  this.input.value = term;
49
61
  }
50
62
  }
63
+ renderOptionContainer() {
64
+ const showVerifiedExtensions = this.renderShowVerifiedExtensions();
65
+ return React.createElement("div", { className: 'option-buttons' }, showVerifiedExtensions);
66
+ }
67
+ renderShowVerifiedExtensions() {
68
+ return React.createElement("span", { className: `${(0, widgets_1.codicon)('verified')} option action-label ${this.onlyShowVerifiedExtensions ? 'enabled' : ''}`, title: nls_1.nls.localize('theia/vsx-registry/onlyShowVerifiedExtensionsTitle', 'Only Show Verified Extensions'), onClick: () => this.handleShowVerifiedExtensionsClick() });
69
+ }
70
+ handleShowVerifiedExtensionsClick() {
71
+ this.extensionsModel.setOnlyShowVerifiedExtensions(!this.onlyShowVerifiedExtensions);
72
+ this.update();
73
+ }
51
74
  onActivateRequest(msg) {
52
75
  super.onActivateRequest(msg);
53
76
  if (this.input) {
@@ -59,10 +82,18 @@ let VSXExtensionsSearchBar = class VSXExtensionsSearchBar extends widgets_1.Reac
59
82
  this.update();
60
83
  }
61
84
  };
85
+ __decorate([
86
+ (0, inversify_1.inject)(vsx_extensions_model_1.VSXExtensionsModel),
87
+ __metadata("design:type", vsx_extensions_model_1.VSXExtensionsModel)
88
+ ], VSXExtensionsSearchBar.prototype, "extensionsModel", void 0);
62
89
  __decorate([
63
90
  (0, inversify_1.inject)(vsx_extensions_search_model_1.VSXExtensionsSearchModel),
64
91
  __metadata("design:type", vsx_extensions_search_model_1.VSXExtensionsSearchModel)
65
- ], VSXExtensionsSearchBar.prototype, "model", void 0);
92
+ ], VSXExtensionsSearchBar.prototype, "searchModel", void 0);
93
+ __decorate([
94
+ (0, inversify_1.inject)(browser_1.PreferenceService),
95
+ __metadata("design:type", Object)
96
+ ], VSXExtensionsSearchBar.prototype, "preferenceService", void 0);
66
97
  __decorate([
67
98
  (0, inversify_1.postConstruct)(),
68
99
  __metadata("design:type", Function),
@@ -1 +1 @@
1
- {"version":3,"file":"vsx-extensions-search-bar.js","sourceRoot":"","sources":["../../src/browser/vsx-extensions-search-bar.tsx"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;;;;;;;;;AAEhF,kDAAkD;AAClD,4DAAiF;AACjF,6DAAuE;AACvE,+EAAyE;AACzE,oDAAiD;AAGjD,IAAa,sBAAsB,GAAnC,MAAa,sBAAuB,SAAQ,qBAAW;IAAvD;;QAyBc,gBAAW,GAAG,CAAC,CAAsC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IAoB1G,CAAC;IAvCa,IAAI;QACV,IAAI,CAAC,EAAE,GAAG,2BAA2B,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IACjF,CAAC;IAIS,MAAM;QACZ,OAAO,+BAAO,IAAI,EAAC,MAAM,EACrB,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,SAAS,EAC7C,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAC9B,UAAU,EAAE,KAAK,EACjB,SAAS,EAAC,aAAa,EACvB,WAAW,EAAE,SAAG,CAAC,QAAQ,CAAC,sCAAsC,EAAE,0BAA0B,EAAE,mBAAmB,CAAC,EAClH,QAAQ,EAAE,IAAI,CAAC,WAAW,GACtB,CAAC;IACb,CAAC;IAIS,gBAAgB,CAAC,IAAY;QACnC,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;SAC3B;IACL,CAAC;IAEkB,iBAAiB,CAAC,GAAY;QAC7C,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;SACtB;IACL,CAAC;IAEkB,aAAa,CAAC,GAAY;QACzC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;CAEJ,CAAA;AA1CG;IADC,IAAA,kBAAM,EAAC,sDAAwB,CAAC;8BACP,sDAAwB;qDAAC;AAGnD;IADC,IAAA,yBAAa,GAAE;;;;kDAKf;AAVQ,sBAAsB;IADlC,IAAA,sBAAU,GAAE;GACA,sBAAsB,CA6ClC;AA7CY,wDAAsB"}
1
+ {"version":3,"file":"vsx-extensions-search-bar.js","sourceRoot":"","sources":["../../src/browser/vsx-extensions-search-bar.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"vsx-registry-frontend-module.d.ts","sourceRoot":"","sources":["../../src/browser/vsx-registry-frontend-module.ts"],"names":[],"mappings":"AAgBA,OAAO,mCAAmC,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;;AAqB/D,wBAkEG"}
1
+ {"version":3,"file":"vsx-registry-frontend-module.d.ts","sourceRoot":"","sources":["../../src/browser/vsx-registry-frontend-module.ts"],"names":[],"mappings":"AAgBA,OAAO,mCAAmC,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;;AAsB/D,wBAmEG"}
@@ -31,6 +31,7 @@ const vsx_extensions_source_1 = require("./vsx-extensions-source");
31
31
  const vsx_extensions_search_model_1 = require("./vsx-extensions-search-model");
32
32
  const recommended_extensions_preference_contribution_1 = require("./recommended-extensions/recommended-extensions-preference-contribution");
33
33
  const preference_provider_overrides_1 = require("./recommended-extensions/preference-provider-overrides");
34
+ const vsx_extensions_preferences_1 = require("./vsx-extensions-preferences");
34
35
  const vsx_environment_1 = require("../common/vsx-environment");
35
36
  const language_quick_pick_service_1 = require("@theia/core/lib/browser/i18n/language-quick-pick-service");
36
37
  const vsx_language_quick_pick_service_1 = require("./vsx-language-quick-pick-service");
@@ -94,5 +95,6 @@ exports.default = new inversify_1.ContainerModule((bind, unbind, isBound, rebind
94
95
  bind(color_application_contribution_1.ColorContribution).toService(vsx_extensions_contribution_1.VSXExtensionsContribution);
95
96
  (0, recommended_extensions_preference_contribution_1.bindExtensionPreferences)(bind);
96
97
  (0, preference_provider_overrides_1.bindPreferenceProviderOverrides)(bind, unbind);
98
+ (0, vsx_extensions_preferences_1.bindVsxExtensionsPreferences)(bind);
97
99
  });
98
100
  //# sourceMappingURL=vsx-registry-frontend-module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vsx-registry-frontend-module.js","sourceRoot":"","sources":["../../src/browser/vsx-registry-frontend-module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vsx-registry-frontend-module.js","sourceRoot":"","sources":["../../src/browser/vsx-registry-frontend-module.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@theia/vsx-registry",
3
- "version": "1.45.1",
3
+ "version": "1.46.1",
4
4
  "description": "Theia - VSX Registry",
5
5
  "dependencies": {
6
- "@theia/core": "1.45.1",
7
- "@theia/filesystem": "1.45.1",
8
- "@theia/ovsx-client": "1.45.1",
9
- "@theia/plugin-ext": "1.45.1",
10
- "@theia/plugin-ext-vscode": "1.45.1",
11
- "@theia/preferences": "1.45.1",
12
- "@theia/workspace": "1.45.1",
6
+ "@theia/core": "1.46.1",
7
+ "@theia/filesystem": "1.46.1",
8
+ "@theia/ovsx-client": "1.46.1",
9
+ "@theia/plugin-ext": "1.46.1",
10
+ "@theia/plugin-ext-vscode": "1.46.1",
11
+ "@theia/preferences": "1.46.1",
12
+ "@theia/workspace": "1.46.1",
13
13
  "luxon": "^2.4.0",
14
14
  "p-debounce": "^2.1.0",
15
15
  "semver": "^7.5.4",
@@ -53,11 +53,11 @@
53
53
  "watch": "theiaext watch"
54
54
  },
55
55
  "devDependencies": {
56
- "@theia/ext-scripts": "1.45.1",
56
+ "@theia/ext-scripts": "1.46.1",
57
57
  "@types/luxon": "^2.3.2"
58
58
  },
59
59
  "nyc": {
60
60
  "extends": "../../configs/nyc.json"
61
61
  },
62
- "gitHead": "3837c50544190b80d0ad8e87aa9fa9f286c70fcc"
62
+ "gitHead": "fb7722e8d90d9d4771e7ba1c5b04383ed560fcd9"
63
63
  }
@@ -21,6 +21,56 @@
21
21
  );
22
22
  }
23
23
 
24
+ .vsx-search-container {
25
+ display: flex;
26
+ align-items: center;
27
+ width: 100%;
28
+ background: var(--theia-input-background);
29
+ border-style: solid;
30
+ border-width: var(--theia-border-width);
31
+ border-color: var(--theia-input-background);
32
+ border-radius: 2px;
33
+ }
34
+
35
+ .vsx-search-container:focus-within {
36
+ border-color: var(--theia-focusBorder);
37
+ }
38
+
39
+ .vsx-search-container .option-buttons {
40
+ height: 23px;
41
+ display: flex;
42
+ align-items: center;
43
+ align-self: flex-start;
44
+ background-color: none;
45
+ margin: 2px;
46
+ }
47
+
48
+ .vsx-search-container .option {
49
+ width: 21px;
50
+ height: 21px;
51
+ margin: 0 1px;
52
+ display: inline-block;
53
+ box-sizing: border-box;
54
+ align-items: center;
55
+ user-select: none;
56
+ background-repeat: no-repeat;
57
+ background-position: center;
58
+ border: var(--theia-border-width) solid transparent;
59
+ opacity: 0.7;
60
+ cursor: pointer;
61
+ }
62
+
63
+ .vsx-search-container .option.enabled {
64
+ color: var(--theia-inputOption-activeForeground);
65
+ border: var(--theia-border-width) var(--theia-inputOption-activeBorder) solid;
66
+ background-color: var(--theia-inputOption-activeBackground);
67
+ opacity: 1;
68
+ }
69
+
70
+ .vsx-search-container .option:hover {
71
+ opacity: 1;
72
+ }
73
+
24
74
  .theia-vsx-extensions {
25
75
  height: 100%;
26
76
  }
@@ -42,10 +92,14 @@
42
92
  overflow: hidden;
43
93
  line-height: var(--theia-content-line-height);
44
94
  flex: 1;
45
- padding-top: calc(var(--theia-ui-padding) / 2);
46
- padding-bottom: calc(var(--theia-ui-padding) / 2);
95
+ margin-top: calc(var(--theia-ui-padding) / 2);
96
+ margin-bottom: calc(var(--theia-ui-padding) / 2);
47
97
  }
48
98
 
99
+ .theia-vsx-extensions-search-bar .theia-input:focus {
100
+ border: none;
101
+ outline: none;
102
+ }
49
103
  .theia-vsx-extension {
50
104
  display: flex;
51
105
  flex-direction: row;
@@ -136,6 +190,15 @@
136
190
  white-space: nowrap;
137
191
  }
138
192
 
193
+ .theia-vsx-extension-action-bar .codicon-verified-filled {
194
+ color: var(--theia-extensionIcon-verifiedForeground);
195
+ margin-right: 2px;
196
+ }
197
+
198
+ .theia-vsx-extension-publisher-container {
199
+ display: flex;
200
+ }
201
+
139
202
  .theia-vsx-extension-action-bar .action {
140
203
  font-size: 90%;
141
204
  min-width: auto !important;
@@ -28,7 +28,7 @@ import { Endpoint } from '@theia/core/lib/browser/endpoint';
28
28
  import { VSXEnvironment } from '../common/vsx-environment';
29
29
  import { VSXExtensionsSearchModel } from './vsx-extensions-search-model';
30
30
  import { CommandRegistry, MenuPath, nls } from '@theia/core/lib/common';
31
- import { codicon, ContextMenuRenderer, HoverService, TreeWidget } from '@theia/core/lib/browser';
31
+ import { codicon, ConfirmDialog, ContextMenuRenderer, HoverService, TreeWidget } from '@theia/core/lib/browser';
32
32
  import { VSXExtensionNamespaceAccess, VSXUser } from '@theia/ovsx-client/lib/ovsx-types';
33
33
  import { WindowService } from '@theia/core/lib/browser/window/window-service';
34
34
  import { MarkdownStringImpl } from '@theia/core/lib/common/markdown-rendering';
@@ -57,6 +57,7 @@ export class VSXExtensionData {
57
57
  readonly license?: string;
58
58
  readonly readme?: string;
59
59
  readonly preview?: boolean;
60
+ readonly verified?: boolean;
60
61
  readonly namespaceAccess?: VSXExtensionNamespaceAccess;
61
62
  readonly publishedBy?: VSXUser;
62
63
  static KEYS: Set<(keyof VSXExtensionData)> = new Set([
@@ -75,6 +76,7 @@ export class VSXExtensionData {
75
76
  'license',
76
77
  'readme',
77
78
  'preview',
79
+ 'verified',
78
80
  'namespaceAccess',
79
81
  'publishedBy'
80
82
  ]);
@@ -265,6 +267,10 @@ export class VSXExtension implements VSXExtensionData, TreeElement {
265
267
  return this.getData('preview');
266
268
  }
267
269
 
270
+ get verified(): boolean | undefined {
271
+ return this.getData('verified');
272
+ }
273
+
268
274
  get namespaceAccess(): VSXExtensionNamespaceAccess | undefined {
269
275
  return this.getData('namespaceAccess');
270
276
  }
@@ -297,13 +303,16 @@ export class VSXExtension implements VSXExtensionData, TreeElement {
297
303
  }
298
304
 
299
305
  async install(options?: PluginDeployOptions): Promise<void> {
300
- this._busy++;
301
- try {
302
- await this.progressService.withProgress(nls.localizeByDefault("Installing extension '{0}' v{1}...", this.id, this.version ?? 0), 'extensions', () =>
303
- this.pluginServer.deploy(this.uri.toString(), undefined, options)
304
- );
305
- } finally {
306
- this._busy--;
306
+ if (!this.verified) {
307
+ const choice = await new ConfirmDialog({
308
+ title: nls.localize('theia/vsx-registry/confirmDialogTitle', 'Are you sure you want to proceed with the installation ?'),
309
+ msg: nls.localize('theia/vsx-registry/confirmDialogMessage', 'The extension "{0}" is unverified and might pose a security risk.', this.displayName)
310
+ }).open();
311
+ if (choice) {
312
+ this.doInstall(options);
313
+ }
314
+ } else {
315
+ this.doInstall(options);
307
316
  }
308
317
  }
309
318
 
@@ -322,6 +331,17 @@ export class VSXExtension implements VSXExtensionData, TreeElement {
322
331
  }
323
332
  }
324
333
 
334
+ protected async doInstall(options?: PluginDeployOptions): Promise<void> {
335
+ this._busy++;
336
+ try {
337
+ await this.progressService.withProgress(nls.localizeByDefault("Installing extension '{0}' v{1}...", this.id, this.version ?? 0), 'extensions', () =>
338
+ this.pluginServer.deploy(this.uri.toString(), undefined, options)
339
+ );
340
+ } finally {
341
+ this._busy--;
342
+ }
343
+ }
344
+
325
345
  handleContextMenu(e: React.MouseEvent<HTMLElement, MouseEvent>): void {
326
346
  e.preventDefault();
327
347
  this.contextMenuRenderer.render({
@@ -464,7 +484,7 @@ export namespace VSXExtensionComponent {
464
484
 
465
485
  export class VSXExtensionComponent<Props extends VSXExtensionComponent.Props = VSXExtensionComponent.Props> extends AbstractVSXExtensionComponent<Props> {
466
486
  override render(): React.ReactNode {
467
- const { iconUrl, publisher, displayName, description, version, downloadCount, averageRating, tooltip } = this.props.extension;
487
+ const { iconUrl, publisher, displayName, description, version, downloadCount, averageRating, tooltip, verified } = this.props.extension;
468
488
 
469
489
  return <div
470
490
  className='theia-vsx-extension noselect'
@@ -491,7 +511,16 @@ export class VSXExtensionComponent<Props extends VSXExtensionComponent.Props = V
491
511
  </div>
492
512
  <div className='noWrapInfo theia-vsx-extension-description'>{description}</div>
493
513
  <div className='theia-vsx-extension-action-bar'>
494
- <span className='noWrapInfo theia-vsx-extension-publisher'>{publisher}</span>
514
+ <div className='theia-vsx-extension-publisher-container'>
515
+ {verified === true ? (
516
+ <i className={codicon('verified-filled')} />
517
+ ) : verified === false ? (
518
+ <i className={codicon('verified')} />
519
+ ) : (
520
+ <i className={codicon('question')} />
521
+ )}
522
+ <span className='noWrapInfo theia-vsx-extension-publisher'>{publisher}</span>
523
+ </div>
495
524
  {this.renderAction(this.props.host)}
496
525
  </div>
497
526
  </div>
@@ -182,6 +182,12 @@ export class VSXExtensionsContribution extends AbstractViewContribution<VSXExten
182
182
  hcLight: Color.black
183
183
  }, description: 'Border color for a table row of the extension editor view'
184
184
  },
185
+ {
186
+ id: 'extensionIcon.verifiedForeground', defaults: {
187
+ dark: '#40a6ff',
188
+ light: '#40a6ff'
189
+ }, description: 'The icon color for extension verified publisher.'
190
+ },
185
191
  );
186
192
  }
187
193
 
@@ -28,7 +28,7 @@ import { PreferenceInspectionScope, PreferenceService } from '@theia/core/lib/br
28
28
  import { WorkspaceService } from '@theia/workspace/lib/browser';
29
29
  import { RecommendedExtensions } from './recommended-extensions/recommended-extensions-preference-contribution';
30
30
  import URI from '@theia/core/lib/common/uri';
31
- import { VSXExtensionRaw, VSXResponseError, VSXSearchOptions } from '@theia/ovsx-client/lib/ovsx-types';
31
+ import { OVSXClient, VSXAllVersions, VSXExtensionRaw, VSXResponseError, VSXSearchEntry, VSXSearchOptions } from '@theia/ovsx-client/lib/ovsx-types';
32
32
  import { OVSXClientProvider } from '../common/ovsx-client-provider';
33
33
  import { RequestContext, RequestService } from '@theia/core/shared/@theia/request';
34
34
  import { OVSXApiFilter } from '@theia/ovsx-client';
@@ -113,6 +113,13 @@ export class VSXExtensionsModel {
113
113
  return this._recommended.values();
114
114
  }
115
115
 
116
+ setOnlyShowVerifiedExtensions(bool: boolean): void {
117
+ if (this.preferences.get('extensions.onlyShowVerifiedExtensions') !== bool) {
118
+ this.preferences.updateValue('extensions.onlyShowVerifiedExtensions', bool);
119
+ }
120
+ this.updateSearchResult();
121
+ }
122
+
116
123
  isInstalled(id: string): boolean {
117
124
  return this._installed.has(id);
118
125
  }
@@ -208,9 +215,8 @@ export class VSXExtensionsModel {
208
215
 
209
216
  protected doUpdateSearchResult(param: VSXSearchOptions, token: CancellationToken): Promise<void> {
210
217
  return this.doChange(async () => {
211
- const searchResult = new Set<string>();
218
+ this._searchResult = new Set<string>();
212
219
  if (!param.query) {
213
- this._searchResult = searchResult;
214
220
  return;
215
221
  }
216
222
  const client = await this.clientProvider();
@@ -225,20 +231,55 @@ export class VSXExtensionsModel {
225
231
  if (!allVersions) {
226
232
  continue;
227
233
  }
228
- this.setExtension(id).update(Object.assign(data, {
229
- publisher: data.namespace,
230
- downloadUrl: data.files.download,
231
- iconUrl: data.files.icon,
232
- readmeUrl: data.files.readme,
233
- licenseUrl: data.files.license,
234
- version: allVersions.version
235
- }));
236
- searchResult.add(id);
234
+ if (this.preferences.get('extensions.onlyShowVerifiedExtensions')) {
235
+ this.fetchVerifiedStatus(id, client, allVersions).then(verified => {
236
+ this.doChange(() => {
237
+ this.addExtensions(data, id, allVersions, !!verified);
238
+ return Promise.resolve();
239
+ });
240
+ });
241
+ } else {
242
+ this.addExtensions(data, id, allVersions);
243
+ this.fetchVerifiedStatus(id, client, allVersions).then(verified => {
244
+ this.doChange(() => {
245
+ let extension = this.getExtension(id);
246
+ extension = this.setExtension(id);
247
+ extension.update(Object.assign({
248
+ verified: verified
249
+ }));
250
+ return Promise.resolve();
251
+ });
252
+ });
253
+ }
237
254
  }
238
- this._searchResult = searchResult;
239
255
  }, token);
240
256
  }
241
257
 
258
+ protected async fetchVerifiedStatus(id: string, client: OVSXClient, allVersions: VSXAllVersions): Promise<boolean | undefined> {
259
+ const res = await client.query({ extensionId: id, extensionVersion: allVersions.version, includeAllVersions: true });
260
+ let verified = res.extensions?.[0].verified;
261
+ if (!verified && res.extensions?.[0].publishedBy.loginName === 'open-vsx') {
262
+ verified = true;
263
+ }
264
+ return verified;
265
+ }
266
+
267
+ protected addExtensions(data: VSXSearchEntry, id: string, allVersions: VSXAllVersions, verified?: boolean): void {
268
+ if (!this.preferences.get('extensions.onlyShowVerifiedExtensions') || verified) {
269
+ const extension = this.setExtension(id);
270
+ extension.update(Object.assign(data, {
271
+ publisher: data.namespace,
272
+ downloadUrl: data.files.download,
273
+ iconUrl: data.files.icon,
274
+ readmeUrl: data.files.readme,
275
+ licenseUrl: data.files.license,
276
+ version: allVersions.version,
277
+ verified: verified
278
+ }));
279
+ this._searchResult.add(id);
280
+ }
281
+ }
282
+
242
283
  protected async updateInstalled(): Promise<void> {
243
284
  const prevInstalled = this._installed;
244
285
  return this.doChange(async () => {
@@ -331,6 +372,11 @@ export class VSXExtensionsModel {
331
372
  if (data.error) {
332
373
  return this.onDidFailRefresh(id, data.error);
333
374
  }
375
+ if (!data.verified) {
376
+ if (data.publishedBy.loginName === 'open-vsx') {
377
+ data.verified = true;
378
+ }
379
+ }
334
380
  extension = this.setExtension(id);
335
381
  extension.update(Object.assign(data, {
336
382
  publisher: data.namespace,
@@ -338,7 +384,8 @@ export class VSXExtensionsModel {
338
384
  iconUrl: data.files.icon,
339
385
  readmeUrl: data.files.readme,
340
386
  licenseUrl: data.files.license,
341
- version: data.version
387
+ version: data.version,
388
+ verified: data.verified
342
389
  }));
343
390
  return extension;
344
391
  } catch (e) {
@@ -0,0 +1,58 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2023 Ericsson and others.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+
17
+ import { interfaces } from '@theia/core/shared/inversify';
18
+ import {
19
+ createPreferenceProxy,
20
+ PreferenceProxy,
21
+ PreferenceService,
22
+ PreferenceSchema,
23
+ PreferenceContribution
24
+ } from '@theia/core/lib/browser/preferences';
25
+ import { nls } from '@theia/core';
26
+
27
+ export const VsxExtensionsPreferenceSchema: PreferenceSchema = {
28
+ 'type': 'object',
29
+ properties: {
30
+ 'extensions.onlyShowVerifiedExtensions': {
31
+ type: 'boolean',
32
+ default: false,
33
+ description: nls.localize('theia/vsx-registry/onlyShowVerifiedExtensionsDescription', 'This allows the {0} to only show verified extensions.', 'Open VSX Registry')
34
+ },
35
+ }
36
+ };
37
+
38
+ export interface VsxExtensionsConfiguration {
39
+ 'extensions.onlyShowVerifiedExtensions': boolean;
40
+ }
41
+
42
+ export const VsxExtensionsPreferenceContribution = Symbol('VsxExtensionsPreferenceContribution');
43
+ export const VsxExtensionsPreferences = Symbol('VsxExtensionsPreferences');
44
+ export type VsxExtensionsPreferences = PreferenceProxy<VsxExtensionsConfiguration>;
45
+
46
+ export function createVsxExtensionsPreferences(preferences: PreferenceService, schema: PreferenceSchema = VsxExtensionsPreferenceSchema): VsxExtensionsPreferences {
47
+ return createPreferenceProxy(preferences, schema);
48
+ }
49
+
50
+ export function bindVsxExtensionsPreferences(bind: interfaces.Bind): void {
51
+ bind(VsxExtensionsPreferences).toDynamicValue(ctx => {
52
+ const preferences = ctx.container.get<PreferenceService>(PreferenceService);
53
+ const contribution = ctx.container.get<PreferenceContribution>(VsxExtensionsPreferenceContribution);
54
+ return createVsxExtensionsPreferences(preferences, contribution.schema);
55
+ }).inSingletonScope();
56
+ bind(VsxExtensionsPreferenceContribution).toConstantValue({ schema: VsxExtensionsPreferenceSchema });
57
+ bind(PreferenceContribution).toService(VsxExtensionsPreferenceContribution);
58
+ }
@@ -16,37 +16,57 @@
16
16
 
17
17
  import * as React from '@theia/core/shared/react';
18
18
  import { injectable, postConstruct, inject } from '@theia/core/shared/inversify';
19
- import { ReactWidget, Message } from '@theia/core/lib/browser/widgets';
19
+ import { ReactWidget, Message, codicon } from '@theia/core/lib/browser/widgets';
20
+ import { PreferenceService } from '@theia/core/lib/browser';
20
21
  import { VSXExtensionsSearchModel } from './vsx-extensions-search-model';
22
+ import { VSXExtensionsModel } from './vsx-extensions-model';
21
23
  import { nls } from '@theia/core/lib/common/nls';
22
24
 
23
25
  @injectable()
24
26
  export class VSXExtensionsSearchBar extends ReactWidget {
25
27
 
28
+ @inject(VSXExtensionsModel)
29
+ protected readonly extensionsModel: VSXExtensionsModel;
30
+
26
31
  @inject(VSXExtensionsSearchModel)
27
- protected readonly model: VSXExtensionsSearchModel;
32
+ protected readonly searchModel: VSXExtensionsSearchModel;
33
+
34
+ @inject(PreferenceService)
35
+ protected readonly preferenceService: PreferenceService;
36
+
37
+ protected input: HTMLInputElement | undefined;
38
+ protected onlyShowVerifiedExtensions: boolean | undefined;
28
39
 
29
40
  @postConstruct()
30
41
  protected init(): void {
42
+ this.onlyShowVerifiedExtensions = this.preferenceService.get('extensions.onlyShowVerifiedExtensions');
31
43
  this.id = 'vsx-extensions-search-bar';
32
44
  this.addClass('theia-vsx-extensions-search-bar');
33
- this.model.onDidChangeQuery((query: string) => this.updateSearchTerm(query));
45
+ this.searchModel.onDidChangeQuery((query: string) => this.updateSearchTerm(query));
46
+ this.preferenceService.onPreferenceChanged(change => {
47
+ if (change.preferenceName === 'extensions.onlyShowVerifiedExtensions') {
48
+ this.extensionsModel.setOnlyShowVerifiedExtensions(!!change.newValue);
49
+ this.onlyShowVerifiedExtensions = change.newValue;
50
+ this.update();
51
+ }
52
+ });
34
53
  }
35
54
 
36
- protected input: HTMLInputElement | undefined;
37
-
38
55
  protected render(): React.ReactNode {
39
- return <input type='text'
40
- ref={input => this.input = input || undefined}
41
- defaultValue={this.model.query}
42
- spellCheck={false}
43
- className='theia-input'
44
- placeholder={nls.localize('theia/vsx-registry/searchPlaceholder', 'Search Extensions in {0}', 'Open VSX Registry')}
45
- onChange={this.updateQuery}>
46
- </input>;
56
+ return <div className='vsx-search-container'>
57
+ <input type='text'
58
+ ref={input => this.input = input || undefined}
59
+ defaultValue={this.searchModel.query}
60
+ spellCheck={false}
61
+ className='theia-input'
62
+ placeholder={nls.localize('theia/vsx-registry/searchPlaceholder', 'Search Extensions in {0}', 'Open VSX Registry')}
63
+ onChange={this.updateQuery}>
64
+ </input>
65
+ {this.renderOptionContainer()}
66
+ </div>;
47
67
  }
48
68
 
49
- protected updateQuery = (e: React.ChangeEvent<HTMLInputElement>) => this.model.query = e.target.value;
69
+ protected updateQuery = (e: React.ChangeEvent<HTMLInputElement>) => this.searchModel.query = e.target.value;
50
70
 
51
71
  protected updateSearchTerm(term: string): void {
52
72
  if (this.input) {
@@ -54,6 +74,24 @@ export class VSXExtensionsSearchBar extends ReactWidget {
54
74
  }
55
75
  }
56
76
 
77
+ protected renderOptionContainer(): React.ReactNode {
78
+ const showVerifiedExtensions = this.renderShowVerifiedExtensions();
79
+ return <div className='option-buttons'>{showVerifiedExtensions}</div>;
80
+ }
81
+
82
+ protected renderShowVerifiedExtensions(): React.ReactNode {
83
+ return <span
84
+ className={`${codicon('verified')} option action-label ${this.onlyShowVerifiedExtensions ? 'enabled' : ''}`}
85
+ title={nls.localize('theia/vsx-registry/onlyShowVerifiedExtensionsTitle', 'Only Show Verified Extensions')}
86
+ onClick={() => this.handleShowVerifiedExtensionsClick()}>
87
+ </span>;
88
+ }
89
+
90
+ protected handleShowVerifiedExtensionsClick(): void {
91
+ this.extensionsModel.setOnlyShowVerifiedExtensions(!this.onlyShowVerifiedExtensions);
92
+ this.update();
93
+ }
94
+
57
95
  protected override onActivateRequest(msg: Message): void {
58
96
  super.onActivateRequest(msg);
59
97
  if (this.input) {