Reduce type duplication

This commit is contained in:
Alex Dima
2022-03-15 16:06:25 +01:00
parent f736be9353
commit cd289fc8c3
3 changed files with 48 additions and 56 deletions

View File

@@ -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<IRelaxedExtensionManifest>;
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<IRelaxedExtensionDescription>;
export function isLanguagePackExtension(manifest: IExtensionManifest): boolean {
return manifest.contributes && manifest.contributes.localizations ? manifest.contributes.localizations.length > 0 : false;
}

View File

@@ -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<T>(text: string, errors: json.ParseError[]): T {
try {
return JSON.parse(text);
} catch (err) {
@@ -126,10 +132,10 @@ class ExtensionManifestParser extends ExtensionManifestHandler {
}
}
public parse(): Promise<IExtensionDescription> {
public parse(): Promise<IExtensionDescription | null> {
return this._host.readFile(this._absoluteManifestPath).then((manifestContents) => {
const errors: json.ParseError[] = [];
const manifest = ExtensionManifestParser._fastParseJSON(manifestContents, errors);
const manifest = ExtensionManifestParser._fastParseJSON<IRelaxedExtensionDescription & { __metadata?: ILocalExtensionMetadata }>(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 = <IRelaxedExtensionDescription>_extensionDescription;

View File

@@ -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';