diff --git a/src/vs/platform/extensions/common/extensions.ts b/src/vs/platform/extensions/common/extensions.ts index a1eae1bb07d..0bfebc689dd 100644 --- a/src/vs/platform/extensions/common/extensions.ts +++ b/src/vs/platform/extensions/common/extensions.ts @@ -257,31 +257,33 @@ export const EXTENSION_CATEGORIES = [ 'Other', ]; -export interface IExtensionManifest { - readonly name: string; - readonly displayName?: string; - readonly publisher: string; - readonly version: string; - readonly engines: { readonly vscode: string }; - readonly description?: string; - readonly main?: string; - readonly browser?: string; - readonly icon?: string; - readonly categories?: string[]; - readonly keywords?: string[]; - readonly activationEvents?: string[]; - readonly extensionDependencies?: string[]; - readonly extensionPack?: string[]; - readonly extensionKind?: ExtensionKind | ExtensionKind[]; - readonly contributes?: IExtensionContributions; - readonly repository?: { url: string }; - readonly bugs?: { url: string }; - readonly enabledApiProposals?: readonly string[]; - readonly api?: string; - readonly scripts?: { [key: string]: string }; - readonly capabilities?: IExtensionCapabilities; +export interface IRelaxedExtensionManifest { + name: string; + displayName?: string; + publisher: string; + version: string; + engines: { readonly vscode: string }; + description?: string; + main?: string; + browser?: string; + icon?: string; + categories?: string[]; + keywords?: string[]; + activationEvents?: string[]; + extensionDependencies?: string[]; + extensionPack?: string[]; + extensionKind?: ExtensionKind | ExtensionKind[]; + contributes?: IExtensionContributions; + repository?: { url: string }; + bugs?: { url: string }; + enabledApiProposals?: readonly string[]; + api?: string; + scripts?: { [key: string]: string }; + capabilities?: IExtensionCapabilities; } +export type IExtensionManifest = Readonly; + export const enum ExtensionType { System, User @@ -375,16 +377,19 @@ export class ExtensionIdentifier { } } -export interface IExtensionDescription extends IExtensionManifest { - readonly identifier: ExtensionIdentifier; - readonly uuid?: string; - readonly targetPlatform: TargetPlatform; - readonly isBuiltin: boolean; - readonly isUserBuiltin: boolean; - readonly isUnderDevelopment: boolean; - readonly extensionLocation: URI; +export interface IRelaxedExtensionDescription extends IRelaxedExtensionManifest { + id?: string; + identifier: ExtensionIdentifier; + uuid?: string; + targetPlatform: TargetPlatform; + isBuiltin: boolean; + isUserBuiltin: boolean; + isUnderDevelopment: boolean; + extensionLocation: URI; } +export type IExtensionDescription = Readonly; + export function isLanguagePackExtension(manifest: IExtensionManifest): boolean { return manifest.contributes && manifest.contributes.localizations ? manifest.contributes.localizations.length > 0 : false; } diff --git a/src/vs/workbench/services/extensions/common/extensionPoints.ts b/src/vs/workbench/services/extensions/common/extensionPoints.ts index eaca238a299..ca143db3b94 100644 --- a/src/vs/workbench/services/extensions/common/extensionPoints.ts +++ b/src/vs/workbench/services/extensions/common/extensionPoints.ts @@ -14,7 +14,7 @@ import * as types from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { getGalleryExtensionId, groupByExtension, getExtensionId, ExtensionKey } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { isValidExtensionVersion } from 'vs/platform/extensions/common/extensionValidator'; -import { ExtensionIdentifier, IExtensionDescription, TargetPlatform, UNDEFINED_PUBLISHER } from 'vs/platform/extensions/common/extensions'; +import { ExtensionIdentifier, IExtensionDescription, IRelaxedExtensionDescription, TargetPlatform, UNDEFINED_PUBLISHER } from 'vs/platform/extensions/common/extensions'; const MANIFEST_FILE = 'package.json'; @@ -115,9 +115,15 @@ abstract class ExtensionManifestHandler { } } +interface ILocalExtensionMetadata { + id?: string; + targetPlatform?: TargetPlatform; + isBuiltin?: boolean; +} + class ExtensionManifestParser extends ExtensionManifestHandler { - private static _fastParseJSON(text: string, errors: json.ParseError[]): any { + private static _fastParseJSON(text: string, errors: json.ParseError[]): T { try { return JSON.parse(text); } catch (err) { @@ -126,10 +132,10 @@ class ExtensionManifestParser extends ExtensionManifestHandler { } } - public parse(): Promise { + public parse(): Promise { return this._host.readFile(this._absoluteManifestPath).then((manifestContents) => { const errors: json.ParseError[] = []; - const manifest = ExtensionManifestParser._fastParseJSON(manifestContents, errors); + const manifest = ExtensionManifestParser._fastParseJSON(manifestContents, errors); if (json.getNodeType(manifest) !== 'object') { this._error(this._absoluteFolderPath, nls.localize('jsonParseInvalidType', "Invalid manifest file {0}: Not an JSON object.", this._absoluteManifestPath)); } else if (errors.length === 0) { @@ -360,25 +366,6 @@ class ExtensionManifestNLSReplacer extends ExtensionManifestHandler { } } -// Relax the readonly properties here, it is the one place where we check and normalize values -export interface IRelaxedExtensionDescription { - id: string; - uuid?: string; - targetPlatform: TargetPlatform; - identifier: ExtensionIdentifier; - name: string; - version: string; - publisher: string; - isBuiltin: boolean; - isUserBuiltin: boolean; - isUnderDevelopment: boolean; - extensionLocation: URI; - engines: { - vscode: string; - }; - main?: string; -} - class ExtensionManifestValidator extends ExtensionManifestHandler { validate(_extensionDescription: IExtensionDescription): IExtensionDescription | null { let extensionDescription = _extensionDescription; diff --git a/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts b/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts index 18c5b791334..6d55c713a8b 100644 --- a/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts +++ b/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts @@ -12,11 +12,11 @@ import * as platform from 'vs/base/common/platform'; import { joinPath, originalFSPath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService'; -import { BUILTIN_MANIFEST_CACHE_FILE, MANIFEST_CACHE_FOLDER, USER_MANIFEST_CACHE_FILE, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { BUILTIN_MANIFEST_CACHE_FILE, MANIFEST_CACHE_FOLDER, USER_MANIFEST_CACHE_FILE, IExtensionDescription, IRelaxedExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { IProductService } from 'vs/platform/product/common/productService'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IHostService } from 'vs/workbench/services/host/browser/host'; -import { Translations, ILog, ExtensionScanner, ExtensionScannerInput, IExtensionReference, IExtensionResolver, IExtensionScannerHost, IRelaxedExtensionDescription } from 'vs/workbench/services/extensions/common/extensionPoints'; +import { Translations, ILog, ExtensionScanner, ExtensionScannerInput, IExtensionReference, IExtensionResolver, IExtensionScannerHost } from 'vs/workbench/services/extensions/common/extensionPoints'; import { dedupExtensions } from 'vs/workbench/services/extensions/common/extensionsUtil'; import { FileOperationResult, IFileService, toFileOperationResult } from 'vs/platform/files/common/files'; import { VSBuffer } from 'vs/base/common/buffer';