@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.
- package/lib/browser/vsx-extension.d.ts +3 -0
- package/lib/browser/vsx-extension.d.ts.map +1 -1
- package/lib/browser/vsx-extension.js +28 -8
- package/lib/browser/vsx-extension.js.map +1 -1
- package/lib/browser/vsx-extensions-contribution.d.ts.map +1 -1
- package/lib/browser/vsx-extensions-contribution.js +5 -0
- package/lib/browser/vsx-extensions-contribution.js.map +1 -1
- package/lib/browser/vsx-extensions-model.d.ts +4 -1
- package/lib/browser/vsx-extensions-model.d.ts.map +1 -1
- package/lib/browser/vsx-extensions-model.js +59 -13
- package/lib/browser/vsx-extensions-model.js.map +1 -1
- package/lib/browser/vsx-extensions-preferences.d.ts +12 -0
- package/lib/browser/vsx-extensions-preferences.d.ts.map +1 -0
- package/lib/browser/vsx-extensions-preferences.js +47 -0
- package/lib/browser/vsx-extensions-preferences.js.map +1 -0
- package/lib/browser/vsx-extensions-search-bar.d.ts +10 -2
- package/lib/browser/vsx-extensions-search-bar.d.ts.map +1 -1
- package/lib/browser/vsx-extensions-search-bar.js +35 -4
- package/lib/browser/vsx-extensions-search-bar.js.map +1 -1
- package/lib/browser/vsx-registry-frontend-module.d.ts.map +1 -1
- package/lib/browser/vsx-registry-frontend-module.js +2 -0
- package/lib/browser/vsx-registry-frontend-module.js.map +1 -1
- package/package.json +10 -10
- package/src/browser/style/index.css +65 -2
- package/src/browser/vsx-extension.tsx +39 -10
- package/src/browser/vsx-extensions-contribution.ts +6 -0
- package/src/browser/vsx-extensions-model.ts +61 -14
- package/src/browser/vsx-extensions-preferences.ts +58 -0
- package/src/browser/vsx-extensions-search-bar.tsx +52 -14
- 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.
|
|
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.
|
|
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("
|
|
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, "
|
|
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,
|
|
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;;
|
|
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.
|
|
3
|
+
"version": "1.46.1",
|
|
4
4
|
"description": "Theia - VSX Registry",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@theia/core": "1.
|
|
7
|
-
"@theia/filesystem": "1.
|
|
8
|
-
"@theia/ovsx-client": "1.
|
|
9
|
-
"@theia/plugin-ext": "1.
|
|
10
|
-
"@theia/plugin-ext-vscode": "1.
|
|
11
|
-
"@theia/preferences": "1.
|
|
12
|
-
"@theia/workspace": "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.
|
|
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": "
|
|
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
|
-
|
|
46
|
-
|
|
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.
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
);
|
|
305
|
-
|
|
306
|
-
|
|
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
|
-
<
|
|
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
|
-
|
|
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.
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
}
|
|
236
|
-
|
|
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
|
|
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.
|
|
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 <
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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.
|
|
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) {
|