diff --git a/Composer/packages/server/src/controllers/project.ts b/Composer/packages/server/src/controllers/project.ts index b51b657b53..8ec4cb8daf 100644 --- a/Composer/packages/server/src/controllers/project.ts +++ b/Composer/packages/server/src/controllers/project.ts @@ -19,7 +19,7 @@ import { Path } from './../utility/path'; async function createProject(req: Request, res: Response) { let { templateId } = req.body; - const { name, description, storageId, location, schemaUrl, locale } = req.body; + const { name, description, storageId, location, schemaUrl, locale, preserveRoot } = req.body; const user = await ExtensionContext.getUserFromRequest(req); if (templateId === '') { templateId = 'EmptyBot'; @@ -54,7 +54,7 @@ async function createProject(req: Request, res: Response) { await AssetService.manager.copyBoilerplate(currentProject.dataDir, currentProject.fileStorage); if (currentProject !== undefined) { - await currentProject.updateBotInfo(name, description); + await currentProject.updateBotInfo(name, description, preserveRoot); if (schemaUrl) { await currentProject.saveSchemaToProject(schemaUrl, locationRef.path); } diff --git a/Composer/packages/server/src/models/bot/botProject.ts b/Composer/packages/server/src/models/bot/botProject.ts index 446d5414f8..d2113c6b53 100644 --- a/Composer/packages/server/src/models/bot/botProject.ts +++ b/Composer/packages/server/src/models/bot/botProject.ts @@ -349,7 +349,7 @@ export class BotProject implements IBotProject { } } - public updateBotInfo = async (name: string, description: string) => { + public updateBotInfo = async (name: string, description: string, preserveRoot = false) => { const mainDialogFile = this.dialogFiles.find((file) => !file.relativePath.includes('/')); if (!mainDialogFile) return; const botName = name.trim().toLowerCase(); @@ -378,7 +378,7 @@ export class BotProject implements IBotProject { content.name = botName; await this._updateFile(relativePath, JSON.stringify(content, null, 2)); } - await serializeFiles(this.fileStorage, this.dataDir, botName); + await serializeFiles(this.fileStorage, this.dataDir, botName, preserveRoot); }; public updateFile = async (name: string, content: string): Promise => { diff --git a/Composer/packages/server/src/models/bot/botStructure.ts b/Composer/packages/server/src/models/bot/botStructure.ts index 550bd6b1ec..562a6ddf6a 100644 --- a/Composer/packages/server/src/models/bot/botStructure.ts +++ b/Composer/packages/server/src/models/bot/botStructure.ts @@ -139,15 +139,18 @@ export const defaultFilePath = (botName: string, defaultLocale: string, filename }; // when create/saveAs bot, serialize entry dialog/lg/lu -export const serializeFiles = async (fileStorage, rootPath, botName) => { +export const serializeFiles = async (fileStorage, rootPath, botName, preserveRoot = false) => { const entryPatterns = [ - templateInterpolate(BotStructureTemplate.entry, { BOTNAME: '*' }), templateInterpolate(BotStructureTemplate.lg, { LOCALE: '*', BOTNAME: '*' }), templateInterpolate(BotStructureTemplate.lu, { LOCALE: '*', BOTNAME: '*' }), templateInterpolate(BotStructureTemplate.qna, { LOCALE: '*', BOTNAME: '*' }), templateInterpolate(BotStructureTemplate.dialogSchema, { BOTNAME: '*' }), templateInterpolate(BotStructureTemplate.botProject, { BOTNAME: '*' }), ]; + if (!preserveRoot) { + entryPatterns.push(templateInterpolate(BotStructureTemplate.entry, { BOTNAME: '*' })); + } + for (const pattern of entryPatterns) { const paths = await fileStorage.glob(pattern, rootPath); for (const filePath of paths.sort()) {