Skip to content

Commit

Permalink
Merge branch 'nintan/refactor' of https://github.com/OfficeDev/TeamsFx
Browse files Browse the repository at this point in the history
…into nintan/refactor
  • Loading branch information
tecton committed Feb 8, 2025
2 parents 169f788 + 0373fde commit ba277d3
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 3 deletions.
7 changes: 7 additions & 0 deletions packages/cli/src/commands/models/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
CliQuestionName,
CreateProjectInputs,
CreateProjectOptions,
getProjectTypeByCapability,
MeArchitectureOptions,
QuestionNames,
} from "@microsoft/teamsfx-core";
Expand Down Expand Up @@ -70,6 +71,12 @@ export function getCreateCommand(): CLICommand {
const inputs = ctx.optionValues as CreateProjectInputs;
inputs.projectId = inputs.projectId ?? uuid.v4();
const core = getFxCore();
if (inputs.nonInteractive) {
// for non-interactive mode, we need to preset project-type from capability to make sure the question model works
const capability = inputs.capabilities as string;
const projectType = getProjectTypeByCapability(capability);
inputs["project-type"] = projectType as any;
}
const res = await core.createProject(inputs);
assign(ctx.telemetryProperties, {
[TelemetryProperty.NewProjectId]: inputs.projectId,
Expand Down
5 changes: 4 additions & 1 deletion packages/cli/tests/unit/commands.tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,10 @@ describe("CLI commands", () => {

const ctx: CLIContext = {
command: { ...getCreateCommand(), fullName: "new" },
optionValues: {},
optionValues: {
capabilities: "bot",
nonInteractive: true,
},
globalOptionValues: {},
argumentValues: [],
telemetryProperties: {},
Expand Down
1 change: 1 addition & 0 deletions packages/fx-core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ export { environmentManager } from "./core/environment";
export { environmentNameManager } from "./core/environmentName";
export { FxCore } from "./core/FxCore";
export { PreProvisionResForVS, VersionCheckRes } from "./core/types";
export { getProjectTypeByCapability } from "./question/scaffold/vsc/createRootNode";
export * from "./error/index";
export * from "./question/constants";
export * from "./question/inputs";
Expand Down
77 changes: 76 additions & 1 deletion packages/fx-core/src/question/scaffold/vsc/createRootNode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,15 @@ import { getLocalizedString } from "../../../common/localizeUtils";
import { getAllTemplatesOnPlatform } from "../../../component/generator/templates/metadata";
import { ProgrammingLanguage, QuestionNames } from "../../constants";
import { appNameQuestion, folderQuestion } from "../../create";
import { ApiPluginStartOptions, DACapabilityOptions } from "./CapabilityOptions";
import {
ApiPluginStartOptions,
BotCapabilityOptions,
CustomCopilotCapabilityOptions,
DACapabilityOptions,
MeCapabilityOptions,
OfficeAddinCapabilityOptions,
TabCapabilityOptions,
} from "./CapabilityOptions";
import { ProjectTypeOptions } from "./ProjectTypeOptions";
import { customEngineAgentProjectTypeNode } from "./customAgentProjectTypeNode";
import { daProjectTypeNode } from "./daProjectTypeNode";
Expand Down Expand Up @@ -126,3 +134,70 @@ export function scaffoldQuestionForVSCode(): IQTreeNode {
};
return node;
}

/**
* CLI non-interactive mode has no "project-type" input, to make it compatible to the question model,
* we need to convert capability to project type
*/
export function getProjectTypeByCapability(capability: string): string {
if ([DACapabilityOptions.declarativeAgent().id].includes(capability)) {
return ProjectTypeOptions.copilotAgentOptionId;
}
if (
[
CustomCopilotCapabilityOptions.basicChatbot().id,
CustomCopilotCapabilityOptions.customCopilotRag().id,
CustomCopilotCapabilityOptions.aiAgent().id,
].includes(capability)
) {
return ProjectTypeOptions.customCopilotOptionId;
}
if (
[
BotCapabilityOptions.basicBot().id,
BotCapabilityOptions.notificationBot().id,
BotCapabilityOptions.commandBot().id,
BotCapabilityOptions.workflowBot().id,
].includes(capability)
) {
return ProjectTypeOptions.botOptionId;
}
if (
[
TabCapabilityOptions.nonSsoTab().id,
TabCapabilityOptions.m365SsoLaunchPage().id,
TabCapabilityOptions.dashboardTab().id,
TabCapabilityOptions.SPFxTab().id,
].includes(capability)
) {
return ProjectTypeOptions.tabOptionId;
}
if (
[
MeCapabilityOptions.m365SearchMe().id,
MeCapabilityOptions.collectFormMe().id,
MeCapabilityOptions.linkUnfurling().id,
].includes(capability)
) {
return ProjectTypeOptions.meOptionId;
}
if (
[
OfficeAddinCapabilityOptions.wxpTaskPane().id,
OfficeAddinCapabilityOptions.officeAddinImport().id,
].includes(capability)
) {
return ProjectTypeOptions.officeMetaOSOptionId;
}

if (
[
OfficeAddinCapabilityOptions.outlookTaskPane().id,
OfficeAddinCapabilityOptions.outlookAddinImport().id,
].includes(capability)
) {
return ProjectTypeOptions.outlookAddinOptionId;
}

return "";

Check warning on line 202 in packages/fx-core/src/question/scaffold/vsc/createRootNode.ts

View check run for this annotation

Codecov / codecov/patch

packages/fx-core/src/question/scaffold/vsc/createRootNode.ts#L202

Added line #L202 was not covered by tests
}
42 changes: 41 additions & 1 deletion packages/fx-core/tests/question/scaffold.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,23 @@ import { StaticTab } from "../../src/component/driver/teamsApp/interfaces/appdef
import { TemplateNames } from "../../src/component/generator/templates/templateNames";
import { ProgrammingLanguage, QuestionNames } from "../../src/question/constants";
import { scaffoldQuestionForVS } from "../../src/question/scaffold/vs/createRootNode";
import { ApiPluginStartOptions } from "../../src/question/scaffold/vsc/CapabilityOptions";
import {
ApiPluginStartOptions,
BotCapabilityOptions,
CustomCopilotCapabilityOptions,
DACapabilityOptions,
MeCapabilityOptions,
OfficeAddinCapabilityOptions,
TabCapabilityOptions,
} from "../../src/question/scaffold/vsc/CapabilityOptions";
import { ProjectTypeOptions } from "../../src/question/scaffold/vsc/ProjectTypeOptions";
import {
createFromTdpNode,
getTemplateName,
} from "../../src/question/scaffold/vsc/createFromTdpNode";
import {
folderAndAppNameCondition,
getProjectTypeByCapability,
languageNode,
scaffoldQuestionForVSCode,
} from "../../src/question/scaffold/vsc/createRootNode";
Expand Down Expand Up @@ -263,3 +272,34 @@ describe("folderAndAppNameCondition", () => {
assert.isFalse(res);
});
});

describe("getProjectTypeByCapability", () => {
it("DA", () => {
const type = getProjectTypeByCapability(DACapabilityOptions.declarativeAgent().id);
assert.equal(type, ProjectTypeOptions.copilotAgentOptionId);
});
it("CEA", () => {
const type = getProjectTypeByCapability(CustomCopilotCapabilityOptions.customCopilotRag().id);
assert.equal(type, ProjectTypeOptions.customCopilotOptionId);
});
it("Bot", () => {
const type = getProjectTypeByCapability(BotCapabilityOptions.basicBot().id);
assert.equal(type, ProjectTypeOptions.botOptionId);
});
it("Tab", () => {
const type = getProjectTypeByCapability(TabCapabilityOptions.nonSsoTab().id);
assert.equal(type, ProjectTypeOptions.tabOptionId);
});
it("ME", () => {
const type = getProjectTypeByCapability(MeCapabilityOptions.m365SearchMe().id);
assert.equal(type, ProjectTypeOptions.meOptionId);
});
it("WXP", () => {
const type = getProjectTypeByCapability(OfficeAddinCapabilityOptions.wxpTaskPane().id);
assert.equal(type, ProjectTypeOptions.officeMetaOSOptionId);
});
it("Outlook", () => {
const type = getProjectTypeByCapability(OfficeAddinCapabilityOptions.outlookTaskPane().id);
assert.equal(type, ProjectTypeOptions.outlookAddinOptionId);
});
});

0 comments on commit ba277d3

Please sign in to comment.