Path: blob/main/src/vs/workbench/contrib/extensions/browser/exeBasedRecommendations.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { IExtensionTipsService, IExecutableBasedExtensionTip } from '../../../../platform/extensionManagement/common/extensionManagement.js';6import { ExtensionRecommendations, ExtensionRecommendation } from './extensionRecommendations.js';7import { localize } from '../../../../nls.js';8import { ExtensionRecommendationReason } from '../../../services/extensionRecommendations/common/extensionRecommendations.js';910export class ExeBasedRecommendations extends ExtensionRecommendations {1112private _otherTips: IExecutableBasedExtensionTip[] = [];13private _importantTips: IExecutableBasedExtensionTip[] = [];1415get otherRecommendations(): ReadonlyArray<ExtensionRecommendation> { return this._otherTips.map(tip => this.toExtensionRecommendation(tip)); }16get importantRecommendations(): ReadonlyArray<ExtensionRecommendation> { return this._importantTips.map(tip => this.toExtensionRecommendation(tip)); }1718get recommendations(): ReadonlyArray<ExtensionRecommendation> { return [...this.importantRecommendations, ...this.otherRecommendations]; }1920constructor(21@IExtensionTipsService private readonly extensionTipsService: IExtensionTipsService,22) {23super();24}2526getRecommendations(exe: string): { important: ExtensionRecommendation[]; others: ExtensionRecommendation[] } {27const important = this._importantTips28.filter(tip => tip.exeName.toLowerCase() === exe.toLowerCase())29.map(tip => this.toExtensionRecommendation(tip));3031const others = this._otherTips32.filter(tip => tip.exeName.toLowerCase() === exe.toLowerCase())33.map(tip => this.toExtensionRecommendation(tip));3435return { important, others };36}3738protected async doActivate(): Promise<void> {39this._otherTips = await this.extensionTipsService.getOtherExecutableBasedTips();40await this.fetchImportantExeBasedRecommendations();41}4243private _importantExeBasedRecommendations: Promise<Map<string, IExecutableBasedExtensionTip>> | undefined;44private async fetchImportantExeBasedRecommendations(): Promise<Map<string, IExecutableBasedExtensionTip>> {45if (!this._importantExeBasedRecommendations) {46this._importantExeBasedRecommendations = this.doFetchImportantExeBasedRecommendations();47}48return this._importantExeBasedRecommendations;49}5051private async doFetchImportantExeBasedRecommendations(): Promise<Map<string, IExecutableBasedExtensionTip>> {52const importantExeBasedRecommendations = new Map<string, IExecutableBasedExtensionTip>();53this._importantTips = await this.extensionTipsService.getImportantExecutableBasedTips();54this._importantTips.forEach(tip => importantExeBasedRecommendations.set(tip.extensionId.toLowerCase(), tip));55return importantExeBasedRecommendations;56}5758private toExtensionRecommendation(tip: IExecutableBasedExtensionTip): ExtensionRecommendation {59return {60extension: tip.extensionId.toLowerCase(),61reason: {62reasonId: ExtensionRecommendationReason.Executable,63reasonText: localize('exeBasedRecommendation', "This extension is recommended because you have {0} installed.", tip.exeFriendlyName)64}65};66}6768}69707172