diff --git a/packages/fx-core/src/component/driver/aad/utility/aadManifestHelper.ts b/packages/fx-core/src/component/driver/aad/utility/aadManifestHelper.ts index db9205f5881..63679957979 100644 --- a/packages/fx-core/src/component/driver/aad/utility/aadManifestHelper.ts +++ b/packages/fx-core/src/component/driver/aad/utility/aadManifestHelper.ts @@ -20,9 +20,7 @@ import { getLocalizedString } from "../../../../common/localizeUtils"; import { err, FxError, ok, Result } from "@microsoft/teamsfx-api"; import { FileNotFoundError, UserCancelError } from "../../../../error"; import fs from "fs-extra"; -import { parseDocument } from "yaml"; -import { MetadataV3 } from "../../../../common/versionMetadata"; -import path from "path"; +import { updateVersionForTeamsAppYamlFile } from "../../util/utils"; const componentName = "AadManifestHelper"; @@ -385,32 +383,7 @@ export class AadManifestHelper { false ); - await AadManifestHelper.updateVersionForTeamsAppYamlFile(projectPath); + await updateVersionForTeamsAppYamlFile(projectPath); return ok(undefined); } - - public static async updateVersionForTeamsAppYamlFile(projectPath: string): Promise { - const allPossilbeYamlFileNames = [ - MetadataV3.localConfigFile, - MetadataV3.configFile, - MetadataV3.testToolConfigFile, - ]; - for (const yamlFileName of allPossilbeYamlFileNames) { - const ymlPath = path.join(projectPath, yamlFileName); - if (await fs.pathExists(ymlPath)) { - const ymlContent = await fs.readFile(ymlPath, "utf-8"); - const document = parseDocument(ymlContent); - const version = document.get("version") as string; - if (version <= "v1.7") { - document.set("version", "v1.8"); - const docContent = document.toString(); - const updatedContent = docContent.replace( - /(yaml-language-server:\s*\$schema=https:\/\/aka\.ms\/teams-toolkit\/)v\d+\.\d+(\/yaml\.schema\.json)/, - "$1v1.8$2" - ); - await fs.writeFile(ymlPath, updatedContent, "utf8"); - } - } - } - } } diff --git a/packages/fx-core/src/component/driver/teamsApp/createAppPackage.ts b/packages/fx-core/src/component/driver/teamsApp/createAppPackage.ts index 11d499b7ef0..38f7a8bb008 100644 --- a/packages/fx-core/src/component/driver/teamsApp/createAppPackage.ts +++ b/packages/fx-core/src/component/driver/teamsApp/createAppPackage.ts @@ -36,6 +36,7 @@ import { copilotGptManifestUtils } from "./utils/CopilotGptManifestUtils"; import { ManifestType } from "../../utils/envFunctionUtils"; import { getAbsolutePath } from "../../utils/common"; import { featureFlagManager, FeatureFlags } from "../../../common/featureFlags"; +import { updateVersionForTeamsAppYamlFile } from "../util/utils"; export const actionName = "teamsApp/zipAppPackage"; @@ -533,6 +534,7 @@ export class CreateAppPackageDriver implements StepDriver { let tempFolder: string | undefined; if (containExternalAdaptiveCard) { + await updateVersionForTeamsAppYamlFile(context.projectPath); tempFolder = path.join(appDirectory, ".tmp"); await fs.ensureDir(tempFolder); tmpPluginFile = path.join(tempFolder, `tmp-ai-plugin-${uuid.v4().slice(0, 6)}.json`); diff --git a/packages/fx-core/src/component/driver/util/utils.ts b/packages/fx-core/src/component/driver/util/utils.ts index 1aaeba4ae63..1782c1a5377 100644 --- a/packages/fx-core/src/component/driver/util/utils.ts +++ b/packages/fx-core/src/component/driver/util/utils.ts @@ -4,6 +4,10 @@ import { Inputs } from "@microsoft/teamsfx-api"; import { DriverContext } from "../interface/commonArgs"; import { TOOLS } from "../../../common/globalVars"; +import { MetadataV3 } from "../../../common/versionMetadata"; +import path from "path"; +import { parseDocument } from "yaml"; +import fs from "fs-extra"; // Needs to validate the parameters outside of the function export function loadStateFromEnv( @@ -44,3 +48,28 @@ export function createDriverContext(inputs: Inputs): DriverContext { }; return driverContext; } + +export async function updateVersionForTeamsAppYamlFile(projectPath: string): Promise { + const allPossilbeYamlFileNames = [ + MetadataV3.localConfigFile, + MetadataV3.configFile, + MetadataV3.testToolConfigFile, + ]; + for (const yamlFileName of allPossilbeYamlFileNames) { + const ymlPath = path.join(projectPath, yamlFileName); + if (await fs.pathExists(ymlPath)) { + const ymlContent = await fs.readFile(ymlPath, "utf-8"); + const document = parseDocument(ymlContent); + const version = document.get("version") as string; + if (version <= "v1.7") { + document.set("version", "v1.8"); + const docContent = document.toString(); + const updatedContent = docContent.replace( + /(yaml-language-server:\s*\$schema=https:\/\/aka\.ms\/teams-toolkit\/)v\d+\.\d+(\/yaml\.schema\.json)/, + "$1v1.8$2" + ); + await fs.writeFile(ymlPath, updatedContent, "utf8"); + } + } + } +} diff --git a/packages/fx-core/tests/component/driver/aad/aadManifestHelper.test.ts b/packages/fx-core/tests/component/driver/aad/aadManifestHelper.test.ts index 623552545bf..6a1fc68bb68 100644 --- a/packages/fx-core/tests/component/driver/aad/aadManifestHelper.test.ts +++ b/packages/fx-core/tests/component/driver/aad/aadManifestHelper.test.ts @@ -6,7 +6,6 @@ import * as chai from "chai"; import { AadManifestHelper } from "../../../../src/component/driver/aad/utility/aadManifestHelper"; import { AadManifestErrorMessage } from "../../../../src/component/driver/aad/error/aadManifestError"; import { AADManifest } from "../../../../src/component/driver/aad/interface/AADManifest"; -import { AADApplication } from "../../../../src/component/driver/aad/interface/AADApplication"; import * as sinon from "sinon"; import { MockTools } from "../../../core/utils"; import { setTools, TOOLS } from "../../../../src/common/globalVars"; @@ -106,40 +105,6 @@ describe("Microsoft Entra manifest helper Test", () => { await AadManifestHelper.showWarningIfManifestIsOutdated("fake-path", "fake-project-path"); }); - it("updateVersionForTeamsAppYamlFile should works fine", async () => { - const teamsAppYaml = "version: v1.7"; - const expectedTeamsAppYaml = "version: v1.8"; - - sinon.stub(fs, "pathExists").resolves(true); - sinon.stub(fs, "readFile").resolves(teamsAppYaml as any); - const writeFileStub = sinon.stub(fs, "writeFile"); - - await AadManifestHelper.updateVersionForTeamsAppYamlFile("fake-project-path"); - - const writtenContent = writeFileStub.getCall(0).args[1]; - chai.assert.isTrue(writtenContent.includes(expectedTeamsAppYaml)); - }); - - it("updateVersionForTeamsAppYamlFile should works fine when yaml contains schema url", async () => { - const teamsAppYaml = `# yaml-language-server: $schema=https://aka.ms/teams-toolkit/v1.7/yaml.schema.json -# Visit https://aka.ms/teamsfx-v5.0-guide for details on this file -# Visit https://aka.ms/teamsfx-actions for details on actions -version: v1.7`; - const expectedTeamsAppYaml = `# yaml-language-server: $schema=https://aka.ms/teams-toolkit/v1.8/yaml.schema.json -# Visit https://aka.ms/teamsfx-v5.0-guide for details on this file -# Visit https://aka.ms/teamsfx-actions for details on actions -version: v1.8`; - - sinon.stub(fs, "pathExists").resolves(true); - sinon.stub(fs, "readFile").resolves(teamsAppYaml as any); - const writeFileStub = sinon.stub(fs, "writeFile"); - - await AadManifestHelper.updateVersionForTeamsAppYamlFile("fake-project-path"); - - const writtenContent = writeFileStub.getCall(0).args[1]; - chai.assert.isTrue(writtenContent.includes(expectedTeamsAppYaml)); - }); - it("processRequiredResourceAccessInManifest with id", async () => { const manifestWithId: any = { requiredResourceAccess: [ diff --git a/packages/fx-core/tests/component/driver/util/utils.test.ts b/packages/fx-core/tests/component/driver/util/utils.test.ts index c6a6e705015..919df9bf275 100644 --- a/packages/fx-core/tests/component/driver/util/utils.test.ts +++ b/packages/fx-core/tests/component/driver/util/utils.test.ts @@ -3,8 +3,14 @@ import "mocha"; import mockedEnv, { RestoreFn } from "mocked-env"; -import { loadStateFromEnv, mapStateToEnv } from "../../../../src/component/driver/util/utils"; +import { + loadStateFromEnv, + mapStateToEnv, + updateVersionForTeamsAppYamlFile, +} from "../../../../src/component/driver/util/utils"; +import fs from "fs-extra"; import { expect } from "chai"; +import sinon from "sinon"; describe("loadStateFromEnv", () => { let envRestore: RestoreFn | undefined; @@ -105,3 +111,43 @@ describe("mapStateToEnv", async () => { expect(result.get("ENV_A")).to.equal("ENV_A value"); }); }); + +describe("updateVersionForTeamsAppYamlFile", async () => { + afterEach(() => { + sinon.restore(); + }); + it("updateVersionForTeamsAppYamlFile should works fine", async () => { + const teamsAppYaml = "version: v1.7"; + const expectedTeamsAppYaml = "version: v1.8"; + + sinon.stub(fs, "pathExists").resolves(true); + sinon.stub(fs, "readFile").resolves(teamsAppYaml as any); + const writeFileStub = sinon.stub(fs, "writeFile"); + + await updateVersionForTeamsAppYamlFile("fake-project-path"); + + const writtenContent = writeFileStub.getCall(0).args[1]; + // use epect instead + expect(writtenContent).to.include(expectedTeamsAppYaml); + }); + + it("updateVersionForTeamsAppYamlFile should works fine when yaml contains schema url", async () => { + const teamsAppYaml = `# yaml-language-server: $schema=https://aka.ms/teams-toolkit/v1.7/yaml.schema.json +# Visit https://aka.ms/teamsfx-v5.0-guide for details on this file +# Visit https://aka.ms/teamsfx-actions for details on actions +version: v1.7`; + const expectedTeamsAppYaml = `# yaml-language-server: $schema=https://aka.ms/teams-toolkit/v1.8/yaml.schema.json +# Visit https://aka.ms/teamsfx-v5.0-guide for details on this file +# Visit https://aka.ms/teamsfx-actions for details on actions +version: v1.8`; + + sinon.stub(fs, "pathExists").resolves(true); + sinon.stub(fs, "readFile").resolves(teamsAppYaml as any); + const writeFileStub = sinon.stub(fs, "writeFile"); + + await updateVersionForTeamsAppYamlFile("fake-project-path"); + + const writtenContent = writeFileStub.getCall(0).args[1]; + expect(writtenContent).to.include(expectedTeamsAppYaml); + }); +});