@codingame/monaco-vscode-extension-gallery-service-override 24.2.0 → 25.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/vscode/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.js +16 -16
- package/vscode/src/vs/platform/extensionManagement/common/allowedExtensionsService.js +5 -5
- package/vscode/src/vs/workbench/contrib/extensions/browser/extensions.web.contribution.js +1 -1
- package/vscode/src/vs/workbench/contrib/extensions/common/reportExtensionIssueAction.js +1 -1
- package/vscode/src/vs/workbench/services/extensionManagement/browser/extensionEnablementService.js +14 -14
- package/vscode/src/vs/workbench/services/extensionManagement/common/extensionFeaturesManagemetService.js +4 -4
- package/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagementServerService.js +2 -2
- package/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagementService.js +46 -46
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codingame/monaco-vscode-extension-gallery-service-override",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "25.0.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "VSCode public API plugged on the monaco editor - extension-gallery service-override",
|
|
6
6
|
"keywords": [],
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"type": "module",
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@codingame/monaco-vscode-api": "
|
|
18
|
+
"@codingame/monaco-vscode-api": "25.0.0"
|
|
19
19
|
},
|
|
20
20
|
"main": "index.js",
|
|
21
21
|
"module": "index.js",
|
package/vscode/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.js
CHANGED
|
@@ -33,7 +33,7 @@ let CommontExtensionManagementService = class CommontExtensionManagementService
|
|
|
33
33
|
const allowedToInstall = this.allowedExtensionsService.isAllowed({ id: extension.identifier.id, publisherDisplayName: extension.publisherDisplayName });
|
|
34
34
|
if (allowedToInstall !== true) {
|
|
35
35
|
return (new MarkdownString(localize(
|
|
36
|
-
|
|
36
|
+
1809,
|
|
37
37
|
"This extension cannot be installed because {0}",
|
|
38
38
|
allowedToInstall.value
|
|
39
39
|
)));
|
|
@@ -41,12 +41,12 @@ let CommontExtensionManagementService = class CommontExtensionManagementService
|
|
|
41
41
|
if (!(await this.isExtensionPlatformCompatible(extension))) {
|
|
42
42
|
const learnLink = isWeb ? 'https://aka.ms/vscode-web-extensions-guide' : 'https://aka.ms/vscode-platform-specific-extensions';
|
|
43
43
|
return (new MarkdownString(`${( localize(
|
|
44
|
-
|
|
44
|
+
1810,
|
|
45
45
|
"The '{0}' extension is not available in {1} for the {2} platform.",
|
|
46
46
|
extension.displayName ?? extension.identifier.id,
|
|
47
47
|
this.productService.nameLong,
|
|
48
48
|
TargetPlatformToString(await this.getTargetPlatform())
|
|
49
|
-
))} [${( localize(
|
|
49
|
+
))} [${( localize(1811, "Learn Why"))}](${learnLink})`));
|
|
50
50
|
}
|
|
51
51
|
return true;
|
|
52
52
|
}
|
|
@@ -111,7 +111,7 @@ let AbstractExtensionManagementService = class AbstractExtensionManagementServic
|
|
|
111
111
|
}
|
|
112
112
|
async installGalleryExtensions(extensions) {
|
|
113
113
|
if (!this.galleryService.isEnabled()) {
|
|
114
|
-
throw ( new ExtensionManagementError(( localize(
|
|
114
|
+
throw ( new ExtensionManagementError(( localize(1812, "Marketplace is not enabled")), ExtensionManagementErrorCode.NotAllowed));
|
|
115
115
|
}
|
|
116
116
|
const results = [];
|
|
117
117
|
const installableExtensions = [];
|
|
@@ -548,7 +548,7 @@ let AbstractExtensionManagementService = class AbstractExtensionManagementServic
|
|
|
548
548
|
const extensionsControlManifest = await this.getExtensionsControlManifest();
|
|
549
549
|
if (isMalicious(extension.identifier, extensionsControlManifest.malicious)) {
|
|
550
550
|
throw ( new ExtensionManagementError(( localize(
|
|
551
|
-
|
|
551
|
+
1813,
|
|
552
552
|
"Can't install '{0}' extension since it was reported to be problematic.",
|
|
553
553
|
extension.identifier.id
|
|
554
554
|
)), ExtensionManagementErrorCode.Malicious));
|
|
@@ -559,7 +559,7 @@ let AbstractExtensionManagementService = class AbstractExtensionManagementServic
|
|
|
559
559
|
compatibleExtension = (await this.galleryService.getExtensions([{ id: deprecationInfo.extension.id, preRelease: deprecationInfo.extension.preRelease }], { targetPlatform: await this.getTargetPlatform(), compatible: true, productVersion }, CancellationToken.None))[0];
|
|
560
560
|
if (!compatibleExtension) {
|
|
561
561
|
throw ( new ExtensionManagementError(( localize(
|
|
562
|
-
|
|
562
|
+
1814,
|
|
563
563
|
"Can't install '{0}' extension since it was deprecated and the replacement extension '{1}' can't be found.",
|
|
564
564
|
extension.identifier.id,
|
|
565
565
|
deprecationInfo.extension.id
|
|
@@ -570,7 +570,7 @@ let AbstractExtensionManagementService = class AbstractExtensionManagementServic
|
|
|
570
570
|
if ((await this.canInstall(extension)) !== true) {
|
|
571
571
|
const targetPlatform = await this.getTargetPlatform();
|
|
572
572
|
throw ( new ExtensionManagementError(( localize(
|
|
573
|
-
|
|
573
|
+
1810,
|
|
574
574
|
"The '{0}' extension is not available in {1} for the {2} platform.",
|
|
575
575
|
extension.identifier.id,
|
|
576
576
|
this.productService.nameLong,
|
|
@@ -582,7 +582,7 @@ let AbstractExtensionManagementService = class AbstractExtensionManagementServic
|
|
|
582
582
|
const incompatibleApiProposalsMessages = [];
|
|
583
583
|
if (!areApiProposalsCompatible(extension.properties.enabledApiProposals ?? [], incompatibleApiProposalsMessages)) {
|
|
584
584
|
throw ( new ExtensionManagementError(( localize(
|
|
585
|
-
|
|
585
|
+
1815,
|
|
586
586
|
"Can't install '{0}' extension. {1}",
|
|
587
587
|
extension.displayName ?? extension.identifier.id,
|
|
588
588
|
incompatibleApiProposalsMessages[0]
|
|
@@ -590,13 +590,13 @@ let AbstractExtensionManagementService = class AbstractExtensionManagementServic
|
|
|
590
590
|
}
|
|
591
591
|
if (!installPreRelease && extension.hasPreReleaseVersion && extension.properties.isPreReleaseVersion && (await this.galleryService.getExtensions([extension.identifier], CancellationToken.None))[0]) {
|
|
592
592
|
throw ( new ExtensionManagementError(( localize(
|
|
593
|
-
|
|
593
|
+
1816,
|
|
594
594
|
"Can't install release version of '{0}' extension because it has no release version.",
|
|
595
595
|
extension.displayName ?? extension.identifier.id
|
|
596
596
|
)), ExtensionManagementErrorCode.ReleaseVersionNotFound));
|
|
597
597
|
}
|
|
598
598
|
throw ( new ExtensionManagementError(( localize(
|
|
599
|
-
|
|
599
|
+
1817,
|
|
600
600
|
"Can't install '{0}' extension because it is not compatible with the current version of {1} (version {2}).",
|
|
601
601
|
extension.identifier.id,
|
|
602
602
|
this.productService.nameLong,
|
|
@@ -821,7 +821,7 @@ let AbstractExtensionManagementService = class AbstractExtensionManagementServic
|
|
|
821
821
|
if (extensionToUninstall === dependingExtension) {
|
|
822
822
|
if (dependents.length === 1) {
|
|
823
823
|
return localize(
|
|
824
|
-
|
|
824
|
+
1818,
|
|
825
825
|
"Cannot uninstall '{0}' extension. '{1}' extension depends on this.",
|
|
826
826
|
extensionToUninstall.manifest.displayName || extensionToUninstall.manifest.name,
|
|
827
827
|
dependents[0].manifest.displayName || dependents[0].manifest.name
|
|
@@ -829,7 +829,7 @@ let AbstractExtensionManagementService = class AbstractExtensionManagementServic
|
|
|
829
829
|
}
|
|
830
830
|
if (dependents.length === 2) {
|
|
831
831
|
return localize(
|
|
832
|
-
|
|
832
|
+
1819,
|
|
833
833
|
"Cannot uninstall '{0}' extension. '{1}' and '{2}' extensions depend on this.",
|
|
834
834
|
extensionToUninstall.manifest.displayName || extensionToUninstall.manifest.name,
|
|
835
835
|
dependents[0].manifest.displayName || dependents[0].manifest.name,
|
|
@@ -837,7 +837,7 @@ let AbstractExtensionManagementService = class AbstractExtensionManagementServic
|
|
|
837
837
|
);
|
|
838
838
|
}
|
|
839
839
|
return localize(
|
|
840
|
-
|
|
840
|
+
1820,
|
|
841
841
|
"Cannot uninstall '{0}' extension. '{1}', '{2}' and other extension depend on this.",
|
|
842
842
|
extensionToUninstall.manifest.displayName || extensionToUninstall.manifest.name,
|
|
843
843
|
dependents[0].manifest.displayName || dependents[0].manifest.name,
|
|
@@ -846,7 +846,7 @@ let AbstractExtensionManagementService = class AbstractExtensionManagementServic
|
|
|
846
846
|
}
|
|
847
847
|
if (dependents.length === 1) {
|
|
848
848
|
return localize(
|
|
849
|
-
|
|
849
|
+
1821,
|
|
850
850
|
"Cannot uninstall '{0}' extension . It includes uninstalling '{1}' extension and '{2}' extension depends on this.",
|
|
851
851
|
extensionToUninstall.manifest.displayName || extensionToUninstall.manifest.name,
|
|
852
852
|
dependingExtension.manifest.displayName
|
|
@@ -856,7 +856,7 @@ let AbstractExtensionManagementService = class AbstractExtensionManagementServic
|
|
|
856
856
|
}
|
|
857
857
|
if (dependents.length === 2) {
|
|
858
858
|
return localize(
|
|
859
|
-
|
|
859
|
+
1822,
|
|
860
860
|
"Cannot uninstall '{0}' extension. It includes uninstalling '{1}' extension and '{2}' and '{3}' extensions depend on this.",
|
|
861
861
|
extensionToUninstall.manifest.displayName || extensionToUninstall.manifest.name,
|
|
862
862
|
dependingExtension.manifest.displayName
|
|
@@ -866,7 +866,7 @@ let AbstractExtensionManagementService = class AbstractExtensionManagementServic
|
|
|
866
866
|
);
|
|
867
867
|
}
|
|
868
868
|
return localize(
|
|
869
|
-
|
|
869
|
+
1823,
|
|
870
870
|
"Cannot uninstall '{0}' extension. It includes uninstalling '{1}' extension and '{2}', '{3}' and other extensions depend on this.",
|
|
871
871
|
extensionToUninstall.manifest.displayName || extensionToUninstall.manifest.name,
|
|
872
872
|
dependingExtension.manifest.displayName
|
|
@@ -77,14 +77,14 @@ let AllowedExtensionsService = class AllowedExtensionsService extends Disposable
|
|
|
77
77
|
}
|
|
78
78
|
const settingsCommandLink = ( createCommandUri('workbench.action.openSettings', { query: `@id:${AllowedExtensionsConfigKey}` }).toString());
|
|
79
79
|
const extensionValue = this._allowedExtensionsConfigValue[id];
|
|
80
|
-
const extensionReason = ( new MarkdownString(( localize(
|
|
80
|
+
const extensionReason = ( new MarkdownString(( localize(1824, "it is not in the [allowed list]({0})", settingsCommandLink))));
|
|
81
81
|
if (!isUndefined(extensionValue)) {
|
|
82
82
|
if (isBoolean(extensionValue)) {
|
|
83
83
|
return extensionValue ? true : extensionReason;
|
|
84
84
|
}
|
|
85
85
|
if (extensionValue === 'stable' && prerelease) {
|
|
86
86
|
return (new MarkdownString(localize(
|
|
87
|
-
|
|
87
|
+
1825,
|
|
88
88
|
"the pre-release versions of this extension are not in the [allowed list]({0})",
|
|
89
89
|
settingsCommandLink
|
|
90
90
|
)));
|
|
@@ -104,7 +104,7 @@ let AllowedExtensionsService = class AllowedExtensionsService extends Disposable
|
|
|
104
104
|
return false;
|
|
105
105
|
}))) {
|
|
106
106
|
return (new MarkdownString(localize(
|
|
107
|
-
|
|
107
|
+
1826,
|
|
108
108
|
"the version {0} of this extension is not in the [allowed list]({1})",
|
|
109
109
|
version,
|
|
110
110
|
settingsCommandLink
|
|
@@ -117,7 +117,7 @@ let AllowedExtensionsService = class AllowedExtensionsService extends Disposable
|
|
|
117
117
|
if (!isUndefined(publisherValue)) {
|
|
118
118
|
if (isBoolean(publisherValue)) {
|
|
119
119
|
return publisherValue ? true : ( new MarkdownString(( localize(
|
|
120
|
-
|
|
120
|
+
1827,
|
|
121
121
|
"the extensions from this publisher are not in the [allowed list]({1})",
|
|
122
122
|
publisherKey,
|
|
123
123
|
settingsCommandLink
|
|
@@ -125,7 +125,7 @@ let AllowedExtensionsService = class AllowedExtensionsService extends Disposable
|
|
|
125
125
|
}
|
|
126
126
|
if (publisherValue === 'stable' && prerelease) {
|
|
127
127
|
return (new MarkdownString(localize(
|
|
128
|
-
|
|
128
|
+
1828,
|
|
129
129
|
"the pre-release versions from this publisher are not in the [allowed list]({1})",
|
|
130
130
|
publisherKey,
|
|
131
131
|
settingsCommandLink
|
|
@@ -7,4 +7,4 @@ import { RuntimeExtensionsEditor } from './browserRuntimeExtensionsEditor.js';
|
|
|
7
7
|
import { RuntimeExtensionsInput } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/extensions/common/runtimeExtensionsInput';
|
|
8
8
|
import { EditorExtensions } from '@codingame/monaco-vscode-api/vscode/vs/workbench/common/editor';
|
|
9
9
|
|
|
10
|
-
( Registry.as(EditorExtensions.EditorPane)).registerEditorPane(EditorPaneDescriptor.create(RuntimeExtensionsEditor, RuntimeExtensionsEditor.ID, ( localize(
|
|
10
|
+
( Registry.as(EditorExtensions.EditorPane)).registerEditorPane(EditorPaneDescriptor.create(RuntimeExtensionsEditor, RuntimeExtensionsEditor.ID, ( localize(7508, "Running Extensions"))), [( new SyncDescriptor(RuntimeExtensionsInput))]);
|
|
@@ -8,7 +8,7 @@ var ReportExtensionIssueAction_1;
|
|
|
8
8
|
let ReportExtensionIssueAction = class ReportExtensionIssueAction extends Action {
|
|
9
9
|
static { ReportExtensionIssueAction_1 = this; }
|
|
10
10
|
static { this._id = 'workbench.extensions.action.reportExtensionIssue'; }
|
|
11
|
-
static { this._label = ( localize(
|
|
11
|
+
static { this._label = ( localize(7875, "Report Issue")); }
|
|
12
12
|
constructor(extension, issueService) {
|
|
13
13
|
super(ReportExtensionIssueAction_1._id, ReportExtensionIssueAction_1._label, 'extension-action report-issue');
|
|
14
14
|
this.extension = extension;
|
package/vscode/src/vs/workbench/services/extensionManagement/browser/extensionEnablementService.js
CHANGED
|
@@ -99,8 +99,8 @@ let ExtensionEnablementService = class ExtensionEnablementService extends Dispos
|
|
|
99
99
|
}));
|
|
100
100
|
if (this.allUserExtensionsDisabled) {
|
|
101
101
|
this.lifecycleService.when(LifecyclePhase.Eventually).then(() => {
|
|
102
|
-
this.notificationService.prompt(Severity.Info, ( localize(
|
|
103
|
-
label: ( localize(
|
|
102
|
+
this.notificationService.prompt(Severity.Info, ( localize(13914, "All installed extensions are temporarily disabled.")), [{
|
|
103
|
+
label: ( localize(13915, "Reload and Enable Extensions")),
|
|
104
104
|
run: () => hostService.reload({ disableExtensions: false })
|
|
105
105
|
}], {
|
|
106
106
|
sticky: true,
|
|
@@ -152,7 +152,7 @@ let ExtensionEnablementService = class ExtensionEnablementService extends Dispos
|
|
|
152
152
|
throwErrorIfCannotChangeEnablement(extension, donotCheckDependencies) {
|
|
153
153
|
if (isLanguagePackExtension(extension.manifest)) {
|
|
154
154
|
throw ( new Error(( localize(
|
|
155
|
-
|
|
155
|
+
13916,
|
|
156
156
|
"Cannot change enablement of {0} extension because it contributes language packs.",
|
|
157
157
|
extension.manifest.displayName || extension.identifier.id
|
|
158
158
|
))));
|
|
@@ -162,14 +162,14 @@ let ExtensionEnablementService = class ExtensionEnablementService extends Dispos
|
|
|
162
162
|
a => a.id === this.userDataSyncAccountService.account.authenticationProviderId
|
|
163
163
|
))) {
|
|
164
164
|
throw ( new Error(( localize(
|
|
165
|
-
|
|
165
|
+
13917,
|
|
166
166
|
"Cannot change enablement {0} extension because Settings Sync depends on it.",
|
|
167
167
|
extension.manifest.displayName || extension.identifier.id
|
|
168
168
|
))));
|
|
169
169
|
}
|
|
170
170
|
if (this._isEnabledInEnv(extension)) {
|
|
171
171
|
throw ( new Error(( localize(
|
|
172
|
-
|
|
172
|
+
13918,
|
|
173
173
|
"Cannot change enablement of {0} extension because it is enabled in environment",
|
|
174
174
|
extension.manifest.displayName || extension.identifier.id
|
|
175
175
|
))));
|
|
@@ -180,37 +180,37 @@ let ExtensionEnablementService = class ExtensionEnablementService extends Dispos
|
|
|
180
180
|
switch (enablementStateOfExtension) {
|
|
181
181
|
case EnablementState.DisabledByEnvironment:
|
|
182
182
|
throw ( new Error(( localize(
|
|
183
|
-
|
|
183
|
+
13919,
|
|
184
184
|
"Cannot change enablement of {0} extension because it is disabled in environment",
|
|
185
185
|
extension.manifest.displayName || extension.identifier.id
|
|
186
186
|
))));
|
|
187
187
|
case EnablementState.DisabledByMalicious:
|
|
188
188
|
throw ( new Error(( localize(
|
|
189
|
-
|
|
189
|
+
13920,
|
|
190
190
|
"Cannot change enablement of {0} extension because it is malicious",
|
|
191
191
|
extension.manifest.displayName || extension.identifier.id
|
|
192
192
|
))));
|
|
193
193
|
case EnablementState.DisabledByVirtualWorkspace:
|
|
194
194
|
throw ( new Error(( localize(
|
|
195
|
-
|
|
195
|
+
13921,
|
|
196
196
|
"Cannot change enablement of {0} extension because it does not support virtual workspaces",
|
|
197
197
|
extension.manifest.displayName || extension.identifier.id
|
|
198
198
|
))));
|
|
199
199
|
case EnablementState.DisabledByExtensionKind:
|
|
200
200
|
throw ( new Error(( localize(
|
|
201
|
-
|
|
201
|
+
13922,
|
|
202
202
|
"Cannot change enablement of {0} extension because of its extension kind",
|
|
203
203
|
extension.manifest.displayName || extension.identifier.id
|
|
204
204
|
))));
|
|
205
205
|
case EnablementState.DisabledByAllowlist:
|
|
206
206
|
throw ( new Error(( localize(
|
|
207
|
-
|
|
207
|
+
13923,
|
|
208
208
|
"Cannot change enablement of {0} extension because it is disallowed",
|
|
209
209
|
extension.manifest.displayName || extension.identifier.id
|
|
210
210
|
))));
|
|
211
211
|
case EnablementState.DisabledByInvalidExtension:
|
|
212
212
|
throw ( new Error(( localize(
|
|
213
|
-
|
|
213
|
+
13924,
|
|
214
214
|
"Cannot change enablement of {0} extension because of it is invalid",
|
|
215
215
|
extension.manifest.displayName || extension.identifier.id
|
|
216
216
|
))));
|
|
@@ -223,7 +223,7 @@ let ExtensionEnablementService = class ExtensionEnablementService extends Dispos
|
|
|
223
223
|
continue;
|
|
224
224
|
}
|
|
225
225
|
throw ( new Error(( localize(
|
|
226
|
-
|
|
226
|
+
13925,
|
|
227
227
|
"Cannot enable '{0}' extension because it depends on '{1}' extension that cannot be enabled",
|
|
228
228
|
extension.manifest.displayName || extension.identifier.id,
|
|
229
229
|
dependency.manifest.displayName || dependency.identifier.id
|
|
@@ -233,11 +233,11 @@ let ExtensionEnablementService = class ExtensionEnablementService extends Dispos
|
|
|
233
233
|
}
|
|
234
234
|
throwErrorIfCannotChangeWorkspaceEnablement(extension) {
|
|
235
235
|
if (!this.hasWorkspace) {
|
|
236
|
-
throw ( new Error(( localize(
|
|
236
|
+
throw ( new Error(( localize(13926, "No workspace."))));
|
|
237
237
|
}
|
|
238
238
|
if (isAuthenticationProviderExtension(extension.manifest)) {
|
|
239
239
|
throw ( new Error(( localize(
|
|
240
|
-
|
|
240
|
+
13927,
|
|
241
241
|
"Cannot change enablement of {0} extension in workspace because it contributes authentication providers",
|
|
242
242
|
extension.manifest.displayName || extension.identifier.id
|
|
243
243
|
))));
|
|
@@ -87,17 +87,17 @@ let ExtensionFeaturesManagementService = class ExtensionFeaturesManagementServic
|
|
|
87
87
|
if (feature.access.requireUserConsent) {
|
|
88
88
|
const extensionDescription = this.extensionService.extensions.find(e => ExtensionIdentifier.equals(e.identifier, extension));
|
|
89
89
|
const confirmationResult = await this.dialogService.confirm({
|
|
90
|
-
title: ( localize(
|
|
90
|
+
title: ( localize(13930, "Access '{0}' Feature", feature.label)),
|
|
91
91
|
message: ( localize(
|
|
92
|
-
|
|
92
|
+
13931,
|
|
93
93
|
"'{0}' extension would like to access the '{1}' feature.",
|
|
94
94
|
extensionDescription?.displayName ?? extension._lower,
|
|
95
95
|
feature.label
|
|
96
96
|
)),
|
|
97
97
|
detail: justification ?? feature.description,
|
|
98
98
|
custom: true,
|
|
99
|
-
primaryButton: ( localize(
|
|
100
|
-
cancelButton: ( localize(
|
|
99
|
+
primaryButton: ( localize(13932, "Allow")),
|
|
100
|
+
cancelButton: ( localize(13933, "Don't Allow")),
|
|
101
101
|
});
|
|
102
102
|
enabled = confirmationResult.confirmed;
|
|
103
103
|
}
|
|
@@ -22,7 +22,7 @@ let ExtensionManagementServerService = class ExtensionManagementServerService {
|
|
|
22
22
|
this.remoteExtensionManagementServer = {
|
|
23
23
|
id: 'remote',
|
|
24
24
|
extensionManagementService,
|
|
25
|
-
get label() { return labelService.getHostLabel(Schemas.vscodeRemote, remoteAgentConnection.remoteAuthority) || ( localize(
|
|
25
|
+
get label() { return labelService.getHostLabel(Schemas.vscodeRemote, remoteAgentConnection.remoteAuthority) || ( localize(13934, "Remote")); },
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
28
|
if (isWeb) {
|
|
@@ -30,7 +30,7 @@ let ExtensionManagementServerService = class ExtensionManagementServerService {
|
|
|
30
30
|
this.webExtensionManagementServer = {
|
|
31
31
|
id: 'web',
|
|
32
32
|
extensionManagementService,
|
|
33
|
-
label: ( localize(
|
|
33
|
+
label: ( localize(13935, "Browser")),
|
|
34
34
|
};
|
|
35
35
|
}
|
|
36
36
|
}
|
package/vscode/src/vs/workbench/services/extensionManagement/common/extensionManagementService.js
CHANGED
|
@@ -222,7 +222,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
222
222
|
getDependentsErrorMessage(extension, dependents) {
|
|
223
223
|
if (dependents.length === 1) {
|
|
224
224
|
return localize(
|
|
225
|
-
|
|
225
|
+
13936,
|
|
226
226
|
"Cannot uninstall extension '{0}'. Extension '{1}' depends on this.",
|
|
227
227
|
extension.manifest.displayName || extension.manifest.name,
|
|
228
228
|
dependents[0].manifest.displayName || dependents[0].manifest.name
|
|
@@ -230,7 +230,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
230
230
|
}
|
|
231
231
|
if (dependents.length === 2) {
|
|
232
232
|
return localize(
|
|
233
|
-
|
|
233
|
+
13937,
|
|
234
234
|
"Cannot uninstall extension '{0}'. Extensions '{1}' and '{2}' depend on this.",
|
|
235
235
|
extension.manifest.displayName || extension.manifest.name,
|
|
236
236
|
dependents[0].manifest.displayName || dependents[0].manifest.name,
|
|
@@ -238,7 +238,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
238
238
|
);
|
|
239
239
|
}
|
|
240
240
|
return localize(
|
|
241
|
-
|
|
241
|
+
13938,
|
|
242
242
|
"Cannot uninstall extension '{0}'. Extensions '{1}', '{2}' and others depend on this.",
|
|
243
243
|
extension.manifest.displayName || extension.manifest.name,
|
|
244
244
|
dependents[0].manifest.displayName || dependents[0].manifest.name,
|
|
@@ -348,7 +348,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
348
348
|
}
|
|
349
349
|
const manifest = await this.extensionGalleryService.getManifest(gallery, CancellationToken.None);
|
|
350
350
|
if (!manifest) {
|
|
351
|
-
return ( new MarkdownString()).appendText(( localize(
|
|
351
|
+
return ( new MarkdownString()).appendText(( localize(13939, "Manifest is not found")));
|
|
352
352
|
}
|
|
353
353
|
if (this.extensionManagementServerService.remoteExtensionManagementServer
|
|
354
354
|
&& (await this.extensionManagementServerService.remoteExtensionManagementServer.extensionManagementService.canInstall(gallery)) === true
|
|
@@ -361,7 +361,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
361
361
|
return true;
|
|
362
362
|
}
|
|
363
363
|
return ( new MarkdownString()).appendText(( localize(
|
|
364
|
-
|
|
364
|
+
13940,
|
|
365
365
|
"Cannot install the '{0}' extension because it is not available in this setup.",
|
|
366
366
|
gallery.displayName || gallery.name
|
|
367
367
|
)));
|
|
@@ -377,7 +377,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
377
377
|
return true;
|
|
378
378
|
}
|
|
379
379
|
return ( new MarkdownString()).appendText(( localize(
|
|
380
|
-
|
|
380
|
+
13940,
|
|
381
381
|
"Cannot install the '{0}' extension because it is not available in this setup.",
|
|
382
382
|
extension.manifest.displayName ?? extension.identifier.id
|
|
383
383
|
)));
|
|
@@ -406,7 +406,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
406
406
|
const manifest = await this.extensionGalleryService.getManifest(extension, CancellationToken.None);
|
|
407
407
|
if (!manifest) {
|
|
408
408
|
throw ( new Error(( localize(
|
|
409
|
-
|
|
409
|
+
13941,
|
|
410
410
|
"Installing Extension {0} failed: Manifest is not found.",
|
|
411
411
|
extension.displayName || extension.name
|
|
412
412
|
))));
|
|
@@ -425,7 +425,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
425
425
|
const manifest = await this.extensionGalleryService.getManifest(extension, CancellationToken.None);
|
|
426
426
|
if (!manifest) {
|
|
427
427
|
throw ( new Error(( localize(
|
|
428
|
-
|
|
428
|
+
13941,
|
|
429
429
|
"Installing Extension {0} failed: Manifest is not found.",
|
|
430
430
|
extension.displayName || extension.name
|
|
431
431
|
))));
|
|
@@ -473,7 +473,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
473
473
|
const manifest = await this.extensionGalleryService.getManifest(gallery, CancellationToken.None);
|
|
474
474
|
if (!manifest) {
|
|
475
475
|
throw ( new Error(( localize(
|
|
476
|
-
|
|
476
|
+
13941,
|
|
477
477
|
"Installing Extension {0} failed: Manifest is not found.",
|
|
478
478
|
gallery.displayName || gallery.name
|
|
479
479
|
))));
|
|
@@ -577,7 +577,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
577
577
|
const manifest = await this.extensionGalleryService.getManifest(gallery, CancellationToken.None);
|
|
578
578
|
if (!manifest) {
|
|
579
579
|
return Promise.reject(( localize(
|
|
580
|
-
|
|
580
|
+
13941,
|
|
581
581
|
"Installing Extension {0} failed: Manifest is not found.",
|
|
582
582
|
gallery.displayName || gallery.name
|
|
583
583
|
)));
|
|
@@ -627,7 +627,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
627
627
|
for (const server of servers) {
|
|
628
628
|
if (!installableServers.includes(server)) {
|
|
629
629
|
const error = ( new Error(( localize(
|
|
630
|
-
|
|
630
|
+
13942,
|
|
631
631
|
"Cannot install the '{0}' extension because it is not available in the '{1}' setup.",
|
|
632
632
|
gallery.displayName || gallery.name,
|
|
633
633
|
server.label
|
|
@@ -651,7 +651,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
651
651
|
}
|
|
652
652
|
if (!servers.length) {
|
|
653
653
|
const error = ( new Error(( localize(
|
|
654
|
-
|
|
654
|
+
13940,
|
|
655
655
|
"Cannot install the '{0}' extension because it is not available in this setup.",
|
|
656
656
|
gallery.displayName || gallery.name
|
|
657
657
|
))));
|
|
@@ -689,24 +689,24 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
689
689
|
if (this.isExtensionsSyncEnabled()) {
|
|
690
690
|
const { result } = await this.dialogService.prompt({
|
|
691
691
|
type: Severity.Info,
|
|
692
|
-
message: extensions.length === 1 ? ( localize(
|
|
692
|
+
message: extensions.length === 1 ? ( localize(13943, "Install Extension")) : ( localize(13944, "Install Extensions")),
|
|
693
693
|
detail: extensions.length === 1
|
|
694
694
|
? ( localize(
|
|
695
|
-
|
|
695
|
+
13945,
|
|
696
696
|
"Would you like to install and synchronize '{0}' extension across your devices?",
|
|
697
697
|
extensions[0].displayName
|
|
698
698
|
))
|
|
699
699
|
: ( localize(
|
|
700
|
-
|
|
700
|
+
13946,
|
|
701
701
|
"Would you like to install and synchronize extensions across your devices?"
|
|
702
702
|
)),
|
|
703
703
|
buttons: [
|
|
704
704
|
{
|
|
705
|
-
label: ( localize(
|
|
705
|
+
label: ( localize(13947, "&&Install")),
|
|
706
706
|
run: () => false
|
|
707
707
|
},
|
|
708
708
|
{
|
|
709
|
-
label: ( localize(
|
|
709
|
+
label: ( localize(13948, "Install (Do &¬ sync)")),
|
|
710
710
|
run: () => true
|
|
711
711
|
}
|
|
712
712
|
],
|
|
@@ -755,7 +755,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
755
755
|
const manifest = await this.extensionGalleryService.getManifest(extension, CancellationToken.None);
|
|
756
756
|
if (!manifest) {
|
|
757
757
|
throw ( new Error(( localize(
|
|
758
|
-
|
|
758
|
+
13941,
|
|
759
759
|
"Installing Extension {0} failed: Manifest is not found.",
|
|
760
760
|
extension.displayName || extension.name
|
|
761
761
|
))));
|
|
@@ -787,7 +787,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
787
787
|
const unverfiiedPublishers = allPublishers.filter(p => !p.publisherDomain?.verified);
|
|
788
788
|
const verifiedPublishers = allPublishers.filter(p => p.publisherDomain?.verified);
|
|
789
789
|
const installButton = {
|
|
790
|
-
label: allPublishers.length > 1 ? ( localize(
|
|
790
|
+
label: allPublishers.length > 1 ? ( localize(13949, "Trust Publishers & &&Install")) : ( localize(13950, "Trust Publisher & &&Install")),
|
|
791
791
|
run: () => {
|
|
792
792
|
this.telemetryService.publicLog2('extensions:trustPublisher', { action: 'trust', extensionId: ( untrustedExtensions.map(e => e.identifier.id)).join(',') });
|
|
793
793
|
this.trustPublishers(...( allPublishers.map(
|
|
@@ -796,7 +796,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
796
796
|
}
|
|
797
797
|
};
|
|
798
798
|
const learnMoreButton = {
|
|
799
|
-
label: ( localize(
|
|
799
|
+
label: ( localize(13951, "&&Learn More")),
|
|
800
800
|
run: () => {
|
|
801
801
|
this.telemetryService.publicLog2('extensions:trustPublisher', { action: 'learn', extensionId: ( untrustedExtensions.map(e => e.identifier.id)).join(',') });
|
|
802
802
|
this.instantiationService.invokeFunction(accessor => accessor.get(ICommandService).executeCommand('vscode.open', ( URI.parse('https://aka.ms/vscode-extension-security'))));
|
|
@@ -809,19 +809,19 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
809
809
|
const unverifiedLink = 'https://aka.ms/vscode-verify-publisher';
|
|
810
810
|
const title = allPublishers.length === 1
|
|
811
811
|
? ( localize(
|
|
812
|
-
|
|
812
|
+
13952,
|
|
813
813
|
"Do you trust the publisher \"{0}\"?",
|
|
814
814
|
allPublishers[0].publisherDisplayName
|
|
815
815
|
))
|
|
816
816
|
: allPublishers.length === 2
|
|
817
817
|
? ( localize(
|
|
818
|
-
|
|
818
|
+
13953,
|
|
819
819
|
"Do you trust publishers \"{0}\" and \"{1}\"?",
|
|
820
820
|
allPublishers[0].publisherDisplayName,
|
|
821
821
|
allPublishers[1].publisherDisplayName
|
|
822
822
|
))
|
|
823
823
|
: ( localize(
|
|
824
|
-
|
|
824
|
+
13954,
|
|
825
825
|
"Do you trust the publisher \"{0}\" and {1} others?",
|
|
826
826
|
allPublishers[0].publisherDisplayName,
|
|
827
827
|
allPublishers.length - 1
|
|
@@ -832,7 +832,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
832
832
|
const manifest = untrustedExtensionManifests[0];
|
|
833
833
|
if (otherUntrustedPublishers.length) {
|
|
834
834
|
customMessage.appendMarkdown(( localize(
|
|
835
|
-
|
|
835
|
+
13955,
|
|
836
836
|
"The extension {0} is published by {1}.",
|
|
837
837
|
`[${extension.displayName}](${extension.detailsLink})`,
|
|
838
838
|
getPublisherLink(extension)
|
|
@@ -841,7 +841,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
841
841
|
const commandUri = ( createCommandUri('extension.open', extension.identifier.id, manifest.extensionPack?.length ? 'extensionPack' : 'dependencies').toString());
|
|
842
842
|
if (otherUntrustedPublishers.length === 1) {
|
|
843
843
|
customMessage.appendMarkdown(( localize(
|
|
844
|
-
|
|
844
|
+
13956,
|
|
845
845
|
"Installing this extension will also install [extensions]({0}) published by {1}.",
|
|
846
846
|
commandUri,
|
|
847
847
|
getPublisherLink(otherUntrustedPublishers[0])
|
|
@@ -849,7 +849,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
849
849
|
}
|
|
850
850
|
else {
|
|
851
851
|
customMessage.appendMarkdown(( localize(
|
|
852
|
-
|
|
852
|
+
13957,
|
|
853
853
|
"Installing this extension will also install [extensions]({0}) published by {1} and {2}.",
|
|
854
854
|
commandUri,
|
|
855
855
|
( otherUntrustedPublishers.slice(0, otherUntrustedPublishers.length - 1).map(p => getPublisherLink(p))).join(', '),
|
|
@@ -858,13 +858,13 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
858
858
|
}
|
|
859
859
|
customMessage.appendMarkdown(' ');
|
|
860
860
|
customMessage.appendMarkdown(( localize(
|
|
861
|
-
|
|
861
|
+
13958,
|
|
862
862
|
"This is the first time you're installing extensions from these publishers."
|
|
863
863
|
)));
|
|
864
864
|
}
|
|
865
865
|
else {
|
|
866
866
|
customMessage.appendMarkdown(( localize(
|
|
867
|
-
|
|
867
|
+
13959,
|
|
868
868
|
"The extension {0} is published by {1}. This is the first extension you're installing from this publisher.",
|
|
869
869
|
`[${extension.displayName}](${extension.detailsLink})`,
|
|
870
870
|
getPublisherLink(extension)
|
|
@@ -873,7 +873,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
873
873
|
}
|
|
874
874
|
else {
|
|
875
875
|
customMessage.appendMarkdown(( localize(
|
|
876
|
-
|
|
876
|
+
13960,
|
|
877
877
|
"This is the first time you're installing extensions from publishers {0} and {1}.",
|
|
878
878
|
getPublisherLink(allPublishers[0]),
|
|
879
879
|
getPublisherLink(allPublishers[allPublishers.length - 1])
|
|
@@ -883,7 +883,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
883
883
|
for (const publisher of verifiedPublishers) {
|
|
884
884
|
customMessage.appendText('\n');
|
|
885
885
|
const publisherVerifiedMessage = ( localize(
|
|
886
|
-
|
|
886
|
+
13961,
|
|
887
887
|
"{0} has verified ownership of {1}.",
|
|
888
888
|
getPublisherLink(publisher),
|
|
889
889
|
`[$(link-external) ${( URI.parse(publisher.publisherDomain.link)).authority}](${publisher.publisherDomain.link})`
|
|
@@ -894,7 +894,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
894
894
|
customMessage.appendText('\n');
|
|
895
895
|
if (unverfiiedPublishers.length === 1) {
|
|
896
896
|
customMessage.appendMarkdown(`$(${Codicon.unverified.id}) ${( localize(
|
|
897
|
-
|
|
897
|
+
13962,
|
|
898
898
|
"{0} is [**not** verified]({1}).",
|
|
899
899
|
getPublisherLink(unverfiiedPublishers[0]),
|
|
900
900
|
unverifiedLink
|
|
@@ -902,7 +902,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
902
902
|
}
|
|
903
903
|
else {
|
|
904
904
|
customMessage.appendMarkdown(`$(${Codicon.unverified.id}) ${( localize(
|
|
905
|
-
|
|
905
|
+
13963,
|
|
906
906
|
"{0} and {1} are [**not** verified]({2}).",
|
|
907
907
|
( unverfiiedPublishers.slice(0, unverfiiedPublishers.length - 1).map(p => getPublisherLink(p))).join(', '),
|
|
908
908
|
getPublisherLink(unverfiiedPublishers[unverfiiedPublishers.length - 1]),
|
|
@@ -913,19 +913,19 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
913
913
|
}
|
|
914
914
|
else {
|
|
915
915
|
customMessage.appendText('\n');
|
|
916
|
-
customMessage.appendMarkdown(`$(${Codicon.unverified.id}) ${( localize(
|
|
916
|
+
customMessage.appendMarkdown(`$(${Codicon.unverified.id}) ${( localize(13964, "All publishers are [**not** verified]({0}).", unverifiedLink))}`);
|
|
917
917
|
}
|
|
918
918
|
customMessage.appendText('\n');
|
|
919
919
|
if (allPublishers.length > 1) {
|
|
920
920
|
customMessage.appendMarkdown(( localize(
|
|
921
|
-
|
|
921
|
+
13965,
|
|
922
922
|
"{0} has no control over the behavior of third-party extensions, including how they manage your personal data. Proceed only if you trust the publishers.",
|
|
923
923
|
this.productService.nameLong
|
|
924
924
|
)));
|
|
925
925
|
}
|
|
926
926
|
else {
|
|
927
927
|
customMessage.appendMarkdown(( localize(
|
|
928
|
-
|
|
928
|
+
13966,
|
|
929
929
|
"{0} has no control over the behavior of third-party extensions, including how they manage your personal data. Proceed only if you trust the publisher.",
|
|
930
930
|
this.productService.nameLong
|
|
931
931
|
)));
|
|
@@ -1004,13 +1004,13 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
1004
1004
|
async checkForWorkspaceTrust(manifest, requireTrust) {
|
|
1005
1005
|
if (requireTrust || this.extensionManifestPropertiesService.getExtensionUntrustedWorkspaceSupportType(manifest) === false) {
|
|
1006
1006
|
const buttons = [];
|
|
1007
|
-
buttons.push({ label: ( localize(
|
|
1007
|
+
buttons.push({ label: ( localize(13967, "Trust Workspace & Install")), type: 'ContinueWithTrust' });
|
|
1008
1008
|
if (!requireTrust) {
|
|
1009
|
-
buttons.push({ label: ( localize(
|
|
1009
|
+
buttons.push({ label: ( localize(13968, "Install")), type: 'ContinueWithoutTrust' });
|
|
1010
1010
|
}
|
|
1011
|
-
buttons.push({ label: ( localize(
|
|
1011
|
+
buttons.push({ label: ( localize(13969, "Learn More")), type: 'Manage' });
|
|
1012
1012
|
const trustState = await this.workspaceTrustRequestService.requestWorkspaceTrust({
|
|
1013
|
-
message: ( localize(
|
|
1013
|
+
message: ( localize(13970, "Enabling this extension requires a trusted workspace.")),
|
|
1014
1014
|
buttons
|
|
1015
1015
|
});
|
|
1016
1016
|
if (trustState === undefined) {
|
|
@@ -1034,7 +1034,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
1034
1034
|
throw ( new ExtensionManagementError('Not supported in Web', ExtensionManagementErrorCode.Unsupported));
|
|
1035
1035
|
}
|
|
1036
1036
|
}
|
|
1037
|
-
const productName = ( localize(
|
|
1037
|
+
const productName = ( localize(13971, "{0} for the Web", this.productService.nameLong));
|
|
1038
1038
|
const virtualWorkspaceSupport = this.extensionManifestPropertiesService.getExtensionVirtualWorkspaceSupportType(manifest);
|
|
1039
1039
|
const virtualWorkspaceSupportReason = getWorkspaceSupportTypeMessage(manifest.capabilities?.virtualWorkspaces);
|
|
1040
1040
|
const hasLimitedSupport = virtualWorkspaceSupport === 'limited' || !!virtualWorkspaceSupportReason;
|
|
@@ -1042,7 +1042,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
1042
1042
|
return;
|
|
1043
1043
|
}
|
|
1044
1044
|
const limitedSupportMessage = ( localize(
|
|
1045
|
-
|
|
1045
|
+
13972,
|
|
1046
1046
|
"'{0}' has limited functionality in {1}.",
|
|
1047
1047
|
extension.displayName || extension.identifier.id,
|
|
1048
1048
|
productName
|
|
@@ -1051,16 +1051,16 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
1051
1051
|
let buttons = [];
|
|
1052
1052
|
let detail;
|
|
1053
1053
|
const installAnywayButton = {
|
|
1054
|
-
label: ( localize(
|
|
1054
|
+
label: ( localize(13973, "&&Install Anyway")),
|
|
1055
1055
|
run: () => { }
|
|
1056
1056
|
};
|
|
1057
1057
|
const showExtensionsButton = {
|
|
1058
|
-
label: ( localize(
|
|
1058
|
+
label: ( localize(13974, "&&Show Extensions")),
|
|
1059
1059
|
run: () => this.instantiationService.invokeFunction(accessor => accessor.get(ICommandService).executeCommand('extension.open', extension.identifier.id, 'extensionPack'))
|
|
1060
1060
|
};
|
|
1061
1061
|
if (nonWebExtensions.length && hasLimitedSupport) {
|
|
1062
1062
|
message = limitedSupportMessage;
|
|
1063
|
-
detail = `${virtualWorkspaceSupportReason ? `${virtualWorkspaceSupportReason}\n` : ''}${( localize(
|
|
1063
|
+
detail = `${virtualWorkspaceSupportReason ? `${virtualWorkspaceSupportReason}\n` : ''}${( localize(13975, "Contains extensions which are not supported."))}`;
|
|
1064
1064
|
buttons = [
|
|
1065
1065
|
installAnywayButton,
|
|
1066
1066
|
showExtensionsButton
|
|
@@ -1073,7 +1073,7 @@ let ExtensionManagementService = class ExtensionManagementService extends Common
|
|
|
1073
1073
|
}
|
|
1074
1074
|
else {
|
|
1075
1075
|
message = ( localize(
|
|
1076
|
-
|
|
1076
|
+
13976,
|
|
1077
1077
|
"'{0}' contains extensions which are not supported in {1}.",
|
|
1078
1078
|
extension.displayName || extension.identifier.id,
|
|
1079
1079
|
productName
|
|
@@ -1360,7 +1360,7 @@ let WorkspaceExtensionsManagementService = class WorkspaceExtensionsManagementSe
|
|
|
1360
1360
|
if (extension.manifest.main) {
|
|
1361
1361
|
if (!(await this.fileService.exists(this.uriIdentityService.extUri.joinPath(extension.location, extension.manifest.main)))) {
|
|
1362
1362
|
isValid = false;
|
|
1363
|
-
validations.push([Severity.Error, ( localize(
|
|
1363
|
+
validations.push([Severity.Error, ( localize(13977, "Cannot activate because {0} not found", extension.manifest.main))]);
|
|
1364
1364
|
}
|
|
1365
1365
|
}
|
|
1366
1366
|
return {
|