Skip to content

Commit

Permalink
refactor(generator): mapping user inputs to template names (#11450)
Browse files Browse the repository at this point in the history
* refactor: get template name by matching inputs

* refactor: set default replace map

* refactor: use a map instead of a list
  • Loading branch information
hund030 authored Apr 24, 2024
1 parent 31711cf commit ad8f60c
Show file tree
Hide file tree
Showing 7 changed files with 309 additions and 330 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { OfficeAddinGeneratorNew } from "./officeAddin/generator";
import { SsrTabGenerator } from "./templates/ssrTabGenerator";
import { DefaultTemplateGenerator } from "./templates/templateGenerator";

export const Generators = [new DefaultTemplateGenerator(), new OfficeAddinGeneratorNew()];
// When multiple generators are activated, only the top one will be executed.
export const Generators = [
new OfficeAddinGeneratorNew(),
new SsrTabGenerator(),
new DefaultTemplateGenerator(),
];
Original file line number Diff line number Diff line change
Expand Up @@ -249,8 +249,7 @@ export class OfficeAddinGeneratorNew extends DefaultTemplateGenerator {
inputs[QuestionNames.Capabilities] === CapabilityOptions.officeAddinImport().id
? ProgrammingLanguage.TS
: lang;
const replaceMap = {};
return Promise.resolve(ok([{ templateName: tplName, language: lang, replaceMap }]));
return Promise.resolve(ok([{ templateName: tplName, language: lang }]));
}

public async post(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

import { Context, FxError, Inputs, Result, ok } from "@microsoft/teamsfx-api";
import { DefaultTemplateGenerator } from "./templateGenerator";
import { TemplateInfo } from "./templateInfo";
import { CapabilityOptions, ProgrammingLanguage, QuestionNames } from "../../../question";
import { TemplateNames } from "./templateNames";

// For the APS.NET server-side rendering tab
export class SsrTabGenerator extends DefaultTemplateGenerator {
capabilities2TemplateNames = {
[CapabilityOptions.nonSsoTab().id]: TemplateNames.TabSSR,
[CapabilityOptions.tab().id]: TemplateNames.SsoTabSSR,
};
override activate(context: Context, inputs: Inputs): boolean {
const capability = inputs.capabilities as string;
return (
this.capabilities2TemplateNames[capability] !== undefined &&
inputs[QuestionNames.ProgrammingLanguage] === ProgrammingLanguage.CSharp &&
inputs.targetFramework !== "net6.0" &&
inputs.targetFramework !== "net7.0"
);
}
override getTemplateInfos(
context: Context,
inputs: Inputs
): Promise<Result<TemplateInfo[], FxError>> {
return Promise.resolve(
ok([
{
templateName: this.capabilities2TemplateNames[inputs.capabilities as string],
language: ProgrammingLanguage.CSharp,
},
])
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,13 @@ import { TelemetryEvent, TelemetryProperty } from "../../../common/telemetry";
import { ProgressMessages, ProgressTitles } from "../../messages";
import { ActionContext, ActionExecutionMW } from "../../middleware/actionExecutionMW";
import { commonTemplateName, componentName } from "../constant";
import {
CapabilityOptions,
MeArchitectureOptions,
ProgrammingLanguage,
QuestionNames,
} from "../../../question";
import { ProgrammingLanguage, QuestionNames } from "../../../question";
import { Generator, templateDefaultOnActionError } from "../generator";
import { convertToLangKey, renderTemplateFileData, renderTemplateFileName } from "../utils";
import { merge } from "lodash";
import { GeneratorContext, TemplateActionSeq } from "../generatorAction";
import { TemplateInfo } from "./templateInfo";
import { Feature2TemplateName } from "./templateNames";
import { getTemplateName, tryGetTemplateName } from "./templateNames";
import { getTemplateReplaceMap } from "./templateReplaceMap";

export class DefaultTemplateGenerator implements IGenerator {
Expand All @@ -27,9 +22,7 @@ export class DefaultTemplateGenerator implements IGenerator {

// override this method to determine whether to run this generator
public activate(context: Context, inputs: Inputs): boolean {
return Object.keys(Feature2TemplateName).some((feature) =>
feature.startsWith(inputs.capabilities)
);
return tryGetTemplateName(inputs) !== undefined;
}

// The main entry of the generator. Do not override this method.
Expand All @@ -53,6 +46,7 @@ export class DefaultTemplateGenerator implements IGenerator {

const templateInfos = preResult.value;
for (const templateInfo of templateInfos) {
templateInfo.replaceMap = { ...getTemplateReplaceMap(inputs), ...templateInfo.replaceMap };
await this.scaffolding(context, templateInfo, destinationPath, actionContext);
}

Expand All @@ -68,10 +62,9 @@ export class DefaultTemplateGenerator implements IGenerator {
inputs: Inputs,
actionContext?: ActionContext
): Promise<Result<TemplateInfo[], FxError>> {
const templateName = this.getTemplateName(inputs);
const templateName = getTemplateName(inputs);
const language = inputs[QuestionNames.ProgrammingLanguage] as ProgrammingLanguage;
const replaceMap = getTemplateReplaceMap(inputs);
return Promise.resolve(ok([{ templateName, language, replaceMap }]));
return Promise.resolve(ok([{ templateName, language }]));
}

// override this method to do post process
Expand All @@ -84,56 +77,6 @@ export class DefaultTemplateGenerator implements IGenerator {
return Promise.resolve(ok(undefined));
}

private getTemplateName(inputs: Inputs) {
const language = inputs[QuestionNames.ProgrammingLanguage];
const capability = inputs.capabilities as string;
const meArchitecture = inputs[QuestionNames.MeArchitectureType] as string;
const apiMEAuthType = inputs[QuestionNames.ApiMEAuth] as string;
const trigger = inputs[QuestionNames.BotTrigger] as string;
let feature = `${capability}:${trigger}`;
if (
capability === CapabilityOptions.m365SsoLaunchPage().id ||
capability === CapabilityOptions.m365SearchMe().id
) {
inputs.isM365 = true;
}

if (
language === "csharp" &&
capability === CapabilityOptions.notificationBot().id &&
inputs.isIsolated === true
) {
feature += "-isolated";
}

if (meArchitecture) {
feature = `${feature}:${meArchitecture}`;
}
if (
inputs.targetFramework &&
inputs.targetFramework !== "net6.0" &&
inputs.targetFramework !== "net7.0" &&
(capability === CapabilityOptions.nonSsoTab().id || capability === CapabilityOptions.tab().id)
) {
feature = `${capability}:ssr`;
}

if (
capability === CapabilityOptions.m365SearchMe().id &&
meArchitecture === MeArchitectureOptions.newApi().id
) {
feature = `${feature}:${apiMEAuthType}`;
}

if (capability === CapabilityOptions.customCopilotRag().id) {
feature = `${feature}:${inputs[QuestionNames.CustomCopilotRag] as string}`;
} else if (capability === CapabilityOptions.customCopilotAssistant().id) {
feature = `${feature}:${inputs[QuestionNames.CustomCopilotAssistant] as string}`;
}

return Feature2TemplateName[feature];
}

private async scaffolding(
context: Context,
templateInfo: TemplateInfo,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ import { ProgrammingLanguage } from "../../../question";
export interface TemplateInfo {
templateName: string;
language: ProgrammingLanguage;
replaceMap: { [key: string]: string }; // key is the placeholder in the template file, value is the value to replace
replaceMap?: { [key: string]: string }; // key is the placeholder in the template file, value is the value to replace
filterFn?: (fileName: string) => boolean; // return true to include the file, false to exclude
}
Loading

0 comments on commit ad8f60c

Please sign in to comment.