teamsfx-extension
Version:
Create, debug, and deploy Teams apps with Teams Toolkit
294 lines • 17.1 kB
JavaScript
"use strict";
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TreeViewCommand = exports.CommandsTreeViewProvider = void 0;
const vscode = require("vscode");
const path = require("path");
const extensionVariables_1 = require("./extensionVariables");
const teamsfx_api_1 = require("@microsoft/teamsfx-api");
const StringResources = require("./resources/Strings.json");
class TreeViewManager {
constructor() {
this.treeviewMap = new Map();
}
static getInstance() {
if (!TreeViewManager.instance) {
TreeViewManager.instance = new TreeViewManager();
}
return TreeViewManager.instance;
}
registerTreeViews() {
const disposables = [];
const getStartTreeViewCommand = [
new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.quickStartTitle, StringResources.vsc.commandsTreeViewProvider.quickStartDescription, "fx-extension.openWelcome", vscode.TreeItemCollapsibleState.None, teamsfx_api_1.TreeCategory.GettingStarted, undefined, "lightningBolt_16"),
new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.samplesTitle, StringResources.vsc.commandsTreeViewProvider.samplesDescription, "fx-extension.openSamples", vscode.TreeItemCollapsibleState.None, teamsfx_api_1.TreeCategory.GettingStarted, undefined, "heart_16"),
new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.documentationTitle, StringResources.vsc.commandsTreeViewProvider.documentationDescription, "fx-extension.openDocument", vscode.TreeItemCollapsibleState.None, teamsfx_api_1.TreeCategory.GettingStarted, undefined, "book_16"),
];
const getStartedProvider = new CommandsTreeViewProvider(getStartTreeViewCommand);
disposables.push(vscode.window.registerTreeDataProvider("teamsfx-getting-started", getStartedProvider));
const accountProvider = new CommandsTreeViewProvider([]);
disposables.push(vscode.window.registerTreeDataProvider("teamsfx-accounts", accountProvider));
const projectTreeViewCommand = [
new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.createProjectTitle, StringResources.vsc.commandsTreeViewProvider.createProjectDescription, "fx-extension.create", vscode.TreeItemCollapsibleState.None, undefined, undefined, "createProject"),
new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.addCapabilitiesTitle, StringResources.vsc.commandsTreeViewProvider.addCapabilitiesDescription, "fx-extension.addCapability", vscode.TreeItemCollapsibleState.None, undefined, undefined, "addCapability"),
new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.addResourcesTitle, StringResources.vsc.commandsTreeViewProvider.addResourcesDescription, "fx-extension.update", vscode.TreeItemCollapsibleState.None, undefined, undefined, "addResources"),
new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.manifestEditorTitle, StringResources.vsc.commandsTreeViewProvider.manifestEditorDescription, "fx-extension.openManifest", vscode.TreeItemCollapsibleState.None, undefined, undefined, "manifestEditor"),
new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.validateManifestTitle, StringResources.vsc.commandsTreeViewProvider.validateManifestDescription, "fx-extension.validateManifest", vscode.TreeItemCollapsibleState.None, undefined, undefined, "validatemanifest"),
new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.buildPackageTitle, StringResources.vsc.commandsTreeViewProvider.buildPackageDescription, "fx-extension.build", vscode.TreeItemCollapsibleState.None, undefined, undefined, "build"),
new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.provisionTitle, StringResources.vsc.commandsTreeViewProvider.provisionDescription, "fx-extension.provision", vscode.TreeItemCollapsibleState.None, undefined, undefined, "provision"),
new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.deployTitle, StringResources.vsc.commandsTreeViewProvider.deployDescription, "fx-extension.deploy", vscode.TreeItemCollapsibleState.None, undefined, undefined, "deploy"),
new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.publishTitle, StringResources.vsc.commandsTreeViewProvider.publishDescription, "fx-extension.publish", vscode.TreeItemCollapsibleState.None, undefined, undefined, "publish"),
];
const projectProvider = new CommandsTreeViewProvider(projectTreeViewCommand);
disposables.push(vscode.window.registerTreeDataProvider("teamsfx-project", projectProvider));
const teamDevCenterTreeViewCommand = [
//TODO temp solution
new TreeViewCommand("Go To Teams Developer Portal", "Go To Teams Developer Portal", "fx-extension.openAppManagement", vscode.TreeItemCollapsibleState.None, undefined, undefined, "appManagement"),
// new TreeViewCommand(
// StringResources.vsc.commandsTreeViewProvider.appManagementTitle,
// StringResources.vsc.commandsTreeViewProvider.appManagementDescription,
// "fx-extension.openAppManagement",
// vscode.TreeItemCollapsibleState.None,
// undefined,
// undefined,
// "appManagement"
// ),
// new TreeViewCommand(
// StringResources.vsc.commandsTreeViewProvider.botManagementTitle,
// StringResources.vsc.commandsTreeViewProvider.botManagementDescription,
// "fx-extension.openBotManagement",
// vscode.TreeItemCollapsibleState.None,
// undefined,
// undefined,
// "bot"
// )
];
const teamDevCenterProvider = new CommandsTreeViewProvider(teamDevCenterTreeViewCommand);
disposables.push(vscode.window.registerTreeDataProvider("teamsfx-teams-dev-center", teamDevCenterProvider));
const feedbackTreeViewCommand = [
new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.reportIssuesTitle, StringResources.vsc.commandsTreeViewProvider.reportIssuesDescription, "fx-extension.openReportIssues", vscode.TreeItemCollapsibleState.None, teamsfx_api_1.TreeCategory.Feedback, undefined, "reportIssues"),
];
const feedbackProvider = new CommandsTreeViewProvider(feedbackTreeViewCommand);
disposables.push(vscode.window.registerTreeDataProvider("teamsfx-feedback", feedbackProvider));
this.treeviewMap.set("teamsfx-getting-started", getStartedProvider);
this.treeviewMap.set("teamsfx-accounts", accountProvider);
this.treeviewMap.set("teamsfx-project", projectProvider);
this.treeviewMap.set("teamsfx-teams-dev-center", teamDevCenterProvider);
this.treeviewMap.set("teamsfx-feedback", feedbackProvider);
return disposables;
}
getTreeView(viewName) {
return this.treeviewMap.get(viewName);
}
dispose() {
this.treeviewMap.forEach((value) => {
value.dispose();
});
}
}
exports.default = TreeViewManager.getInstance();
class CommandsTreeViewProvider {
constructor(commands) {
this._onDidChangeTreeData = new vscode.EventEmitter();
this.onDidChangeTreeData = this._onDidChangeTreeData.event;
this.commands = [];
this.disposableMap = new Map();
this.commands.push(...commands);
}
findCommand(commandId) {
const commandStack = [];
for (const command of this.commands) {
commandStack.push(command);
}
while (commandStack.length > 0) {
const curCommand = commandStack.shift();
if ((curCommand === null || curCommand === void 0 ? void 0 : curCommand.commandId) === commandId) {
return curCommand;
}
if (curCommand === null || curCommand === void 0 ? void 0 : curCommand.children) {
for (const subCommand of curCommand === null || curCommand === void 0 ? void 0 : curCommand.children) {
commandStack.push(subCommand);
}
}
}
return undefined;
}
isRegistered(commandId) {
return __awaiter(this, void 0, void 0, function* () {
const target = this.disposableMap.get(commandId);
if (target !== undefined) {
return true;
}
return false;
});
}
refresh(items) {
return __awaiter(this, void 0, void 0, function* () {
for (const treeItem of items) {
const originalCommand = this.findCommand(treeItem.commandId);
if (originalCommand !== undefined) {
originalCommand.label = treeItem.label;
if (treeItem.tooltip) {
if (treeItem.tooltip.isMarkdown) {
const markdown = new vscode.MarkdownString(treeItem.tooltip.value);
originalCommand.tooltip = markdown;
}
else {
originalCommand.tooltip = treeItem.tooltip.value;
}
}
originalCommand.contextValue = treeItem.contextValue;
if (treeItem.icon) {
originalCommand.iconPath = path.join(extensionVariables_1.ext.context.extensionPath, "media", `${treeItem.icon}.svg`);
}
}
}
this._onDidChangeTreeData.fire();
return Promise.resolve(teamsfx_api_1.ok(null));
});
}
add(items) {
var _a, _b;
return __awaiter(this, void 0, void 0, function* () {
for (const treeItem of items) {
if (this.disposableMap.get(treeItem.commandId) !== undefined) {
continue;
}
const disposable = vscode.commands.registerCommand(treeItem.commandId, treeItem.callback);
this.disposableMap.set(treeItem.commandId, disposable);
let tooltip = treeItem.label;
if (treeItem.tooltip) {
if (treeItem.tooltip.isMarkdown) {
const markdown = new vscode.MarkdownString(treeItem.tooltip.value);
tooltip = markdown;
}
else {
tooltip = treeItem.tooltip.value;
}
}
const command = new TreeViewCommand(treeItem.label, tooltip, treeItem.commandId, treeItem.subTreeItems && treeItem.subTreeItems.length > 0
? vscode.TreeItemCollapsibleState.Expanded
: undefined, typeof treeItem.parent === "number" ? treeItem.parent : undefined, [], treeItem.icon, treeItem.contextValue);
let parentCmd = undefined;
if (typeof treeItem.parent === "number") {
this.commands.push(command);
}
else {
parentCmd = this.findCommand(treeItem.parent);
if (parentCmd) {
parentCmd.collapsibleState = vscode.TreeItemCollapsibleState.Expanded;
(_a = parentCmd.children) === null || _a === void 0 ? void 0 : _a.push(command);
}
}
if (parentCmd || typeof treeItem.parent === "number") {
if (treeItem.subTreeItems) {
for (const subTreeItem of treeItem.subTreeItems) {
const registered = yield this.isRegistered(subTreeItem.commandId);
if (!registered && subTreeItem.callback !== undefined) {
const disposable = vscode.commands.registerCommand(subTreeItem.commandId, subTreeItem.callback);
this.disposableMap.set(subTreeItem.commandId, disposable);
}
const subCommand = new TreeViewCommand(subTreeItem.label, subTreeItem.label, subTreeItem.commandId, subTreeItem.subTreeItems && subTreeItem.subTreeItems.length > 0
? vscode.TreeItemCollapsibleState.Expanded
: undefined);
if (command.children === undefined) {
command.children = [];
}
(_b = command.children) === null || _b === void 0 ? void 0 : _b.push(subCommand);
}
}
}
}
this._onDidChangeTreeData.fire();
return Promise.resolve(teamsfx_api_1.ok(null));
});
}
remove(items) {
var _a;
for (const treeItem of items) {
let parentCmd = undefined;
if (typeof treeItem.parent === "number") {
parentCmd = this.commands.find((rootCommand) => rootCommand.category === treeItem.parent);
}
else {
parentCmd = this.findCommand(treeItem.parent);
}
if (parentCmd && parentCmd.children) {
for (let i = 0; i < ((_a = parentCmd.children) === null || _a === void 0 ? void 0 : _a.length); i++) {
if (parentCmd.children[i].commandId === treeItem.commandId) {
if (parentCmd.children.length === 1)
parentCmd.collapsibleState = vscode.TreeItemCollapsibleState.None;
const removeCmd = parentCmd.children.splice(i--, 1);
const disposable = this.disposableMap.get(removeCmd[0].commandId);
disposable === null || disposable === void 0 ? void 0 : disposable.dispose();
this.disposableMap.delete(removeCmd[0].commandId);
if (removeCmd[0].children) {
for (const child of removeCmd[0].children) {
const subDisposable = this.disposableMap.get(child.commandId);
subDisposable === null || subDisposable === void 0 ? void 0 : subDisposable.dispose();
this.disposableMap.delete(child.commandId);
}
}
}
}
}
}
this._onDidChangeTreeData.fire();
return Promise.resolve(teamsfx_api_1.ok(null));
}
getTreeItem(element) {
return element;
}
getChildren(element) {
if (element && element.children) {
return Promise.resolve(element.children);
}
else {
return Promise.resolve(this.commands);
}
}
dispose() {
this.disposableMap.forEach((value) => {
value.dispose();
});
}
}
exports.CommandsTreeViewProvider = CommandsTreeViewProvider;
CommandsTreeViewProvider.TreeViewFlag = "TreeView";
class TreeViewCommand extends vscode.TreeItem {
constructor(label, tooltip, commandId, collapsibleState, category, children, imageName, contextValue) {
super(label, collapsibleState ? collapsibleState : vscode.TreeItemCollapsibleState.None);
this.label = label;
this.tooltip = tooltip;
this.commandId = commandId;
this.collapsibleState = collapsibleState;
this.category = category;
this.children = children;
this.imageName = imageName;
this.contextValue = contextValue;
this.description = "";
this.contextValue = contextValue;
if (imageName !== undefined) {
this.iconPath = path.join(extensionVariables_1.ext.context.extensionPath, "media", `${this.imageName}.svg`);
}
if (commandId) {
this.command = {
title: label,
command: commandId,
arguments: [[CommandsTreeViewProvider.TreeViewFlag]],
};
}
}
}
exports.TreeViewCommand = TreeViewCommand;
//# sourceMappingURL=commandsTreeViewProvider.js.map