/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { IViewlet } from 'vs/workbench/common/viewlet'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { Event } from 'vs/base/common/event'; import { IPager } from 'vs/base/common/paging'; import { IQueryOptions, EnablementState, ILocalExtension, IGalleryExtension, IExtensionIdentifier, IExtensionManagementServer } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IViewContainersRegistry, ViewContainer, Extensions as ViewContainerExtensions } from 'vs/workbench/common/views'; import { Registry } from 'vs/platform/registry/common/platform'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Disposable } from 'vs/base/common/lifecycle'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IExtensionManifest, ExtensionType } from 'vs/platform/extensions/common/extensions'; export const VIEWLET_ID = 'workbench.view.extensions'; export const VIEW_CONTAINER: ViewContainer = Registry.as(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer(VIEWLET_ID); export const EXTENSIONS_CONFIG = '.azuredatastudio/extensions.json'; export interface IExtensionsViewlet extends IViewlet { search(text: string): void; } export const enum ExtensionState { Installing, Installed, Uninstalling, Uninstalled } export interface IExtension { readonly type?: ExtensionType; readonly state: ExtensionState; readonly name: string; readonly displayName: string; readonly identifier: IExtensionIdentifier; readonly publisher: string; readonly publisherDisplayName: string; readonly version: string; readonly latestVersion: string; readonly description: string; readonly url?: string; // {{SQL CARBON EDIT}} readonly downloadPage?: string; readonly repository?: string; readonly iconUrl: string; readonly iconUrlFallback: string; readonly licenseUrl?: string; readonly installCount?: number; readonly rating?: number; readonly ratingCount?: number; readonly outdated: boolean; readonly enablementState: EnablementState; readonly dependencies: string[]; readonly extensionPack: string[]; readonly telemetryData: any; readonly preview: boolean; getManifest(token: CancellationToken): Promise; getReadme(token: CancellationToken): Promise; hasReadme(): boolean; getChangelog(token: CancellationToken): Promise; hasChangelog(): boolean; readonly server?: IExtensionManagementServer; readonly local?: ILocalExtension; gallery?: IGalleryExtension; readonly isMalicious: boolean; } export interface IExtensionDependencies { dependencies: IExtensionDependencies[]; hasDependencies: boolean; identifier: string; extension: IExtension; dependent: IExtensionDependencies | null; } export const SERVICE_ID = 'extensionsWorkbenchService'; export const IExtensionsWorkbenchService = createDecorator(SERVICE_ID); export interface IExtensionsWorkbenchService { _serviceBrand: any; onChange: Event; local: IExtension[]; installed: IExtension[]; outdated: IExtension[]; queryLocal(server?: IExtensionManagementServer): Promise; queryGallery(token: CancellationToken): Promise>; queryGallery(options: IQueryOptions, token: CancellationToken): Promise>; canInstall(extension: IExtension): boolean; install(vsix: string): Promise; install(extension: IExtension, promptToInstallDependencies?: boolean): Promise; uninstall(extension: IExtension): Promise; installVersion(extension: IExtension, version: string): Promise; reinstall(extension: IExtension): Promise; setEnablement(extensions: IExtension | IExtension[], enablementState: EnablementState): Promise; loadDependencies(extension: IExtension, token: CancellationToken): Promise; open(extension: IExtension, sideByside?: boolean): Promise; checkForUpdates(): Promise; allowedBadgeProviders: string[]; } export const ConfigurationKey = 'extensions'; export const AutoUpdateConfigurationKey = 'extensions.autoUpdate'; export const AutoCheckUpdatesConfigurationKey = 'extensions.autoCheckUpdates'; export const ShowRecommendationsOnlyOnDemandKey = 'extensions.showRecommendationsOnlyOnDemand'; export const CloseExtensionDetailsOnViewChangeKey = 'extensions.closeExtensionDetailsOnViewChange'; // {{SQL CARBON EDIT}} export const ExtensionsPolicyKey = 'extensions.extensionsPolicy'; export interface IExtensionsConfiguration { autoUpdate: boolean; autoCheckUpdates: boolean; ignoreRecommendations: boolean; showRecommendationsOnlyOnDemand: boolean; closeExtensionDetailsOnViewChange: boolean; // {{SQL CARBON EDIT}} extensionsPolicy: string; } // {{SQL CARBON EDIT}} export enum ExtensionsPolicy { allowAll = 'allowAll', allowNone = 'allowNone', allowMicrosoft = 'allowMicrosoft' } // {{SQL CARBON EDIT}} - End export interface IExtensionContainer { extension: IExtension | null; updateWhenCounterExtensionChanges?: boolean; update(): void; } export class ExtensionContainers extends Disposable { constructor( private readonly containers: IExtensionContainer[], @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService ) { super(); this._register(extensionsWorkbenchService.onChange(this.update, this)); } set extension(extension: IExtension) { this.containers.forEach(c => c.extension = extension); } private update(extension: IExtension): void { for (const container of this.containers) { if (extension && container.extension) { if (areSameExtensions(container.extension.identifier, extension.identifier)) { if (!container.extension.server || container.extension.server === extension.server) { container.extension = extension; } else if (container.updateWhenCounterExtensionChanges) { container.update(); } } } else { container.update(); } } } }