/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
import { Disposable } from "../../../base/common/lifecycle.mjs";
import Severity from "../../../base/common/severity.mjs";
import { URI } from "../../../base/common/uri.mjs";
import { IEnvironmentService } from "../../environment/common/environment.mjs";
import { Metadata } from "./extensionManagement.mjs";
import { ExtensionType, IExtensionManifest, TargetPlatform, IExtensionIdentifier, IRelaxedExtensionManifest, IExtensionDescription } from "../../extensions/common/extensions.mjs";
import { IFileService } from "../../files/common/files.mjs";
import { IInstantiationService } from "../../instantiation/common/instantiation.mjs";
import { ILogService } from "../../log/common/log.mjs";
import { IProductService } from "../../product/common/productService.mjs";
import { Event } from "../../../base/common/event.mjs";
import { IExtensionsProfileScannerService } from "./extensionsProfileScannerService.mjs";
import { IUserDataProfilesService } from "../../userDataProfile/common/userDataProfile.mjs";
import { IUriIdentityService } from "../../uriIdentity/common/uriIdentity.mjs";
export type IScannedExtensionManifest = IRelaxedExtensionManifest & {
    __metadata?: Metadata;
};
interface IRelaxedScannedExtension {
    type: ExtensionType;
    isBuiltin: boolean;
    identifier: IExtensionIdentifier;
    manifest: IRelaxedExtensionManifest;
    location: URI;
    targetPlatform: TargetPlatform;
    metadata: Metadata | undefined;
    isValid: boolean;
    validations: readonly [Severity, string][];
}
export type IScannedExtension = Readonly<IRelaxedScannedExtension> & {
    manifest: IExtensionManifest;
};
export interface Translations {
    [id: string]: string;
}
export declare namespace Translations {
    function equals(a: Translations, b: Translations): boolean;
}
export type ScanOptions = {
    readonly profileLocation?: URI;
    readonly includeInvalid?: boolean;
    readonly includeAllVersions?: boolean;
    readonly includeUninstalled?: boolean;
    readonly checkControlFile?: boolean;
    readonly language?: string;
    readonly useCache?: boolean;
};
export declare const IExtensionsScannerService: import("../../instantiation/common/instantiation.mjs").ServiceIdentifier<IExtensionsScannerService>;
export interface IExtensionsScannerService {
    readonly _serviceBrand: undefined;
    readonly systemExtensionsLocation: URI;
    readonly userExtensionsLocation: URI;
    readonly onDidChangeCache: Event<ExtensionType>;
    getTargetPlatform(): Promise<TargetPlatform>;
    scanAllExtensions(systemScanOptions: ScanOptions, userScanOptions: ScanOptions, includeExtensionsUnderDev: boolean): Promise<IScannedExtension[]>;
    scanSystemExtensions(scanOptions: ScanOptions): Promise<IScannedExtension[]>;
    scanUserExtensions(scanOptions: ScanOptions): Promise<IScannedExtension[]>;
    scanExtensionsUnderDevelopment(scanOptions: ScanOptions, existingExtensions: IScannedExtension[]): Promise<IScannedExtension[]>;
    scanExistingExtension(extensionLocation: URI, extensionType: ExtensionType, scanOptions: ScanOptions): Promise<IScannedExtension | null>;
    scanOneOrMultipleExtensions(extensionLocation: URI, extensionType: ExtensionType, scanOptions: ScanOptions): Promise<IScannedExtension[]>;
    scanMetadata(extensionLocation: URI): Promise<Metadata | undefined>;
    updateMetadata(extensionLocation: URI, metadata: Partial<Metadata>): Promise<void>;
    initializeDefaultProfileExtensions(): Promise<void>;
}
export declare abstract class AbstractExtensionsScannerService extends Disposable implements IExtensionsScannerService {
    readonly systemExtensionsLocation: URI;
    readonly userExtensionsLocation: URI;
    private readonly extensionsControlLocation;
    private readonly cacheLocation;
    private readonly userDataProfilesService;
    protected readonly extensionsProfileScannerService: IExtensionsProfileScannerService;
    protected readonly fileService: IFileService;
    protected readonly logService: ILogService;
    private readonly environmentService;
    private readonly productService;
    private readonly uriIdentityService;
    private readonly instantiationService;
    readonly _serviceBrand: undefined;
    protected abstract getTranslations(language: string): Promise<Translations>;
    private readonly _onDidChangeCache;
    readonly onDidChangeCache: Event<ExtensionType>;
    private readonly obsoleteFile;
    private readonly systemExtensionsCachedScanner;
    private readonly userExtensionsCachedScanner;
    private readonly extensionsScanner;
    constructor(systemExtensionsLocation: URI, userExtensionsLocation: URI, extensionsControlLocation: URI, cacheLocation: URI, userDataProfilesService: IUserDataProfilesService, extensionsProfileScannerService: IExtensionsProfileScannerService, fileService: IFileService, logService: ILogService, environmentService: IEnvironmentService, productService: IProductService, uriIdentityService: IUriIdentityService, instantiationService: IInstantiationService);
    private _targetPlatformPromise;
    getTargetPlatform(): Promise<TargetPlatform>;
    scanAllExtensions(systemScanOptions: ScanOptions, userScanOptions: ScanOptions, includeExtensionsUnderDev: boolean): Promise<IScannedExtension[]>;
    scanSystemExtensions(scanOptions: ScanOptions): Promise<IScannedExtension[]>;
    scanUserExtensions(scanOptions: ScanOptions): Promise<IScannedExtension[]>;
    scanExtensionsUnderDevelopment(scanOptions: ScanOptions, existingExtensions: IScannedExtension[]): Promise<IScannedExtension[]>;
    scanExistingExtension(extensionLocation: URI, extensionType: ExtensionType, scanOptions: ScanOptions): Promise<IScannedExtension | null>;
    scanOneOrMultipleExtensions(extensionLocation: URI, extensionType: ExtensionType, scanOptions: ScanOptions): Promise<IScannedExtension[]>;
    scanMetadata(extensionLocation: URI): Promise<Metadata | undefined>;
    updateMetadata(extensionLocation: URI, metaData: Partial<Metadata>): Promise<void>;
    initializeDefaultProfileExtensions(): Promise<void>;
    private initializeDefaultProfileExtensionsPromise;
    private doInitializeDefaultProfileExtensions;
    private applyScanOptions;
    private dedupExtensions;
    private scanDefaultSystemExtensions;
    private scanDevSystemExtensions;
    private getBuiltInExtensionControl;
    private createExtensionScannerInput;
    private getMtime;
}
export declare function toExtensionDescription(extension: IScannedExtension, isUnderDevelopment: boolean): IExtensionDescription;
export declare class NativeExtensionsScannerService extends AbstractExtensionsScannerService implements IExtensionsScannerService {
    private readonly translationsPromise;
    constructor(systemExtensionsLocation: URI, userExtensionsLocation: URI, userHome: URI, userDataPath: URI, userDataProfilesService: IUserDataProfilesService, extensionsProfileScannerService: IExtensionsProfileScannerService, fileService: IFileService, logService: ILogService, environmentService: IEnvironmentService, productService: IProductService, uriIdentityService: IUriIdentityService, instantiationService: IInstantiationService);
    protected getTranslations(language: string): Promise<Translations>;
}
export {};
