mirror of
https://github.com/Microsoft/vscode
synced 2024-09-28 15:32:07 +00:00
parent
01ef3f7526
commit
393e1222ca
|
@ -657,10 +657,7 @@ class ExtensionsScanner extends Disposable {
|
|||
const type = metadata?.isSystem ? ExtensionType.System : input.type;
|
||||
const isBuiltin = type === ExtensionType.System || !!metadata?.isBuiltin;
|
||||
manifest = await this.translateManifest(input.location, manifest, ExtensionScannerInput.createNlsConfiguration(input));
|
||||
if (manifest.enabledApiProposals && this.extensionsEnabledWithApiProposalVersion?.includes(id.toLowerCase())) {
|
||||
manifest.enabledApiProposals = parseEnabledApiProposalNames([...manifest.enabledApiProposals]);
|
||||
}
|
||||
const extension: IRelaxedScannedExtension = {
|
||||
let extension: IRelaxedScannedExtension = {
|
||||
type,
|
||||
identifier,
|
||||
manifest,
|
||||
|
@ -672,7 +669,13 @@ class ExtensionsScanner extends Disposable {
|
|||
isValid: true,
|
||||
validations: []
|
||||
};
|
||||
return input.validate ? this.validate(extension, input) : extension;
|
||||
if (input.validate) {
|
||||
extension = this.validate(extension, input);
|
||||
}
|
||||
if (manifest.enabledApiProposals && this.extensionsEnabledWithApiProposalVersion.includes(id.toLowerCase())) {
|
||||
manifest.enabledApiProposals = parseEnabledApiProposalNames([...manifest.enabledApiProposals]);
|
||||
}
|
||||
return extension;
|
||||
}
|
||||
} catch (e) {
|
||||
if (input.type !== ExtensionType.System) {
|
||||
|
@ -684,7 +687,8 @@ class ExtensionsScanner extends Disposable {
|
|||
|
||||
validate(extension: IRelaxedScannedExtension, input: ExtensionScannerInput): IRelaxedScannedExtension {
|
||||
let isValid = true;
|
||||
const validations = validateExtensionManifest(input.productVersion, input.productDate, input.location, extension.manifest, extension.isBuiltin);
|
||||
const validateApiVersion = this.extensionsEnabledWithApiProposalVersion.includes(extension.identifier.id.toLowerCase());
|
||||
const validations = validateExtensionManifest(input.productVersion, input.productDate, input.location, extension.manifest, extension.isBuiltin, validateApiVersion);
|
||||
for (const [severity, message] of validations) {
|
||||
if (severity === Severity.Error) {
|
||||
isValid = false;
|
||||
|
|
|
@ -240,7 +240,7 @@ export function isValidVersion(_inputVersion: string | INormalizedVersion, _inpu
|
|||
|
||||
type ProductDate = string | Date | undefined;
|
||||
|
||||
export function validateExtensionManifest(productVersion: string, productDate: ProductDate, extensionLocation: URI, extensionManifest: IExtensionManifest, extensionIsBuiltin: boolean): readonly [Severity, string][] {
|
||||
export function validateExtensionManifest(productVersion: string, productDate: ProductDate, extensionLocation: URI, extensionManifest: IExtensionManifest, extensionIsBuiltin: boolean, validateApiVersion: boolean): readonly [Severity, string][] {
|
||||
const validations: [Severity, string][] = [];
|
||||
if (typeof extensionManifest.publisher !== 'undefined' && typeof extensionManifest.publisher !== 'string') {
|
||||
validations.push([Severity.Error, nls.localize('extensionDescription.publisher', "property publisher must be of type `string`.")]);
|
||||
|
@ -322,7 +322,7 @@ export function validateExtensionManifest(productVersion: string, productDate: P
|
|||
}
|
||||
}
|
||||
|
||||
if (extensionManifest.enabledApiProposals?.length) {
|
||||
if (validateApiVersion && extensionManifest.enabledApiProposals?.length) {
|
||||
const incompatibleNotices: string[] = [];
|
||||
if (!areApiProposalsCompatible([...extensionManifest.enabledApiProposals], incompatibleNotices)) {
|
||||
for (const notice of incompatibleNotices) {
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { IBuiltinExtensionsScannerService, ExtensionType, IExtensionIdentifier, IExtension, IExtensionManifest, TargetPlatform } from 'vs/platform/extensions/common/extensions';
|
||||
import { IBuiltinExtensionsScannerService, ExtensionType, IExtensionIdentifier, IExtension, IExtensionManifest, TargetPlatform, IRelaxedExtensionManifest, parseEnabledApiProposalNames } from 'vs/platform/extensions/common/extensions';
|
||||
import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService';
|
||||
import { IScannedExtension, IWebExtensionsScannerService, ScanOptions } from 'vs/workbench/services/extensionManagement/common/extensionManagement';
|
||||
import { isWeb, Language } from 'vs/base/common/platform';
|
||||
|
@ -99,6 +99,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten
|
|||
private readonly systemExtensionsCacheResource: URI | undefined = undefined;
|
||||
private readonly customBuiltinExtensionsCacheResource: URI | undefined = undefined;
|
||||
private readonly resourcesAccessQueueMap = new ResourceMap<Queue<IWebExtension[]>>();
|
||||
private readonly extensionsEnabledWithApiProposalVersion: string[];
|
||||
|
||||
constructor(
|
||||
@IBrowserWorkbenchEnvironmentService private readonly environmentService: IBrowserWorkbenchEnvironmentService,
|
||||
|
@ -123,6 +124,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten
|
|||
// Eventually update caches
|
||||
lifecycleService.when(LifecyclePhase.Eventually).then(() => this.updateCaches());
|
||||
}
|
||||
this.extensionsEnabledWithApiProposalVersion = productService.extensionsEnabledWithApiProposalVersion?.map(id => id.toLowerCase()) ?? [];
|
||||
}
|
||||
|
||||
private _customBuiltinExtensionsInfoPromise: Promise<{ extensions: ExtensionInfo[]; extensionsToMigrate: [string, string][]; extensionLocations: URI[]; extensionGalleryResources: URI[] }> | undefined;
|
||||
|
@ -735,7 +737,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten
|
|||
|
||||
private async toScannedExtension(webExtension: IWebExtension, isBuiltin: boolean, type: ExtensionType = ExtensionType.User): Promise<IScannedExtension> {
|
||||
const validations: [Severity, string][] = [];
|
||||
let manifest: IExtensionManifest | undefined = webExtension.manifest;
|
||||
let manifest: IRelaxedExtensionManifest | undefined = webExtension.manifest;
|
||||
|
||||
if (!manifest) {
|
||||
try {
|
||||
|
@ -766,7 +768,8 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten
|
|||
|
||||
const uuid = (<IGalleryMetadata | undefined>webExtension.metadata)?.id;
|
||||
|
||||
validations.push(...validateExtensionManifest(this.productService.version, this.productService.date, webExtension.location, manifest, false));
|
||||
const validateApiVersion = this.extensionsEnabledWithApiProposalVersion.includes(webExtension.identifier.id.toLowerCase());
|
||||
validations.push(...validateExtensionManifest(this.productService.version, this.productService.date, webExtension.location, manifest, false, validateApiVersion));
|
||||
let isValid = true;
|
||||
for (const [severity, message] of validations) {
|
||||
if (severity === Severity.Error) {
|
||||
|
@ -775,6 +778,10 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten
|
|||
}
|
||||
}
|
||||
|
||||
if (manifest.enabledApiProposals && validateApiVersion) {
|
||||
manifest.enabledApiProposals = parseEnabledApiProposalNames([...manifest.enabledApiProposals]);
|
||||
}
|
||||
|
||||
return {
|
||||
identifier: { id: webExtension.identifier.id, uuid: webExtension.identifier.uuid || uuid },
|
||||
location: webExtension.location,
|
||||
|
@ -800,7 +807,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten
|
|||
return [];
|
||||
}
|
||||
|
||||
private async translateManifest(manifest: IExtensionManifest, nlsURL: ITranslations | URI, fallbackNLS?: ITranslations | URI): Promise<IExtensionManifest> {
|
||||
private async translateManifest(manifest: IExtensionManifest, nlsURL: ITranslations | URI, fallbackNLS?: ITranslations | URI): Promise<IRelaxedExtensionManifest> {
|
||||
try {
|
||||
const translations = URI.isUri(nlsURL) ? await this.getTranslations(nlsURL) : nlsURL;
|
||||
const fallbackTranslations = URI.isUri(fallbackNLS) ? await this.getTranslations(fallbackNLS) : fallbackNLS;
|
||||
|
|
Loading…
Reference in a new issue