diff --git a/templates/Skill-Template/typescript/README.md b/templates/Skill-Template/typescript/README.md new file mode 100644 index 0000000000..f6ec42dfa1 --- /dev/null +++ b/templates/Skill-Template/typescript/README.md @@ -0,0 +1 @@ +Please refer to the [Skill Template]('../../Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/README.md') which is a sub-generator of the **Virtual Assistant Template**. diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/.eslintignore b/templates/Skill-Template/typescript/generator-botbuilder-skill/.eslintignore deleted file mode 100644 index 15e7789f85..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -# Generator's templates -/generators/app/templates - -# Generator's tests -/test \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/.eslintrc b/templates/Skill-Template/typescript/generator-botbuilder-skill/.eslintrc deleted file mode 100644 index be3a1d4cd5..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/.eslintrc +++ /dev/null @@ -1,16 +0,0 @@ -{ - "extends": [ - "xo", - "prettier" - ], - "env": { - "mocha": true, - "node": true - }, - "rules": { - "prettier/prettier": "error" - }, - "plugins": [ - "prettier" - ] -} diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/.npmignore b/templates/Skill-Template/typescript/generator-botbuilder-skill/.npmignore deleted file mode 100644 index d469d74e49..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/.npmignore +++ /dev/null @@ -1,8 +0,0 @@ -# node.js dependencies folder -node_modules/ - -# Bot Files -*.bot - -#generator tests -test/ \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/LICENSE b/templates/Skill-Template/typescript/generator-botbuilder-skill/LICENSE deleted file mode 100644 index 58122aeadd..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2019 Microsoft (http://dev.botframework.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/README.md b/templates/Skill-Template/typescript/generator-botbuilder-skill/README.md deleted file mode 100644 index be00d54e04..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# Skill Generator -> Project template for skills using the Bot Builder SDK V4.. - -## Prerequisites - -- Ensure the [Node Package manager](https://nodejs.org/en/) is installed. - -- Install [Yeoman](http://yeoman.io) using npm: - -```bash -npm install -g yo -``` - -## Installation - -To install the generator using npm: - -```bash -npm install -g generator-botbuilder-skill -``` - -## Build and test locally - -Install the dependencies and dev dependencies of the project you want to test, i.e. botbuilder-skill. -```bash -cd ./templates/Skill-Template/src/typescript/generator-botbuilder-skill/ -npm install -``` - -Link the package of the project locally with the following command so you can easily use it globally. -```bash -npm link -``` -> **Note:** You can test your local changes to the generator immediately if using this command. - -Now you can execute the generator with this command. -```bash -yo botbuilder-skill -``` - -| Generator | Description | -|-----------------------------------------------------|-------------------------------------------------| -| [botbuilder-skill](generators/app/README.md) | Generator that creates a basic skill | - -## License - -MIT © [Microsoft](http://dev.botframework.com) diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/index.js b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/index.js deleted file mode 100644 index f0b0063b8c..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/index.js +++ /dev/null @@ -1,655 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -"use strict"; -const Generator = require("yeoman-generator"); -const chalk = require("chalk"); -const path = require("path"); -const pkg = require("../../package.json"); -const _pick = require("lodash/pick"); -const _camelCase = require("lodash/camelCase"); -const _upperFirst = require("lodash/upperFirst"); -const fs = require("fs"); - -const bigBot = - " ╭────────────────────────╮\n" + - " " + - chalk.blue.bold("//") + - " " + - chalk.blue.bold("\\\\") + - " │ Welcome to the │\n" + - " " + - chalk.blue.bold("//") + - " () () " + - chalk.blue.bold("\\\\") + - " │ BotBuilder Skill │\n" + - " " + - chalk.blue.bold("\\\\") + - " " + - chalk.blue.bold("//") + - " /│ generator! │\n" + - " " + - chalk.blue.bold("\\\\") + - " " + - chalk.blue.bold("//") + - " ╰────────────────────────╯\n" + - ` v${pkg.version}`; - -const tinyBot = - " " + chalk.blue.bold("<") + " ** " + chalk.blue.bold(">") + " "; - -var skillGenerationPath = process.cwd(); -var isAlreadyCreated = false; - -module.exports = class extends Generator { - constructor(args, opts) { - super(args, opts); - - this.option("skillName", { - description: "The name you want to give to your skill.", - type: String, - default: "customSkill", - alias: "n" - }); - - this.option("skillDesc", { - description: "A brief bit of text used to describe what your skill does.", - type: String, - alias: "d" - }); - - this.option("skillGenerationPath", { - description: "The path where the skill will be generated.", - type: String, - default: process.cwd(), - alias: "p" - }); - - this.option("noPrompt", { - description: "Do not prompt for any information or confirmation.", - type: Boolean, - default: false - }); - } - - prompting() { - this.log(bigBot); - // Generate the main prompts - const prompts = [ - // Name of the skill - { - type: "input", - name: "skillName", - message: "What's the name of your skill?", - default: this.options.skillName ? this.options.skillName : "customSkill" - }, - // Description of the skill - { - type: "input", - name: "skillDesc", - message: "What will your skill do?", - default: this.options.skillDesc ? this.options.skillDesc : "" - }, - // Path of the skill - { - type: "confirm", - name: "pathConfirmation", - message: "Do you want to change the new skill's location?", - default: false - }, - { - when: function(response) { - return response.pathConfirmation === true; - }, - type: "input", - name: "skillGenerationPath", - message: "Where do you want to generate the skill?", - default: this.options.skillGenerationPath - ? this.options.skillGenerationPath - : process.cwd(), - validate: path => { - if (fs.existsSync(path)) { - return true; - } - - this.log( - chalk.red( - "\n", - "ERROR: This is not a valid path. Please try again." - ) - ); - } - }, - // Final confirmation of the skill - { - type: "confirm", - name: "finalConfirmation", - message: "Looking good. Shall I go ahead and create your new skill?", - default: true - } - ]; - - // Check that if it was generated with CLI commands - if (this.options.noPrompt) { - this.props = _pick(this.options, [ - "skillName", - "skillDesc", - "skillGenerationPath" - ]); - - // Validate we have what we need, or we'll need to throw - if (!this.props.skillName) { - this.log.error( - "ERROR: Must specify a name for your skill when using --noPrompt argument. Use --skillName or -n option." - ); - process.exit(1); - } - - this.props.finalConfirmation = true; - return; - } - - return this.prompt(prompts).then(props => { - this.props = props; - }); - } - - writing() { - if (this.props.finalConfirmation !== true) { - return; - } - - const templateName = "customSkill"; - const userStateTag = "UserState"; - const skillDesc = this.props.skillDesc; - if (!this.props.skillName.replace(/\s/g, "").length) { - this.props.skillName = templateName; - } - - const skillName = this.props.skillName; - - // Generate vars for templates - const skillNamePascalCase = _upperFirst(_camelCase(this.props.skillName)); - const skillNameCamelCase = _camelCase(this.props.skillName); - const skillNameId = skillNameCamelCase.substring( - 0, - skillNameCamelCase.indexOf("Skill") - ); - const skillNameIdPascalCase = _upperFirst(skillNameId); - skillGenerationPath = path.join(skillGenerationPath, skillName); - if (this.props.skillGenerationPath !== undefined) { - skillGenerationPath = path.join( - this.props.skillGenerationPath, - skillName - ); - } - - const skillUserStateNameClass = `I${skillNamePascalCase.concat( - userStateTag - )}`; - const skillUserStateNameFile = skillNameCamelCase.concat(userStateTag); - - if (fs.existsSync(skillGenerationPath)) { - isAlreadyCreated = true; - return; - } - - // Print current values - this.log(chalk.magenta("\nCurrent values for the new skill:")); - this.log(chalk.magenta("Name: " + skillName)); - this.log(chalk.magenta("Description: " + skillDesc)); - this.log(chalk.magenta("Path: " + skillGenerationPath + "\n")); - - // Copy package.json - this.fs.copyTpl( - this.templatePath(templateName, "_package.json"), - this.destinationPath(skillGenerationPath, "package.json"), - { - name: skillName, - description: skillDesc - } - ); - - // Copy index.ts - this.fs.copyTpl( - this.templatePath(templateName, "src", "_index.ts"), - this.destinationPath(skillGenerationPath, "src", "index.ts"), - { - skillUserStateNameClass: skillUserStateNameClass, - skillUserStateNameFile: skillUserStateNameFile, - skillTemplateName: skillNamePascalCase, - skillTemplateFileName: skillNameCamelCase, - skillProjectName: skillName, - skillProjectNameLU: `${skillName}LU` - } - ); - - // Copy skillConversationState.ts - this.fs.copyTpl( - this.templatePath(templateName, "src", "_skillConversationState.ts"), - this.destinationPath( - skillGenerationPath, - "src", - "skillConversationState.ts" - ), - { - skillProjectNameLU: `${skillNameId}LU` - } - ); - - // Copy skillUserState.ts - this.fs.copyTpl( - this.templatePath(templateName, "src", "_skillUserState.ts"), - this.destinationPath( - skillGenerationPath, - "src", - `${skillUserStateNameFile}.ts` - ), - { - skillUserStateNameClass: skillUserStateNameClass, - skillUserStateNameFile: skillUserStateNameFile, - skillProjectName: skillName, - skillProjectNameLU: `${skillName}LU` - } - ); - - // Copy skillTemplate.ts - this.fs.copyTpl( - this.templatePath(templateName, "src", "_skillTemplate.ts"), - this.destinationPath( - skillGenerationPath, - "src", - `${skillNameCamelCase}.ts` - ), - { - skillUserStateNameClass: skillUserStateNameClass, - skillUserStateNameFile: skillUserStateNameFile, - skillTemplateName: skillNamePascalCase, - skillProjectName: skillName, - skillProjectNameLU: `${skillName}LU` - } - ); - - const languageDirectories = ["de", "en", "es", "fr", "it", "zh"]; - - // Copy LUIS files - languageDirectories.forEach(language => - this.fs.copy( - this.templatePath( - templateName, - "cognitiveModels", - "LUIS", - language, - "_skill.lu" - ), - this.destinationPath( - skillGenerationPath, - "cognitiveModels", - "LUIS", - language, - `${skillNameId}.lu` - ) - ) - ); - - // Copy bot.recipes files - languageDirectories.forEach(languageDirectory => - this.fs.copyTpl( - this.templatePath( - templateName, - "deploymentScripts", - languageDirectory, - "_bot.recipe" - ), - this.destinationPath( - skillGenerationPath, - "deploymentScripts", - languageDirectory, - "bot.recipe" - ), - { - skillProjectName: skillNameId - } - ) - ); - - // Copy mainDialog.ts - this.fs.copyTpl( - this.templatePath( - templateName, - "src", - "dialogs", - "main", - "_mainDialog.ts" - ), - this.destinationPath( - skillGenerationPath, - "src", - "dialogs", - "main", - "mainDialog.ts" - ), - { - skillUserStateNameClass: skillUserStateNameClass, - skillUserStateNameFile: skillUserStateNameFile, - skillProjectName: skillName, - skillProjectNameId: skillNameId - } - ); - - // Copy sampleDialog.ts - this.fs.copyTpl( - this.templatePath( - templateName, - "src", - "dialogs", - "sample", - "_sampleDialog.ts" - ), - this.destinationPath( - skillGenerationPath, - "src", - "dialogs", - "sample", - "sampleDialog.ts" - ), - { - skillUserStateNameClass: skillUserStateNameClass, - skillUserStateNameFile: skillUserStateNameFile - } - ); - - // Copy skillDialogBase.ts - this.fs.copyTpl( - this.templatePath( - templateName, - "src", - "dialogs", - "shared", - "_skillDialogBase.ts" - ), - this.destinationPath( - skillGenerationPath, - "src", - "dialogs", - "shared", - "skillDialogBase.ts" - ), - { - skillUserStateNameClass: skillUserStateNameClass, - skillUserStateNameFile: skillUserStateNameFile, - skillProjectName: skillName, - skillProjectNameId: skillNameId - } - ); - - // Copy skillTestBase file - this.fs.copyTpl( - this.templatePath(templateName, "test", "flow", "_skillTestBase.js"), - this.destinationPath( - skillGenerationPath, - "test", - "flow", - `${skillName}TestBase.js` - ), - { - skillTemplateName: skillNamePascalCase, - skillTemplateNameFile: `${skillNameCamelCase}.js` - } - ); - - // Copy gitignore - this.fs.copy( - this.templatePath(templateName, "_.gitignore"), - this.destinationPath(skillGenerationPath, ".gitignore") - ); - - // Copy commonFiles - const commonFiles = [ - "tsconfig.json", - "tslint.json", - ".env.development", - ".env.production", - path.join("cognitiveModels", "LUIS", "de", "general.lu"), - path.join("cognitiveModels", "LUIS", "en", "general.lu"), - path.join("cognitiveModels", "LUIS", "es", "general.lu"), - path.join("cognitiveModels", "LUIS", "fr", "general.lu"), - path.join("cognitiveModels", "LUIS", "it", "general.lu"), - path.join("cognitiveModels", "LUIS", "zh", "general.lu"), - path.join("deploymentScripts", "bot.recipe"), - path.join("deploymentScripts", "deploy_bot.ps1"), - path.join("deploymentScripts", "generate_deployment_scripts.ps1"), - path.join("deploymentScripts", "update_published_models.ps1"), - path.join("src", "languageModels.json"), - path.join("src", "dialogs", "main", "mainResponses.ts"), - path.join("src", "dialogs", "sample", "sampleResponses.ts"), - path.join("src", "dialogs", "shared", "sharedResponses.ts") - ]; - - commonFiles.forEach(fileName => - this.fs.copy( - this.templatePath(templateName, fileName), - this.destinationPath(skillGenerationPath, fileName) - ) - ); - - // Copy commonDirectories - const commonDirectories = [ - path.join("src", "serviceClients"), - path.join("src", "locales"), - path.join("src", "dialogs", "main", "resources"), - path.join("src", "dialogs", "sample", "resources"), - path.join("src", "dialogs", "shared", "resources"), - path.join("src", "dialogs", "shared", "dialogOptions") - ]; - - commonDirectories.forEach(directory => - this.fs.copy( - this.templatePath(templateName, directory, "**", "*"), - this.destinationPath(skillGenerationPath, directory) - ) - ); - - // Copy skills files - this.fs.copyTpl( - this.templatePath(templateName, "src", "_skills.json"), - this.destinationPath(skillGenerationPath, "src", "skills.json"), - { - skillTemplateName: skillNameCamelCase, - skillTemplateIntentName: `l_${skillNameIdPascalCase}`, - skillTemplateId: skillNameId, - skillTemplateNameClass: skillNamePascalCase - } - ); - - this.fs.copyTpl( - this.templatePath(templateName, "test", "mockResources", "_skills.json"), - this.destinationPath( - skillGenerationPath, - "test", - "mockResources", - "skills.json" - ), - { - skillTemplateName: skillNameCamelCase, - skillTemplateIntentName: `l_${skillNameIdPascalCase}`, - skillTemplateId: skillNameId, - skillTemplateNameClass: skillNamePascalCase - } - ); - - // Copy mainDialogTest file - this.fs.copyTpl( - this.templatePath(templateName, "test", "flow", "_mainDialogTest.js"), - this.destinationPath( - skillGenerationPath, - "test", - "flow", - "mainDialogTest.js" - ), - { - skillTemplateName: skillNameCamelCase, - skillTemplateNameFile: `${skillNameCamelCase}TestBase.js` - } - ); - - // Copy sampleDialogTest file - this.fs.copyTpl( - this.templatePath(templateName, "test", "flow", "_sampleDialogTest.js"), - this.destinationPath( - skillGenerationPath, - "test", - "flow", - "sampleDialogTest.js" - ), - { - skillTemplateName: skillNameCamelCase, - skillTemplateNameFile: `${skillNameCamelCase}TestBase.js` - } - ); - - // Copy interruptionTest file - this.fs.copyTpl( - this.templatePath(templateName, "test", "flow", "_interruptionTest.js"), - this.destinationPath( - skillGenerationPath, - "test", - "flow", - "interruptionTest.js" - ), - { - skillTemplateName: skillNameCamelCase, - skillTemplateNameFile: `${skillNameCamelCase}TestBase.js` - } - ); - - // Copy commonFlowFiles - const commonTestFiles = ["mocha.opts", ".env.test", "testBase.js"]; - - commonTestFiles.forEach(testFlowFileName => - this.fs.copy( - this.templatePath(templateName, "test", testFlowFileName), - this.destinationPath(skillGenerationPath, "test", testFlowFileName) - ) - ); - - // Copy LocaleConfigurations bot files - const localeConfigurationTestFiles = [ - "_mockedSkillDe.bot", - "_mockedSkillEn.bot", - "_mockedSkillEs.bot", - "_mockedSkillFr.bot", - "_mockedSkillIt.bot", - "_mockedSkillZh.bot" - ]; - - localeConfigurationTestFiles.forEach(fileName => - this.fs.copyTpl( - this.templatePath( - templateName, - "test", - "mockResources", - "LocaleConfigurations", - fileName - ), - this.destinationPath( - skillGenerationPath, - "test", - "mockResources", - "LocaleConfigurations", - fileName.substring(1) - ), - { - skillProjectNameId: skillNameId - } - ) - ); - - const commonTestDirectories = [path.join("nockFixtures")]; - - commonTestDirectories.forEach(testCommonDirectory => - this.fs.copy( - this.templatePath(templateName, "test", testCommonDirectory), - this.destinationPath(skillGenerationPath, "test", testCommonDirectory) - ) - ); - - const commonMockResourcesFiles = [ - path.join("languageModels.json"), - path.join("mockedConfiguration.bot") - ]; - - commonMockResourcesFiles.forEach(mockResourcesFile => - this.fs.copy( - this.templatePath( - templateName, - "test", - "mockResources", - mockResourcesFile - ), - this.destinationPath( - skillGenerationPath, - "test", - "mockResources", - mockResourcesFile - ) - ) - ); - } - - end() { - if (this.props.finalConfirmation === true) { - if (isAlreadyCreated) { - this.log( - chalk.red.bold( - "-------------------------------------------------------------------------------------------- " - ) - ); - this.log( - chalk.red.bold( - " ERROR: It's seems like you already have a skill with the same name in the destination path. " - ) - ); - this.log( - chalk.red.bold( - " Try again changing the name or the destination path or deleting the previous skill. " - ) - ); - this.log( - chalk.red.bold( - "-------------------------------------------------------------------------------------------- " - ) - ); - } else { - this.log( - chalk.green( - "---------------------------------------------------------- " - ) - ); - this.log(chalk.green(" Your new skill is ready! ")); - this.log( - chalk.green( - " Now you are able to install the dependencies and build it!" - ) - ); - this.log( - chalk.green( - "---------------------------------------------------------- " - ) - ); - this.log( - "Open the " + - chalk.green.bold("README.md") + - " to learn how to run your skill. " - ); - } - } else { - this.log(chalk.red.bold("-------------------------------- ")); - this.log(chalk.red.bold(" New skill creation was canceled. ")); - this.log(chalk.red.bold("-------------------------------- ")); - } - - this.log("Thank you for using the Microsoft Bot Framework. "); - this.log("\n" + tinyBot + "The Bot Framework Team"); - } -}; diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/.env.development b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/.env.development deleted file mode 100644 index 75904a767e..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/.env.development +++ /dev/null @@ -1,10 +0,0 @@ -# Environment variables for devs -ENDPOINT=development - -BOT_FILE_NAME= -BOT_FILE_SECRET= -APPINSIGHTS_NAME=<--name--> -STORAGE_NAME=<--name--> -BLOB_NAME=<--name--> -LUIS_GENERAL=<--name--> -CONTENT_MODERATOR_NAME=<--name--> \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/.env.production b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/.env.production deleted file mode 100644 index a36fbbe507..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/.env.production +++ /dev/null @@ -1,10 +0,0 @@ -# Environment variables for deployment -ENDPOINT=production - -BOT_FILE_NAME= -BOT_FILE_SECRET= -APPINSIGHTS_NAME=<--name--> -STORAGE_NAME=<--name--> -BLOB_NAME=<--name--> -LUIS_GENERAL=<--name--> -CONTENT_MODERATOR_NAME=<--name--> \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/_.gitignore b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/_.gitignore deleted file mode 100644 index 3c3629e647..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/_.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/de/general.lu b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/de/general.lu deleted file mode 100644 index 5f1f27c81c..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/de/general.lu +++ /dev/null @@ -1,114 +0,0 @@ -> Intent Definitions - -# Greeting -- Hallo -- Guten Morgen -- Guten Abend -- hello bot -- Hiya -- Wie geht es dir -- Wie geht es dir heute -- Hallöchen - -# Help -- Hilfe -- Hilf mir -- Hilfe bitte -- ich stecke -- Ich kann Sie nicht verstehen -- Was soll ich sagen -- Was können Sie mir helfen -- Was können Sie tun -- Was mache ich jetzt -- Warum funktioniert das nicht -- Kannst du mir helfen - -# Cancel -- Stoppen -- Abbrechen -- Ignorieren -- Tue nicht -- machen es nicht -- Tu das nicht -- Ich möchte absagen -- Vergessen Sie es -- Bitte stoppen -- Ausfahrt - -# Restart -- kann ich das noch einmal machen -- Ich muss etwas ändern -- Neu starten -- Start über -- Rückgängig - -# Escalate -- kann ich mit einer Person sprechen -- Ich möchte mit einem Menschen sprechen -- sprechen Sie mit einem Menschen -- Transfer me please -- Kontakt Unterstützung - -# Next -- Voraus -- vorwärts gehen -- gehen Sie zum nächsten -- Nächsten -- nächsten Punkt -- Show Next -- könntest du den nächsten zeigen -- Ich muss zum nächsten gehen -- gehen Sie bitte zum nächsten -- zum nächsten übergehen -- Mache weiter -- zur nächsten Seite -- Vorankommen -- Schritt auf -- Weiter geht es -- nächsten ein -- nächsten bitte -- Zeig mir als nächstes -- Zeige mir die nächste -- zeigen die nächste -- zeigen Sie den nächsten -- die nächste e-Mail - -# Previous -- Zurück -- letzten einen -- vorherige -- der letzte -- jährige ein -- Last -- zurück zum letzten -- bringen Sie die vorherige -- kommen Sie zum letzten -- gehen Sie zu früheren -- zum letzten gehen -- zurückziehen -- Vorherigen -- Zeige mir vorher -- vorherige bitte -- der vorherige -- Was ist der bisherige - -# Goodbye -- Gute Nacht -- Goodbye -- Auf Wiedersehen -- Ok danke -- Ok tschüss -- Das ist es dank - -# Logout -- SignOut -- Vergiss mich -- Abmelden -- logout - -# None -- meine Wasserflasche ist grün -- Schildkröten Schwimmen gerne im Ozean -- papierflugzeuge am Himmel - -> PhraseList diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/en/general.lu b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/en/general.lu deleted file mode 100644 index d4516fc854..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/en/general.lu +++ /dev/null @@ -1,117 +0,0 @@ -> Intent Definitions - -# Greeting -- hi -- hello -- good morning -- good evening -- hello bot -- hiya -- how are you -- how are you today -- hey - -# Help -- help -- help me -- help please -- i'm stuck -- i don't understand -- what can I say -- what can you help me with -- what can you do -- what do i do now -- why doesn't this work -- can you help me - -# Cancel -- stop -- abort -- cancel -- disregard -- don't -- don't do it -- don't do that -- i would like to cancel -- never mind -- please stop -- exit - -# Restart -- can i do that again -- i need to change something -- restart -- start over -- undo - -# Escalate -- can i talk to a person -- i want to talk to a human -- talk to a human -- transfer me please -- contact support - -# Next -- advance -- go forward -- go to next -- next -- next item -- show next -- could you show the next one -- i need to go to the next one -- go to the next one please -- move to the next one -- go on -- go to the next page -- move forward -- move on -- move on next -- next one -- next please -- show me next -- show me the next -- show the next -- show the next one -- the next email - -# Previous -- go back -- last one -- previous one -- the last one -- old one -- last -- back to the last one -- bring the previous one -- come to the last -- go to previous -- go to the last one -- move back -- previous -- show me previous -- previous one please -- the previous one -- what is the previous - -# Goodbye -- good night -- goodbye -- bye -- ok thanks -- ok bye -- that's it thanks - -# Logout -- signout -- forget me -- sign out -- logout -- log out - -# None -- my water bottle is green -- turtles like to swim in the ocean -- paper planes in the sky - -> PhraseList \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/es/general.lu b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/es/general.lu deleted file mode 100644 index f865c95931..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/es/general.lu +++ /dev/null @@ -1,137 +0,0 @@ -> Intent Definitions - -# Greeting -- Buenos días -- Buenas noches -- Hola bot -- Cómo estás -- Cómo te va -- Oye - -# Help -- Ayuda -- Ayúdame -- ayuda por favor -- Estoy atascado -- No entiendo -- Qué puedo decir -- ¿Qué me puede ayudar con -- ¿Qué puedes hacer -- ¿Qué hago ahora -- ¿por qué no funciona esto -- Me puedes ayudar - -# Cancel -- Parada -- Aborta -- Cancelar -- Desprecio -- No lo hagas -- No hagas eso -- me gustaría cancelar -- Olvídalo -- por favor, pare -- Salida - -# Restart -- puedo hacer eso de nuevo -- Necesito cambiar algo -- Reiniciar -- empezar de -- Deshacer - -# Escalate -- ¿puedo hablar con una persona -- Quiero hablar con un humano -- hablar con un humano -- Transfiera me por favor -- soporte de contacto - -# ConfirmYes -- Absolutamente -- Seguro -- Definitivamente -- Eso creo -- Hagámoslo -- vamos a hacer eso -- Venga, sí -- Sí, por favor -- Bien -- Vale -- Claro -- sí que sería genial gracias -- Por qué no -- sí que es cierto -- Sí -- Adelante - -# ConfirmNo -- de ninguna manera -- Cerca -- No, gracias -- no está bien -- No es posible -- De nada -- La verdad es que no -- ahora no gracias - -# ConfirmMore -- Más -- me gustaría saber más -- Muéstrame más -- más info -- más información - -# Next -- Avanzan -- seguir adelante -- ir al siguiente -- Próxima -- siguiente elemento -- Mostrar siguiente -- ¿podría mostrar el siguiente -- necesito ir al siguiente -- ir a la siguiente, por favor -- pasar al siguiente -- Sigue -- ir a la página siguiente -- Avanzar -- avanzar en la siguiente -- siguiente uno -- siguiente por favor -- Muéstrame la próxima -- Muéstrame la siguiente -- Mostrar el siguiente -- el siguiente correo electrónico - -# Previous -- Volver -- último uno -- anterior uno -- el último -- viejo uno -- Última -- volver a The Last One -- traer el anterior -- llegar a la última -- ir a anterior -- ir a la última -- retroceder -- Anterior -- mostrarme anterior -- anterior por favor -- el anterior -- ¿Cuál es el anterior - -# Goodbye -- Adiós -- Gracias -- Bueno adiós -- eso es todo gracias - -# None -- mi botella de agua es verde -- a las tortugas les gusta nadar en el océano -- aviones de papel en el cielo - -> PhraseList diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/fr/general.lu b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/fr/general.lu deleted file mode 100644 index f9ba628e50..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/fr/general.lu +++ /dev/null @@ -1,108 +0,0 @@ -> Intent Definitions - -# Greeting -- Salut -- Bonjour -- Bonsoir -- Bonjour bot -- Comment vas-tu -- Comment vas-tu aujourd'hui -- Hé - -# Help -- Aide -- Aide-moi -- aide s'il vous plaît -- Je suis coincé -- Je ne comprends pas -- que puis-je dire -- que pouvez-vous m'aider avec -- que pouvez-vous faire -- que dois-je faire maintenant -- Pourquoi cela ne fonctionne-t-il pas -- Est-ce que vous pouvez m'aider - -# Cancel -- Arrêter -- Annuler -- Mépris -- Ne pas -- Fais pas ça -- Je voudrais annuler -- C'est pas grave -- s'il vous plaît arrêter -- Sortie - -# Restart -- puis-je recommencer -- J'ai besoin de changer quelque chose -- Redémarrer -- recommencer - -# Escalate -- puis-je parler à une personne -- Je veux parler à un humain -- parler à un humain -- Transférez-moi svp -- Contacter le support technique - -# Next -- Avance -- aller de l'avant -- aller à la prochaine -- Prochaine -- point suivant -- afficher suivant -- pourriez-vous montrer la prochaine -- J'ai besoin d'aller à l'autre -- allez à la prochaine s'il vous plaît -- passer à la suivante -- Allez -- aller à la page suivante -- Avancer -- passer à la prochaine -- Next One -- suivant s'il vous plaît -- Montrez-moi la prochaine -- afficher la prochaine -- afficher la suivante -- le prochain Courriel - -# Previous -- Retour -- Last One -- précédent -- le dernier -- Old One -- Dernière -- Retour à la dernière -- Apportez le précédent -- Venez à la dernière -- aller à la précédente -- aller à la dernière -- reculer -- Précédente -- Montrez-moi précédent -- précédent s'il vous plaît -- le précédent -- Quel est le précédent - -# Goodbye -- Bonne nuit -- Au revoir -- Ok merci -- Ok salut -- C'est tout Merci - -# Logout -- SignOut -- oubliez-moi -- se déconnecter -- Déconnexion - -# None -- ma bouteille d'eau est verte -- les tortues aiment nager dans l'océan -- avions de papier dans le ciel - -> PhraseList diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/it/general.lu b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/it/general.lu deleted file mode 100644 index 617e8c9b2b..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/it/general.lu +++ /dev/null @@ -1,106 +0,0 @@ -> Intent Definitions - -# Greeting -- Ciao -- Buongiorno -- Buona sera -- Ciao bot -- Come stai -- Come stai oggi -- Ehi - -# Help -- Guida -- Aiutami -- aiuto per favore -- sono bloccato -- Non capisco -- cosa posso dire -- cosa mi può aiutare con -- Cosa potete fare -- cosa devo fare ora -- perché non questo lavoro -- Puoi aiutarmi - -# Cancel -- Fermare -- Interrompere -- Annulla -- Ignorare -- Non -- Non farlo -- Vorrei annullare -- Non importa -- si prega di smettere -- Uscita - -# Restart -- Posso farlo di nuovo -- Ho bisogno di cambiare qualcosa -- Riavviare -- ricominciare - -# Escalate -- Posso parlare con una persona -- Voglio parlare con un umano -- parlare con un essere umano -- Transfer me please -- Contatta il supporto - -# Next -- Anticipo -- andare avanti -- Vai al prossimo -- Prossima -- articolo successivo -- Mostra successivo -- Potresti mostrare quello successivo -- Ho bisogno di andare a quello successivo -- Vai a quello successivo per favore -- passare a quella successiva -- Continua -- Vai alla pagina successiva -- prossimo uno -- Avanti per favore -- Mostrami il prossimo -- Mostra il prossimo -- Mostra quello successivo -- la prossima e-mail - -# Previous -- Indietro -- ultimo uno -- precedente -- l'ultimo -- quello vecchio -- Ultima -- Torna all'ultimo -- portare il precedente -- venire all'ultimo -- Vai al precedente -- Vai all'ultimo -- spostare indietro -- Mostrami precedente -- uno precedente per favore -- quello precedente -- Qual è il precedente - -# Goodbye -- Buona notte -- Addio -- Ok grazie -- Ok ciao -- Questo è tutto grazie - -# Logout -- SignOut -- dimenticare me -- Esci -- logout - -# None -- la mia bottiglia d'acqua è verde -- le tartarughe amano nuotare nell'oceano -- aerei di carta nel cielo - -> PhraseList diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/zh/general.lu b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/zh/general.lu deleted file mode 100644 index eab00f22f4..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/zh/general.lu +++ /dev/null @@ -1,161 +0,0 @@ -> # Intent definitions - -## Cancel -- 不 -- 不了 -- 不要 -- 中止 -- 停止 -- 别这样 -- 取消 -- 我想取消 -- 无视 -- 没关系 -- 算了 -- 请停止 - - -## Escalate -- 与人交谈 -- 叫你负责人来 -- 我想和一个人谈谈 -- 我能和一个人说话吗? -- 找个管事的 -- 把你老板叫来 -- 联系支持 -- 请转移我 - - -## Goodbye -- 再见 -- 好的,再见 -- 好的,谢谢 -- 就这样吧 -- 晚安 -- 没事了 -- 谢谢 - - -## Greeting -- 你今天感觉如何 -- 你好 -- 你好吗 -- 哈啰 -- 嗨 -- 嘿 -- 怎么样 -- 您好 bot -- 早上好 -- 晚上好 - - -## Help -- 为什么不这样做 -- 你可以帮我吗 -- 你能做什么 -- 你能帮我什么? -- 咋回事 -- 帮助 -- 帮助请 -- 帮帮我 -- 怎么回事 -- 我不懂 -- 我不明白 -- 我现在该怎么办 -- 我能说什么呢 -- 我被卡住了 - - -## Logout -- 忘记我 -- 注销 -- 退出 - - -## Next -- 下 -- 下一封电子邮件 -- 下一条 -- 下一页 -- 下一页请 -- 下一项 -- 你能展示下一张吗? -- 前进 -- 我要去下一个 -- 显示下一 -- 显示下一个 -- 显示下一页 -- 移到下一个 -- 继续 -- 继续下一步 -- 继续前进 -- 让我看看下一个 -- 请转到下一个 -- 转到下一页 -- 进展 - - -## None -- 买苹果 -- 取消会议 -- 取消客户简报 -- 取消我们的行程 -- 哈 哈哈 -- 哈哈 -- 天空中的纸飞机 -- 寻找星巴克 -- 我很冷 -- 我有什么会议 -- 我的水瓶是绿色的 -- 打开收音机 -- 提醒我去取牛奶 -- 是的 -- 海龟喜欢在海里游泳 -- 航班取消 -- 重新启动讨论 -- 预订会议 - - -## Previous -- 上一张请 -- 上一条 -- 什么是以前 -- 以前 -- 前一个 -- 回到最后一个 -- 回去 -- 带上一个 -- 显示上一页 -- 最后 -- 最后一个 -- 老一 -- 走到最后 -- 转到上一页 -- 转到最后一个 -- 退后 - - -## Restart -- 从头开始 -- 再来一次 -- 我能再做一次吗 -- 我需要改变一些事情 -- 撤消 -- 重新 启动 -- 重来 - - -> # Entity definitions - - -> # PREBUILT Entity definitions - -$PREBUILT:datetimeV2 - -$PREBUILT:number - - -> # Phrase list definitions - - -> # List entities \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/bot.recipe b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/bot.recipe deleted file mode 100644 index d472b275bc..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/bot.recipe +++ /dev/null @@ -1,40 +0,0 @@ -{ - "version": "1.0", - "resources": [ - { - "type": "endpoint", - "id": "1", - "name": "development", - "url": "http://localhost:3980/api/messages" - }, - { - "type": "endpoint", - "id": "108", - "name": "production", - "url": "https://your-bot-url.azurewebsites.net/api/messages" - }, - { - "type": "abs", - "id": "199", - "name": "CustomAssistantABS" - }, - { - "type": "blob", - "id": "2", - "name": "CustomAssistantStorage", - "container": "transcripts" - }, - { - "type": "appInsights", - "id": "3", - "name": "CustomAssistantInsights" - }, - { - "type": "cosmosdb", - "id": "8", - "name": "CustomAssistantCosmosDB", - "database": "botstate-db", - "collection": "botstate-collection" - } - ] -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/de/_bot.recipe b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/de/_bot.recipe deleted file mode 100644 index c133d2597a..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/de/_bot.recipe +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": "1.0", - "resources": [ - { - "type": "luis", - "id": "general", - "name": "General", - "luPath": "..\\cognitiveModels\\LUIS\\de\\general.lu" - }, - { - "type": "luis", - "id": "<%=skillProjectName%>", - "name": "<%=skillProjectName%>", - "luPath": "..\\cognitiveModels\\LUIS\\de\\<%=skillProjectName%>.lu" - } - ] -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/deploy_bot.ps1 b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/deploy_bot.ps1 deleted file mode 100644 index 19dbb159f5..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/deploy_bot.ps1 +++ /dev/null @@ -1,62 +0,0 @@ -#Requires -Version 6 - -# all msbot clone parameters and locales -Param( - [string] [Parameter(Mandatory=$true)]$name, - [string] [Parameter(Mandatory=$true)]$location, - [string] [Parameter(Mandatory=$true)]$luisAuthoringKey, - [string] $locales = "en-us", - [switch] $languagesOnly, - [string] $luisAuthoringRegion, - [string] $luisPublishRegion, - [string] $subscriptionId, - [string] $insightsRegion, - [string] $groupName = $name, - [string] $sdkLanguage, - [string] $sdkVersion, - [string] $prefix, - [string] $appId, - [string] $appSecret, - [switch] $showLogs -) - -if (!$languagesOnly) -{ - # Change to project directory for .bot file - Write-Host "Changing to project directory ..." - Set-Location "$(Join-Path $PSScriptRoot ..)" - - # Deploy the common resources (Azure Bot Service, App Insights, Azure Storage, Cosmos DB, etc) - Write-Host "Deploying common resources..." - $msbotScript = "msbot clone services -n " + $name + " -l " + $location + " --luisAuthoringKey " + $luisAuthoringKey + " --groupName " + $groupName + " --folder $($PSScriptRoot) --appId " + $appId + " --appSecret " + $appSecret + " --force " - if($showLogs) - { - $msbotScript += "--verbose" - } - else - { - $msbotScript += "--quiet" - } - Invoke-Expression $msbotScript -} - -$localeArr = $locales.Split(',') - -foreach ($locale in $localeArr) -{ - # Update deployment scripts for the locale - Invoke-Expression "$(Join-Path $PSScriptRoot generate_deployment_scripts.ps1) -locale $($locale)" - - # Get language code from locale (first two characters, i.e. "en") - $langCode = ($locale -split "-")[0] - - # Create LocaleConfigurations folder and change directory - New-Item -ItemType directory -Force -Path "$(Join-Path $PSScriptRoot .. LocaleConfigurations)" > $null - cd "$(Join-Path $PSScriptRoot .. LocaleConfigurations)" > $null - - # Deploy Dispatch, LUIS (calendar, email, todo, and general), and QnA Maker for the locale - Write-Host "Deploying $($locale) resources..." - msbot clone services -n "$($name)$($langCode)" -l $location --luisAuthoringKey $luisAuthoringKey --groupName $groupName --force --quiet --folder "$(Join-Path $PSScriptRoot $langCode)" | Out-Null -} - -Write-Host "Done." \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/en/_bot.recipe b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/en/_bot.recipe deleted file mode 100644 index 709438a14e..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/en/_bot.recipe +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": "1.0", - "resources": [ - { - "type": "luis", - "id": "general", - "name": "General", - "luPath": "..\\cognitiveModels\\LUIS\\de\\general.lu" - }, - { - "type": "luis", - "id": "<%=skillProjectName%>", - "name": "<%=skillProjectName%>", - "luPath": "..\\cognitiveModels\\LUIS\\en\\<%=skillProjectName%>.lu" - } - ] -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/es/_bot.recipe b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/es/_bot.recipe deleted file mode 100644 index c06fae8814..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/es/_bot.recipe +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": "1.0", - "resources": [ - { - "type": "luis", - "id": "general", - "name": "General", - "luPath": "..\\cognitiveModels\\LUIS\\es\\general.lu" - }, - { - "type": "luis", - "id": "<%=skillProjectName%>", - "name": "<%=skillProjectName%>", - "luPath": "..\\cognitiveModels\\LUIS\\es\\<%=skillProjectName%>.lu" - } - ] -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/es/bot.recipe b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/es/bot.recipe deleted file mode 100644 index f47310aa44..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/es/bot.recipe +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": "1.0", - "resources": [ - { - "type": "luis", - "id": "general", - "name": "General", - "luPath": "..\\cognitiveModels\\LUIS\\es\\general.lu" - }, - { - "type": "luis", - "id": "<%= name %>", - "name": "<%= name %>", - "luPath": "..\\cognitiveModels\\LUIS\\es\\<%= name %>.lu" - } - ] -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/fr/_bot.recipe b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/fr/_bot.recipe deleted file mode 100644 index e381b6ee4d..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/fr/_bot.recipe +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": "1.0", - "resources": [ - { - "type": "luis", - "id": "general", - "name": "General", - "luPath": "..\\cognitiveModels\\LUIS\\fr\\general.lu" - }, - { - "type": "luis", - "id": "<%=skillProjectName%>", - "name": "<%=skillProjectName%>", - "luPath": "..\\cognitiveModels\\LUIS\\fr\\<%=skillProjectName%>.lu" - } - ] -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/fr/bot.recipe b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/fr/bot.recipe deleted file mode 100644 index bad6499338..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/fr/bot.recipe +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": "1.0", - "resources": [ - { - "type": "luis", - "id": "general", - "name": "General", - "luPath": "..\\cognitiveModels\\LUIS\\fr\\general.lu" - }, - { - "type": "luis", - "id": "<%= name %>", - "name": "<%= name %>", - "luPath": "..\\cognitiveModels\\LUIS\\fr\\<%= name %>.lu" - } - ] -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/generate_deployment_scripts.ps1 b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/generate_deployment_scripts.ps1 deleted file mode 100644 index 6c4ff6d30b..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/generate_deployment_scripts.ps1 +++ /dev/null @@ -1,46 +0,0 @@ -#Requires -Version 6 - -param ( - [string] [Parameter(Mandatory=$true)]$locale -) - -function CheckForDuplicates($lu) { - $duplicates = Get-Content $lu | Group-Object | Where-Object { $_.Count -gt 1 } | Select-Object -ExpandProperty Name - - if ($duplicates.Count -gt 1) - { - Write-Warning "$($duplicates.Count - 1) duplicate utterances found in $($lu). This could cause issues in your model accuracy." - } -} - -$locale = $locale.ToLower() -$langCode = ($locale -split "-")[0] -$basePath = Join-Path $PSScriptRoot ".." -$outputPath = Join-Path $basePath "DeploymentScripts" $langCode -$recipePath = Join-Path $basePath "DeploymentScripts" $langCode "bot.recipe" -$recipe = Get-Content -Raw -Path $recipePath | ConvertFrom-Json - -Write-Host $basePath - - -foreach ($service in $recipe.resources) -{ - Write-Host "Generating $($locale) $($service.name) script ..." - $path = Join-Path $basePath $service.luPath - - if ($service.type -eq "luis") - { - CheckForDuplicates $path - ludown parse toluis -c $($locale) -o $outputPath --in $path --out "$($service.id).luis" -n $service.Name - } - elseif ($service.type -eq "qna") - { - CheckForDuplicates $path - ludown parse toqna -o $outputPath --in $path --out "$($service.id).qna" - } - elseif ($service.type -eq "dispatch") - { - CheckForDuplicates $path - ludown parse toluis -c $($locale) -o $outputPath --in $path --out "$($service.id).luis" -n $service.Name - } -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/it/_bot.recipe b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/it/_bot.recipe deleted file mode 100644 index c9f6ff81d8..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/it/_bot.recipe +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": "1.0", - "resources": [ - { - "type": "luis", - "id": "general", - "name": "General", - "luPath": "..\\cognitiveModels\\LUIS\\it\\general.lu" - }, - { - "type": "luis", - "id": "<%=skillProjectName%>", - "name": "<%=skillProjectName%>", - "luPath": "..\\cognitiveModels\\LUIS\\it\\<%=skillProjectName%>.lu" - } - ] -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/it/bot.recipe b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/it/bot.recipe deleted file mode 100644 index d7927803d7..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/it/bot.recipe +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": "1.0", - "resources": [ - { - "type": "luis", - "id": "general", - "name": "General", - "luPath": "..\\cognitiveModels\\LUIS\\it\\general.lu" - }, - { - "type": "luis", - "id": "<%= name %>", - "name": "<%= name %>", - "luPath": "..\\cognitiveModels\\LUIS\\it\\<%= name %>.lu" - } - ] -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/update_published_models.ps1 b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/update_published_models.ps1 deleted file mode 100644 index 34babb413a..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/update_published_models.ps1 +++ /dev/null @@ -1,172 +0,0 @@ -#Requires -Version 6 - -param ( - [string] $locales = "de-de,en-us,es-es,fr-fr,it-it,zh-cn", - [string] $serviceIds -) - -$basePath = Join-Path $PSScriptRoot ".." "LocaleConfigurations" -$botFiles = get-childitem $basePath -recurse | where {$_.extension -eq ".bot"} -$localeArr = $locales.split(',') - -Write-Host $localeArr - -if ($PSBoundParameters.ContainsKey('serviceIds')) { - $serviceIdArr = $serviceIds.split(',') -} -else { - $serviceIdArr = @() -} - -function UpdateLUIS ($botFilePath, $langCode, $id) { - $versions = msbot get $id --bot $botFilePath | luis list versions --stdin | ConvertFrom-Json - - if ($versions | where {$_.version -eq "backup"}) - { - msbot get $id --bot $botFilePath | luis delete version --stdin --versionId backup --force --wait - } - - msbot get $id --bot $botFilePath | luis rename version --newVersionId backup --stdin --wait - msbot get $id --bot $botFilePath | luis import version --stdin --in "$(Join-Path $PSScriptRoot $langCode $id).luis" --wait - msbot get $id --bot $botFilePath | luis train version --wait --stdin - msbot get $id --bot $botFilePath | luis publish version --stdin -} - -function UpdateKB ($botFilePath, $langCode, $id) { - Write-Host "Updating $($langCode) knowledge base $($id)..." - - msbot get $id --bot $botFilePath | qnamaker replace kb --in "$(Join-Path $PSScriptRoot $langCode $id).qna" --stdin - msbot get $id --bot $botFilePath | qnamaker publish kb --stdin -} - -function ImportLUIS ($botFileName, $botFilePath, $langCode, $id, $sampleService) { - $luisService = luis import application --appName "$($botFileName)_$($id)" --authoringKey $sampleService.authoringKey --subscriptionKey $sampleService.authoringKey --region $sampleService.region --in "$(Join-Path $recipeBasePath $id).luis" --wait --msbot | ConvertFrom-Json - Add-Member -InputObject $luisService -MemberType NoteProperty -Name id -Value $id -Force - - $botServices = Get-Content -Raw -Path $botFilePath | ConvertFrom-Json - $botServices.services += $luisService - $botFileJson = $botServices | ConvertTo-Json -Depth 10 - Set-Content -Path $botFilePath -Value $botFileJson - - msbot get $id --bot $botFilePath | luis train version --wait --stdin - msbot get $id --bot $botFilePath | luis publish version --stdin -} - -function ImportKB ($botFilePath, $langCode, $id, $sampleService){ - Write-Host "Importing $($langCode) knowledge base $($id)..." - $qnaService = qnamaker create kb --in "$(Join-Path $recipeBasePath $id).qna" --name $id --subscriptionKey $sampleService.subscriptionKey --msbot | ConvertFrom-Json - Add-Member -InputObject $qnaService -MemberType NoteProperty -Name id -Value $id -Force - - $botServices = Get-Content -Raw -Path $botFilePath | ConvertFrom-Json - $botServices.services += $qnaService - $botFileJson = $botServices | ConvertTo-Json -Depth 10 - Set-Content -Path $botFilePath -Value $botFileJson - - msbot get $id --bot $botFilePath | qnamaker publish kb --stdin -} - -foreach ($locale in $localeArr) { - Invoke-Expression "$(Join-Path $PSScriptRoot generate_deployment_scripts.ps1) -locale $($locale)" -} - -foreach ($botFile in $botFiles) { - $botFileName = $botFile | % {$_.BaseName} - $botFilePath = $botFile.FullName - $langCode = $botFileName.Substring($botFileName.Length - 2, 2) - $recipeBasePath = Join-Path $PSScriptRoot $langCode - $recipePath = Join-Path $recipeBasePath "bot.recipe" - - # if locale of bot file is in the list - if ($localeArr | where {$_ -like "*$($langCode)*"}) { - - # get the services from the bot file - $botServices = Get-Content -Raw -Path $botFilePath | ConvertFrom-Json - $recipeServices = Get-Content -Raw -Path $recipePath | ConvertFrom-Json - - # if there are any service ids supplied as parameters - if ($serviceIdArr.Count -gt 0) { - - # foreach supplied service - foreach ($serviceId in $serviceIdArr) { - - # get the service from .bot and .recipe - $service = $botServices.services | where { $_.id -eq $serviceId } - $recipeService = $recipeServices.resources | where { $_.id -eq $serviceId} - - # if service exists in .bot file - if ($service) { - # if LUIS or dispatch call UpdateLUIS, else call UpdateKB - if (($service.type -eq "luis") -or ($service.type -eq "dispatch")) { - UpdateLUIS $botFilePath $langCode $service.id - - if ($service.id -eq "dispatch") { - luisgen "$(Join-Path $basePath .. deploymentScripts $langCode dispatch.luis)" -ts dispatch -o "$(Join-Path $basePath .. src dialogs shared resources)" - } - else { - luisgen "$(Join-Path $basePath .. deploymentScripts $langCode $service.id).luis" -ts "$($recipeService.Name)LU" -o "$(Join-Path $basePath .. $recipeService.luPath .. .. .. .. src dialogs shared resources)" - } - } - elseif ($service.type -eq "qna") { - UpdateKB $botFilePath $langCode $service.id - } - } - elseif ($recipeService) { - if ($recipeService.type -eq "luis") { - $sampleService = $botServices.services | where { $_.type -eq "luis" } | Select-Object -First 1 - ImportLUIS $botFileName $botFilePath $langCode $service.id $sampleService - } - elseif ($recipeService.type -eq "dispatch") { - $sampleService = $botServices.services | where { $_.type -eq "luis" } | Select-Object -First 1 - ImportLUIS $botFileName $botFilePath $langCode $service.id $sampleService - } - elseif($recipeService.type -eq "qna"){ - $sampleService = $botServices.services | where { $_.type -eq "qna" } | Select-Object -First 1 - ImportKB $botFilePath $langCode $service.id $sampleService - } - } - } - } - - # if no service ids were supplied, update everything - else { - foreach ($recipeService in $recipeServices.resources) { - - # if service exists in bot file - $service = $botServices.services | where { $_.id -eq $recipeService.id } - - if ($service) { - if (($service.type -eq "luis") -or ($service.type -eq "dispatch")) { - UpdateLUIS $botFilePath $langCode $service.id - - if ($service.id -eq "dispatch") { - luisgen "$(Join-Path $basePath .. deploymentScripts $langCode dispatch.luis)" -ts dispatch -o "$(Join-Path $basePath .. src dialogs shared resources)" - } - else { - luisgen "$(Join-Path $basePath .. deploymentScripts $langCode $service.id).luis" -ts "$($recipeService.Name)LU" -o "$(Join-Path $basePath .. $recipeService.luPath .. .. .. .. src dialogs shared resources)" - } - } - elseif ($service.type -eq "qna") { - UpdateKB $botFilePath $langCode $service.id - } - } - else { - if ($recipeService.type -eq "luis") { - $sampleService = $botServices.services | where { $_.type -eq "luis" } | Select-Object -First 1 - ImportLUIS $botFileName $botFilePath $langCode $recipeService.id $sampleService - - if ($service.id -eq "dispatch") { - luisgen "$(Join-Path $basePath .. deploymentScripts $langCode dispatch.luis)" -ts dispatch -o "$(Join-Path $basePath .. src dialogs shared resources)" - } - else { - luisgen "$(Join-Path $basePath .. deploymentScripts $langCode $service.id).luis" -ts "$($recipeService.Name)LU" -o "$(Join-Path $basePath .. $recipeService.luPath .. .. .. .. src dialogs shared resources)" - } - } - elseif ($recipeService.type -eq "qna") { - $sampleService = $botServices.services | where { $_.type -eq "qna" } | Select-Object -First 1 - ImportKB $botFilePath $langCode $recipeService.id $sampleService - } - } - } - } - } -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/zh/_bot.recipe b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/zh/_bot.recipe deleted file mode 100644 index 48575a60e9..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/zh/_bot.recipe +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": "1.0", - "resources": [ - { - "type": "luis", - "id": "general", - "name": "General", - "luPath": "..\\cognitiveModels\\LUIS\\zh\\general.lu" - }, - { - "type": "luis", - "id": "<%=skillProjectName%>", - "name": "<%=skillProjectName%>", - "luPath": "..\\cognitiveModels\\LUIS\\zh\\"<%=skillProjectName%>".lu" - } - ] -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/zh/bot.recipe b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/zh/bot.recipe deleted file mode 100644 index 0ef0dcbb35..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/deploymentScripts/zh/bot.recipe +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": "1.0", - "resources": [ - { - "type": "luis", - "id": "general", - "name": "General", - "luPath": "..\\cognitiveModels\\LUIS\\zh\\general.lu" - }, - { - "type": "luis", - "id": "<%= name %>", - "name": "<%= name %>", - "luPath": "..\\cognitiveModels\\LUIS\\zh\\<%= name %>.lu" - } - ] -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/_index.ts b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/_index.ts deleted file mode 100644 index b0f425d91c..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/_index.ts +++ /dev/null @@ -1,249 +0,0 @@ -/** - * Copyright(c) Microsoft Corporation.All rights reserved. - * Licensed under the MIT License. - */ - -import { TelemetryClient } from 'applicationinsights'; -import { - ActivityExtensions, - EventDebuggerMiddleware, - Locales, - ProactiveState, - ProactiveStateMiddleware, - ResponseManager, - SetLocaleMiddleware, - SkillConfiguration, - SkillDefinition, - TelemetryExtensions -} from 'bot-solution'; -import { - AutoSaveStateMiddleware, - BotFrameworkAdapter, - ConversationState, - ShowTypingMiddleware, - TranscriptLoggerMiddleware, - TurnContext, - UserState -} from 'botbuilder'; -import { - AzureBlobTranscriptStore, - CosmosDbStorage, - CosmosDbStorageSettings -} from 'botbuilder-azure'; -import { - BlobStorageService, - BotConfiguration, - IAppInsightsService, - IBlobStorageService, - IBotConfiguration, - IConnectedService, - ICosmosDBService, - IEndpointService, - ServiceTypes -} from 'botframework-config'; -import { ActivityTypes } from 'botframework-schema'; -import { config } from 'dotenv'; -import i18next from 'i18next'; -import i18nextNodeFsBackend from 'i18next-node-fs-backend'; -import * as path from 'path'; -import * as restify from 'restify'; -import { MainResponses } from './dialogs/main/mainResponses'; -import { SampleResponses } from './dialogs/sample/sampleResponses'; -import { SharedResponses } from './dialogs/shared/sharedResponses'; -import { default as languageModelsRaw } from './languageModels.json'; -import { ServiceManager } from './serviceClients/serviceManager'; -import { default as skillsRaw } from './skills.json'; - -import { <%=skillTemplateName%> } from './<%=skillTemplateFileName%>'; - -// Read variables from .env file. -const ENV_NAME: string = process.env.NODE_ENV || 'development'; -config({ path: path.join(__dirname, '..', `.env.${ENV_NAME}`) }); - -const BOT_CONFIGURATION: string = (process.env.ENDPOINT || 'development'); -const BOT_CONFIGURATION_ERROR: number = 1; - -const CONFIGURATION_PATH: string = path.join(__dirname, '..', process.env.BOT_FILE_NAME || '.bot'); -const BOT_SECRET: string = process.env.BOT_FILE_SECRET || ''; - -const DEFAULT_LOCALE: string = process.env.DEFAULT_LOCALE || 'en'; -const APPINSIGHTS_NAME: string = process.env.APPINSIGHTS_NAME || ''; -const STORAGE_CONFIGURATION: string = process.env.STORAGE_NAME || ''; -const BLOB_NAME: string = process.env.BLOB_NAME || ''; - -// Configure internationalization and default locale -i18next.use(i18nextNodeFsBackend) -.init({ - fallbackLng: 'en', - preload: [ 'de', 'en', 'es', 'fr', 'it', 'zh' ], - backend: { - loadPath: path.join(__dirname, 'locales', '{{lng}}.json') - } -}) -.then(async () => { - await Locales.addResourcesFromPath(i18next, 'common'); -}); - -function searchService(botConfiguration: IBotConfiguration, serviceType?: ServiceTypes, nameOrId?: string): IConnectedService|undefined { - const candidates: IConnectedService[] = botConfiguration.services - .filter((s: IConnectedService) => !serviceType || s.type === serviceType); - const service: IConnectedService|undefined = candidates.find((s: IConnectedService) => s.id === nameOrId || s.name === nameOrId) - || candidates.find((s: IConnectedService) => true); - - if (!service && nameOrId) { - throw new Error(`Service '${nameOrId}' [type: ${serviceType}] not found in .bot file.`); - } - - return service; -} - -// Initializes your bot language models and skills definitions -const languageModels: Map = new Map( - Object.entries(languageModelsRaw) - .map((f: [string, { botFilePath: string; botFileSecret: string }]) => { - const fullPath: string = path.join(__dirname, f[1].botFilePath); - f[1].botFilePath = fullPath; - - return f; - }) - ); - -const skills: SkillDefinition[] = skillsRaw.map((skill: { [key: string]: Object|undefined }) => { - const result: SkillDefinition = Object.assign(new SkillDefinition(), skill); - result.configuration = new Map(Object.entries(skill.configuration || {})); - - return result; -}); - -try { - require.resolve(CONFIGURATION_PATH); -} catch (err) { - // tslint:disable-next-line:no-console - console.error('Error reading bot file. Please ensure you have valid botFilePath and botFileSecret set for your environment.'); - process.exit(BOT_CONFIGURATION_ERROR); -} - -// Get bot configuration for services -const botConfig: BotConfiguration = BotConfiguration.loadSync(CONFIGURATION_PATH, BOT_SECRET); - -// Get bot endpoint configuration by service name -const endpointService: IEndpointService = searchService(botConfig, ServiceTypes.Endpoint, BOT_CONFIGURATION); - -// Create the adapter -const adapter: BotFrameworkAdapter = new BotFrameworkAdapter({ - appId: endpointService.appId || process.env.microsoftAppID, - appPassword: endpointService.appPassword || process.env.microsoftAppPassword -}); - -// Get AppInsights configuration by service name -const appInsightsConfig: IAppInsightsService = searchService(botConfig, ServiceTypes.AppInsights, APPINSIGHTS_NAME); -if (!appInsightsConfig) { - // tslint:disable-next-line:no-console - console.error('Please configure your AppInsights connection in your .bot file.'); - process.exit(BOT_CONFIGURATION_ERROR); -} -const telemetryClient: TelemetryClient = new TelemetryClient(appInsightsConfig.instrumentationKey); - -// For production bots use the Azure CosmosDB storage, Azure Blob, or Azure Table storage provides. -const cosmosConfig: ICosmosDBService = searchService(botConfig, ServiceTypes.CosmosDB, STORAGE_CONFIGURATION); -const cosmosDbStorageSettings: CosmosDbStorageSettings = { - authKey: cosmosConfig.key, - collectionId: cosmosConfig.collection, - databaseId: cosmosConfig.database, - serviceEndpoint: cosmosConfig.endpoint, - documentCollectionRequestOptions: {}, - databaseCreationRequestOptions: {} -}; -const storage: CosmosDbStorage = new CosmosDbStorage(cosmosDbStorageSettings); - -if (!cosmosConfig) { - // tslint:disable-next-line:no-console - console.error('Please configure your CosmosDB connection in your .bot file.'); - process.exit(BOT_CONFIGURATION_ERROR); -} - -// create conversation and user state -const conversationState: ConversationState = new ConversationState(storage); -const userState: UserState = new UserState(storage); -const proactiveState: ProactiveState = new ProactiveState(storage); - -// Use the AutoSaveStateMiddleware middleware to automatically read and write conversation and user state. -adapter.use(new AutoSaveStateMiddleware(conversationState, userState)); - -// Transcript Middleware (saves conversation history in a standard format) -const blobStorageConfig: IBlobStorageService = searchService(botConfig, ServiceTypes.BlobStorage, BLOB_NAME); -if (!blobStorageConfig) { - // tslint:disable-next-line:no-console - console.error('Please configure your Blob storage connection in your .bot file.'); - process.exit(BOT_CONFIGURATION_ERROR); -} -const blobStorage: BlobStorageService = new BlobStorageService(blobStorageConfig); -const transcriptStore: AzureBlobTranscriptStore = new AzureBlobTranscriptStore({ - containerName: blobStorage.container, - storageAccountOrConnectionString: blobStorage.connectionString -}); -adapter.use(new TranscriptLoggerMiddleware(transcriptStore)); - -/* Typing Middleware -(automatically shows typing when the bot is responding/working)*/ -adapter.use(new ShowTypingMiddleware()); -adapter.use(new SetLocaleMiddleware(DEFAULT_LOCALE)); -adapter.use(new EventDebuggerMiddleware()); -adapter.use(new ProactiveStateMiddleware(proactiveState)); - -adapter.onTurnError = async (context: TurnContext, error: Error): Promise => { - // tslint:disable-next-line:no-console - console.error(`${error.message}/n${error.stack}`); - await context.sendActivity(ActivityExtensions.createReply(context.activity, SharedResponses.errorMessage)); - await context.sendActivity({ - type: ActivityTypes.Trace, - text: `Skill Error: ${error.message} | ${error.stack}` - }); - - TelemetryExtensions.trackExceptionEx(telemetryClient, error, context.activity); -}; - -const configuration: SkillConfiguration = new SkillConfiguration( - botConfig, - languageModels, - skills[0].supportedProviders, - skills[0].parameters, - skills[0].configuration); - -const responseManager: ResponseManager = new ResponseManager( - Array.from(configuration.localeConfigurations.keys()), - [MainResponses, SharedResponses, SampleResponses]); - -let bot: <%=skillTemplateName%>; -try { - bot = new <%=skillTemplateName%>( - configuration, - conversationState, - userState, - telemetryClient, - false, - responseManager, - new ServiceManager()); -} catch (err) { - throw err; -} - -// Create server -const server: restify.Server = restify.createServer(); -server.listen(process.env.port || process.env.PORT || 3980, (): void => { - // tslint:disable-next-line:no-console - console.log(`${server.name} listening to ${server.url}`); - // tslint:disable-next-line:no-console - console.log(`Get the Emulator: https://aka.ms/botframework-emulator`); - // tslint:disable-next-line:no-console - console.log(`To talk to your bot, open your '.bot' file in the Emulator`); -}); - -// Listen for incoming requests -server.post('/api/messages', (req: restify.Request, res: restify.Response) => { - // Route received a request to adapter for processing - adapter.processActivity(req, res, async (turnContext: TurnContext) => { - // route to bot activity handler. - await bot.onTurn(turnContext); - }); -}); diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/_skillConversationState.ts b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/_skillConversationState.ts deleted file mode 100644 index 513ba1172e..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/_skillConversationState.ts +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License - -import { DialogState } from 'botbuilder-dialogs'; - -/** - * Here is the documentation of the SkillConversationState class - */ -export interface ISkillConversationState extends DialogState { - token?: string; - // tslint:disable-next-line:no-any - luisResult?: any; - - clear(): void; -} diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/_skillTemplate.ts b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/_skillTemplate.ts deleted file mode 100644 index 5017a798f7..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/_skillTemplate.ts +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License - -import { ResponseManager, SkillConfigurationBase } from 'bot-solution'; -import { BotTelemetryClient, ConversationState, UserState } from 'botbuilder'; -import { TurnContext } from 'botbuilder-core'; -import { DialogSet } from 'botbuilder-dialogs'; -import { MainDialog } from './dialogs/main/mainDialog'; -import { MainResponses } from './dialogs/main/mainResponses'; -import { SampleResponses } from './dialogs/sample/sampleResponses'; -import { SharedResponses } from './dialogs/shared/sharedResponses'; -import { IServiceManager } from './serviceClients/IServiceManager'; -import { ServiceManager } from './serviceClients/serviceManager'; - -import { SampleDialog } from './dialogs/sample/sampleDialog'; -/** - * Here is the documentation of the <%=skillTemplateName%> class - */ -export class <%=skillTemplateName%> { - - private readonly services : SkillConfigurationBase; - private readonly responseManager : ResponseManager; - private readonly conversationState: ConversationState; - private readonly userState: UserState; - private readonly telemetryClient: BotTelemetryClient; - private readonly serviceManager: IServiceManager; - private dialogs: DialogSet; - private skillMode: boolean = false; - - constructor ( - services: SkillConfigurationBase, - conversationState: ConversationState, - userState: UserState, - telemetryClient: BotTelemetryClient, - skillMode: boolean = false, - responseManager: ResponseManager | undefined, - serviceManager: IServiceManager | undefined) { - - this.skillMode = skillMode; - if (services === undefined) { - throw new Error('services parameter is null'); - } - this.services = services; - if (userState === undefined) { - throw new Error ('userState parameter is null'); - } - this.userState = userState; - if (conversationState === undefined) { - throw new Error ('conversationState parameter is null'); - } - this.conversationState = conversationState; - if (telemetryClient === undefined) { - throw new Error ('telemetryClient parameter is null'); - } - this.telemetryClient = telemetryClient; - if (serviceManager === undefined) { - this.serviceManager = new ServiceManager(); - } else { - this.serviceManager = serviceManager; - } - if (responseManager === undefined) { - this.responseManager = new ResponseManager( - Array.from(this.services.localeConfigurations.keys()), - [SampleResponses, MainResponses, SharedResponses] - ); - } else { - this.responseManager = responseManager; - } - - this.dialogs = new DialogSet(this.conversationState.createProperty('DialogState')); - this.dialogs.add(new MainDialog ( - this.services, - this.responseManager, - this.conversationState, - this.userState, - this.telemetryClient, - this.serviceManager, - this.skillMode - )); - } - /** - * Run every turn of the conversation. Handles orchestration of messages. - */ - public async onTurn (turnContext: TurnContext): Promise { - // tslint:disable-next-line:no-any - const dc: any = await this.dialogs.createContext(turnContext); - - if (dc.activeDialog !== undefined) { - // tslint:disable-next-line:no-any - const result: any = await dc.continueDialog(); - } else { - await dc.beginDialog(MainDialog.name); - } - } -} diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/_skillUserState.ts b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/_skillUserState.ts deleted file mode 100644 index 5e4c0afbce..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/_skillUserState.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License - -import { DialogState } from 'botbuilder-dialogs'; - -/** - * Here is the documentation of the <%=skillUserStateNameClass%> class - */ -export interface <%=skillUserStateNameClass%> extends DialogState { - clear(): void; -} diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/_skills.json b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/_skills.json deleted file mode 100644 index f76bd476a5..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/_skills.json +++ /dev/null @@ -1,25 +0,0 @@ -[ - { - "type": "skill", - "id": "<%=skillTemplateName%>", - "name": "<%=skillTemplateName%>", - "dispatchIntent": "<%=skillTemplateIntentName%>", - "supportedProviders": [ - ], - "luisServiceIds": [ - "<%=skillTemplateId%>", - "general" - ], - "parameters": [ - ], - "configuration": { - "googleAppName": "", - "googleClientId": "", - "googleClientSecret": "", - "googleScopes": "", - "displaySize": "3", - "pathToBot": "./<%=skillTemplateName%>/lib/<%=skillTemplateName%>.js", - "ClassName": "<%=skillTemplateNameClass%>" - } - } -] \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/_mainDialog.ts b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/_mainDialog.ts deleted file mode 100644 index 146c50293a..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/_mainDialog.ts +++ /dev/null @@ -1,279 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License - -import { - ActivityExtensions, - InterruptionAction, - ITelemetryLuisRecognizer, - LocaleConfiguration, - ResponseManager, - RouterDialog, - SkillConfigurationBase } from 'bot-solution'; -import { - Activity, - ActivityTypes, - BotFrameworkAdapter, - BotTelemetryClient, - ConversationState, - RecognizerResult, - StatePropertyAccessor, - UserState } from 'botbuilder'; -import { LuisRecognizer } from 'botbuilder-ai'; -import { - Dialog, - DialogContext, - DialogTurnResult, - DialogTurnStatus } from 'botbuilder-dialogs'; -// tslint:disable-next-line:no-implicit-dependencies no-submodule-imports -import { TokenStatus } from 'botframework-connector/lib/tokenApi/models'; -import i18next from 'i18next'; -import { IServiceManager } from '../../serviceClients/IServiceManager'; -import { SampleDialog } from '../sample/sampleDialog'; -import { SkillTemplateDialogOptions } from '../shared/dialogOptions/skillTemplateDialogOptions'; -import { SharedResponses } from '../shared/sharedResponses'; -import { MainResponses } from './mainResponses'; - -import { ISkillConversationState } from '../../skillConversationState'; - -import { <%=skillUserStateNameClass%> } from '../../<%=skillUserStateNameFile%>'; - -/** - * Here is the description of the MainDialog's functionality - */ -export class MainDialog extends RouterDialog { - private skillMode: boolean; - private services: SkillConfigurationBase; - private responseManager: ResponseManager; - private userState: UserState; - private conversationState: ConversationState; - private serviceManager: IServiceManager; - private conversationStateAccessor: StatePropertyAccessor; - private userStateAccessor: StatePropertyAccessor<<%=skillUserStateNameClass%>>; - private generalLUISName: string = 'general'; - private projectName: string = '<%=skillProjectNameId%>'; - - constructor( - services: SkillConfigurationBase, - responseManager: ResponseManager, - conversationState: ConversationState, - userState: UserState, - telemetryClient: BotTelemetryClient, - serviceManager: IServiceManager, - skillMode: boolean) { - super(MainDialog.name, telemetryClient); - this.skillMode = skillMode; - this.services = services; - this.responseManager = responseManager; - this.conversationState = conversationState; - this.userState = userState; - this.serviceManager = serviceManager; - - // Initialize state accessor - this.conversationStateAccessor = conversationState.createProperty('ISkillConversationState'); - this.userStateAccessor = userState.createProperty('<%=skillUserStateNameClass%>'); - - // RegisterDialogs - this.registerDialogs(); - } - - protected async onStart(dc: DialogContext): Promise { - if (!this.skillMode) { - // send a greeting if we're in local mode - await dc.context.sendActivity(this.responseManager.getResponse(MainResponses.welcomeMessage)); - } - } - - protected async route(dc: DialogContext): Promise { - // tslint:disable-next-line:no-any - const state: any = this.conversationState.get(dc.context); - - // get current activity locale - const locale: string = i18next.language; - const localeConfig: LocaleConfiguration = (this.services.localeConfigurations.get(locale) || new LocaleConfiguration()); - - // Get skill LUIS model from configuration - const luisService: ITelemetryLuisRecognizer | undefined = localeConfig.luisServices.get(this.projectName); - if (luisService === undefined) { - throw new Error('The specified LUIS Model could not be found in your Bot Services configuration.'); - } else { - const skillOptions: SkillTemplateDialogOptions = new SkillTemplateDialogOptions(this.skillMode); - const result: RecognizerResult = await luisService.recognize(dc, true); - let turnResult: DialogTurnResult | undefined; - if (result) { - const intent: string = LuisRecognizer.topIntent(result); - switch (intent) { - case 'Sample': { - turnResult = await dc.beginDialog(SampleDialog.name, skillOptions); - break; - } - case 'None': { - // No intent was identified, send confused message - await dc.context.sendActivity(this.responseManager.getResponse(SharedResponses.didntUnderstandMessage)); - if (this.skillMode) { - turnResult = { - status: DialogTurnStatus.complete - }; - } - - break; - } - default: { - // intent was identified but not yet implemented - await dc.context.sendActivity(this.responseManager.getResponse(MainResponses.featureNotAvailable)); - if (this.skillMode) { - turnResult = { - status: DialogTurnStatus.complete - }; - } - } - } - } - - if (turnResult !== Dialog.EndOfTurn) { - await this.complete(dc); - } - } - } - - protected async complete(dc: DialogContext, result?: DialogTurnResult): Promise { - if (this.skillMode) { - const response: Activity = ActivityExtensions.createReply(dc.context.activity); - response.type = ActivityTypes.EndOfConversation; - - await dc.context.sendActivity(response); - } - - // End active dialog - await dc.endDialog(result); - } - - protected async onEvent(dc: DialogContext): Promise { - switch (dc.context.activity.name) { - case Events.skillBeginEvent: { - // tslint:disable-next-line:no-any - const state: any = await this.conversationStateAccessor.get(dc.context); - const userData: Map = >dc.context.activity.value; - if (!userData) { - throw new Error('userData is not an instance of Map.'); - } - // Capture user data from event if needed - - break; - } - case Events.tokenResponseEvent: { - // Auth dialog completion - const result: DialogTurnResult = await dc.continueDialog(); - - // If the dialog completed when we sent the token, end the skill conversation - if (result.status !== DialogTurnStatus.waiting) { - const response: Activity = ActivityExtensions.createReply(dc.context.activity); - response.type = ActivityTypes.EndOfConversation; - - await dc.context.sendActivity(response); - } - - break; - } - default: { - // empty block - } - } - } - - protected async onInterruptDialog(dc: DialogContext): Promise { - let result: InterruptionAction = InterruptionAction.NoAction; - - if (dc.context.activity.type === ActivityTypes.Message) { - // get current activity locale - const locale: string = i18next.language; - const localeConfig: LocaleConfiguration = (this.services.localeConfigurations.get(locale) || new LocaleConfiguration()); - - // check general luis intent - const luisService: ITelemetryLuisRecognizer | undefined = localeConfig.luisServices.get(this.generalLUISName); - if (luisService === undefined) { - throw new Error('The specified LUIS Model could not be found in your Skill configuration.'); - } else { - const luisResult: RecognizerResult = await luisService.recognize(dc, true); - const topIntent: string = LuisRecognizer.topIntent(luisResult); - if (luisResult.intents[topIntent].score > 0.5) { - switch (topIntent) { - case 'Cancel': { - result = await this.onCancel(dc); - break; - } - case 'Help': { - result = await this.onHelp(dc); - break; - } - case 'Logout': { - result = await this.onLogout(dc); - break; - } - default: { - // empty block - } - } - } - } - } - - return result; - } - - private async onCancel(dc: DialogContext): Promise { - await dc.context.sendActivity(this.responseManager.getResponse(MainResponses.cancelMessage)); - await this.complete(dc); - await dc.cancelAllDialogs(); - - return InterruptionAction.StartedDialog; - } - - private async onHelp(dc: DialogContext): Promise { - await dc.context.sendActivity(this.responseManager.getResponse(MainResponses.helpMessage)); - - return InterruptionAction.MessageSentToUser; - } - - private async onLogout(dc: DialogContext): Promise { - let adapter: BotFrameworkAdapter; - const supported: boolean = dc.context.adapter instanceof BotFrameworkAdapter; - if (!supported) { - throw new Error('OAuthPrompt.SignOutUser(): not supported by the current adapter'); - } else { - adapter = dc.context.adapter; - } - - await dc.cancelAllDialogs(); - - // Sign out user - // PENDING get how to get the tokenStatus adapter.getTokenStatus(dc.context, dc.context.activity.from.id) - const tokens: TokenStatus[] = []; - tokens.forEach(async (token: TokenStatus) => { - if (token.connectionName) { - await adapter.signOutUser(dc.context, token.connectionName); - } - }); - - await dc.context.sendActivity(this.responseManager.getResponse(MainResponses.logOut)); - - return InterruptionAction.StartedDialog; - } - - private registerDialogs(): void { - this.addDialog( - new SampleDialog( - this.services, - this.responseManager, - this.conversationStateAccessor, - this.userStateAccessor, - this.serviceManager, - this.telemetryClient - ) - ); - } -} - -namespace Events { - export const tokenResponseEvent: string = 'token/response'; - export const skillBeginEvent: string = 'skillBegin'; -} diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/mainResponses.ts b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/mainResponses.ts deleted file mode 100644 index 8e361c12bc..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/mainResponses.ts +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License - -import { IResponseIdCollection } from 'bot-solution'; -import { join } from 'path'; -/** - * Contains bot responses. - */ -export class MainResponses implements IResponseIdCollection { - // Generated accessors - public readonly name: string = MainResponses.name; - public static readonly pathToResource: string = join(__dirname, 'resources'); - public static readonly welcomeMessage: string = 'WelcomeMessage'; - public static readonly helpMessage: string = 'HelpMessage'; - public static readonly greetingMessage: string = 'GreetingMessage'; - public static readonly goodbyeMessage: string = 'GoodbyeMessage'; - public static readonly logOut: string = 'LogOut'; - public static readonly featureNotAvailable: string = 'FeatureNotAvailable'; - public static readonly cancelMessage: string = 'CancelMessage'; -} diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/_sampleDialog.ts b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/_sampleDialog.ts deleted file mode 100644 index 01c74c4ace..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/_sampleDialog.ts +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import { - ResponseManager, - SkillConfigurationBase } from 'bot-solution'; -import { - BotTelemetryClient, - StatePropertyAccessor } from 'botbuilder'; -import { - DialogTurnResult, - TextPrompt, - WaterfallDialog, - WaterfallStepContext } from 'botbuilder-dialogs'; -import { IServiceManager } from '../../serviceClients/IServiceManager'; -import { SkillDialogBase } from '../shared/skillDialogBase'; -import { SampleResponses } from './sampleResponses'; - -import { ISkillConversationState } from '../../skillConversationState'; - -import { <%=skillUserStateNameClass%> } from '../../<%=skillUserStateNameFile%>'; - -/** - * this is the sampleDialog - */ -export class SampleDialog extends SkillDialogBase { - - private tokenKey: string = 'name'; - - constructor( - services : SkillConfigurationBase, - responseManager: ResponseManager, - conversationStateAccessor: StatePropertyAccessor, - userStateAccessor: StatePropertyAccessor<<%=skillUserStateNameClass%>>, - serviceManager: IServiceManager, - telemetryClient: BotTelemetryClient) { - super( - SampleDialog.name, - services, - responseManager, - conversationStateAccessor, - userStateAccessor, - serviceManager, - telemetryClient - ); - - const sample: ((sc: WaterfallStepContext) => Promise)[] = [ - // NOTE: Uncomment these lines to include authentication steps to this dialog - // GetAuthToken, - // AfterGetAuthToken, - this.promptForName.bind(this), - this.greetUser.bind(this), - this.end.bind(this) - ]; - - this.addDialog(new WaterfallDialog(SampleDialog.name, sample)); - this.addDialog(new TextPrompt(dialogIds.namePrompt)); - - this.initialDialogId = SampleDialog.name; - } - - private async promptForName(stepContext: WaterfallStepContext): Promise { - // NOTE: Uncomment the following lines to access LUIS result for this turn. - // let state = await conversationStateAccessor.get(stepContext.context); - // let intent = state.luisResult.topIntent().intent; - // let entities = state.luisResult.entities; - - // tslint:disable-next-line:no-any - const prompt: any = this.responseManager.getResponse(SampleResponses.namePrompt); - - return stepContext.prompt(dialogIds.namePrompt, { prompt: prompt }); - } - - private async greetUser(stepContext: WaterfallStepContext): Promise { - - const tokens: Map = new Map(); - tokens.set(this.tokenKey, stepContext.result); - - // tslint:disable-next-line:no-any - const response: any = this.responseManager.getResponse(SampleResponses.haveNameMessage, tokens); - await stepContext.context.sendActivity(response); - - return stepContext.next(); - } - - private async end(stepContext: WaterfallStepContext): Promise { - - return stepContext.endDialog(); - } -} - -enum dialogIds { - namePrompt = 'namePrompt' -} diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/sampleResponses.ts b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/sampleResponses.ts deleted file mode 100644 index 6398a06040..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/sampleResponses.ts +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -import { IResponseIdCollection } from 'bot-solution'; -import { join } from 'path'; -/** - * Contains bot responses. - */ -export class SampleResponses implements IResponseIdCollection { - // Generated accessors - public readonly name: string = SampleResponses.name; - public static readonly pathToResource: string = join(__dirname, 'resources'); - public static readonly namePrompt: string = 'NamePrompt'; - public static readonly haveNameMessage: string = 'HaveNameMessage'; -} diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/dialogOptions/skillTemplateDialogOptions.ts b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/dialogOptions/skillTemplateDialogOptions.ts deleted file mode 100644 index 82b35134fb..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/dialogOptions/skillTemplateDialogOptions.ts +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License - -/** - * Here is the description of the SkillTemplateDialogOptions functionality - */ -export class SkillTemplateDialogOptions { - public skillMode: boolean; - - constructor(skillMode: boolean) { - this.skillMode = skillMode; - } -} diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/sharedResponses.ts b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/sharedResponses.ts deleted file mode 100644 index d3a5f7945a..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/sharedResponses.ts +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License - -import { IResponseIdCollection } from 'bot-solution'; -import { join } from 'path'; -/** - * Contains bot responses. - */ -export class SharedResponses implements IResponseIdCollection { - // Generated accessors - public readonly name: string = SharedResponses.name; - public static readonly pathToResource: string = join(__dirname, 'resources'); - public static readonly didntUnderstandMessage: string = 'DidntUnderstandMessage'; - public static readonly cancellingMessage: string = 'CancellingMessage'; - public static readonly noAuth: string = 'NoAuth'; - public static readonly authFailed: string = 'AuthFailed'; - public static readonly actionEnded: string = 'ActionEnded'; - public static readonly errorMessage: string = 'ErrorMessage'; -} diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/languageModels.json b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/languageModels.json deleted file mode 100644 index aacf0aa90e..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/languageModels.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "en": { - "botFilePath": ".\\LocaleConfigurations\\YOUR_EN_BOT_PATH.bot", - "botFileSecret": "" - }, - "de": { - "botFilePath": ".\\LocaleConfigurations\\YOUR_DE_BOT_PATH.bot", - "botFileSecret": "" - }, - "es": { - "botFilePath": ".\\LocaleConfigurations\\YOUR_ES_BOT_PATH.bot", - "botFileSecret": "" - }, - "fr": { - "botFilePath": ".\\LocaleConfigurations\\YOUR_FR_BOT_PATH.bot", - "botFileSecret": "" - }, - "it": { - "botFilePath": ".\\LocaleConfigurations\\YOUR_IT_BOT_PATH.bot", - "botFileSecret": "" - }, - "zh": { - "botFilePath": ".\\LocaleConfigurations\\YOUR_ZH_BOT_PATH.bot", - "botFileSecret": "" - } -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/locales/de.json b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/locales/de.json deleted file mode 100644 index d0158e914b..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/locales/de.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "escalate": { - "phoneInfo": "Unsere Agenten sind 24/7 unter 1 (800) 555-1234 erhältlich." - }, - "main":{ - "calendarSuggestedAction": "Was ist mein Zeitplan?", - "cancelled": "OK, fangen wir an", - "completed": "Was kann ich Ihnen noch helfen?", - "confused": "Es tut mir leid, ich bin nicht in der Lage, damit zu helfen.", - "emailSuggestedAction": "Senden Sie eine e-Mail", - "error": "Sorry, es sieht so aus, als ob etwas schief gelaufen ist.", - "greeting": "Hallo!", - "greetingWithName": "Hallo {0}!", - "helpText": "Ich bin Ihr virtueller Assistent! Ich kann durch meine vernetzten Fähigkeiten eine Reihe von Aufgaben erledigen. Im Moment kann ich Ihnen mit Kalender, E-Mail, Aufgabe und Punkt von Interesse Fragen helfen. Oder Sie können mir helfen, mehr zu tun, indem Sie Ihre eigenen!", - "helpTitle": "Hilfe für Virtual Assistant", - "introPath": "Intro.de.json", - "logout": "OK, du bist abgemeldet.", - "meetingSuggestedAction": "Ein Treffen planen", - "noActiveDialog": "Es sieht so aus, als gäbe es nichts zu kündigen. Was kann ich Ihnen helfen?", - "poiSuggestedAction": "Ein Café in der Nähe finden" - } -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/locales/en.json b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/locales/en.json deleted file mode 100644 index 28a3ef9070..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/locales/en.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "escalate": { - "phoneInfo": "Our agents are available 24/7 at 1(800)555-1234." - }, - "main":{ - "calendarSuggestedAction": "What's my schedule?", - "cancelled": "Ok, let's start over.", - "completed": "What else can I help you with?", - "confused": "I'm sorry, I'm not able to help with that.", - "emailSuggestedAction": "Send an email", - "error": "Sorry, it looks like something went wrong.", - "greeting": "Hi there!", - "greetingWithName": "Hey, {0}!", - "helpText": "I'm your Virtual Assistant! I can perform a number of tasks through my connected skills. Right now I can help you with Calendar, Email, Task and Point of Interest questions. Or you can help me do more by creating your own!", - "helpTitle": "Help for Virtual Assistant", - "introPath": "Intro.json", - "logout": "Ok, you're signed out.", - "meetingSuggestedAction": "Schedule a meeting", - "noActiveDialog": "It looks like there is nothing to cancel. What can I help you with?", - "poiSuggestedAction": "Find a coffee shop nearby" - } -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/locales/es.json b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/locales/es.json deleted file mode 100644 index 43b70233b2..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/locales/es.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "escalate": { - "phoneInfo": "Nuestros agentes están disponibles 24/7 al 1(800)555-1234." - }, - "main":{ - "calendarSuggestedAction": "¿Cuál es mi horario?", - "cancelled": "Bien, empecemos de una vez.", - "completed": "¿En qué más puedo ayudarte?", - "confused": "Lo siento, no soy capaz de ayudar con eso.", - "emailSuggestedAction": "Enviar un correo electrónico", - "error": "Lo siento, parece que algo salió mal.", - "greeting": "¡Hola!", - "greetingWithName": "Hola {0}", - "helpText": "¡Soy tu asistente virtual! Puedo realizar una serie de tareas a través de mis habilidades conectadas. En este momento puedo ayudarle con el calendario, correo electrónico, tarea y preguntas de punto de interés. ¡ O usted puede ayudarme a hacer más creando su propio!", - "helpTitle": "Ayuda para el asistente virtual", - "introPath": "Intro.es.json", - "logout": "OK, estás desconectado.", - "meetingSuggestedAction": "Programar una reunión", - "noActiveDialog": "Parece que no hay nada que cancelar. ¿En qué puedo ayudarle?", - "poiSuggestedAction": "Encuentre una cafetería cerca" - } -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/locales/fr.json b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/locales/fr.json deleted file mode 100644 index de28d45ae8..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/locales/fr.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "escalate": { - "phoneInfo": "Nos agents sont disponibles 24/7 au 1 (800) 555-1234." - }, - "main":{ - "calendarSuggestedAction": "Quel est mon emploi du temps?", - "cancelled": "OK, recommençons.", - "completed": "Quoi d'autre puis-je vous aider?", - "confused": "Je suis désolé, je ne suis pas en mesure d'aider avec ça.", - "emailSuggestedAction": "Envoyer un email", - "error": "Désolé, on dirait que quelque chose a mal tourné.", - "greeting": "Salut!", - "greetingWithName": "Hé, {0}!", - "helpText": "Je suis ton assistante virtuelle! Je peux effectuer un certain nombre de tâches à travers mes compétences connectées. En ce moment je peux vous aider avec le calendrier, email, la tâche et le point d'intérêt des questions. Ou vous pouvez m'aider à faire plus en créant votre propre!", - "helpTitle": "Aide pour Virtual Assistant", - "introPath": "Intro.fr.json", - "logout": "OK, vous êtes déconnecté.", - "meetingSuggestedAction": "Planifier une réunion", - "noActiveDialog": "On dirait qu'il n'y a rien à annuler. Que puis-je pour vous?", - "poiSuggestedAction": "Trouver un Coffee Shop à proximité" - } -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/locales/it.json b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/locales/it.json deleted file mode 100644 index 2f395ab34f..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/locales/it.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "escalate": { - "phoneInfo": "I nostri agenti sono disponibili 24/7 a 1 (800) 555-1234." - }, - "main":{ - "calendarSuggestedAction": "Qual è il mio programma?", - "cancelled": "Ok, ricominciamo da qui.", - "completed": "Che altro posso aiutarvi?", - "confused": "Mi dispiace, non sono in grado di aiutarti.", - "emailSuggestedAction": "Invia una email", - "error": "Mi dispiace, sembra che qualcosa sia andato storto.", - "greeting": "Ehilà!", - "greetingWithName": "Ehilà! {0}!", - "helpText": "Sono il tuo assistente virtuale! Posso effettuare un certo numero di mansioni con le mie abilità collegate. In questo momento posso aiutarvi con calendario, e-mail, compito e punto di domande di interesse. Oppure puoi aiutarmi a fare di più creando il tuo!", - "helpTitle": "Aiuto per assistente virtuale", - "introPath": "Intro.it.json", - "logout": "OK, sei uscito.", - "meetingSuggestedAction": "Pianificare una riunione", - "noActiveDialog": "Sembra che non c'è nulla da cancellare. Cosa posso aiutarvi?", - "poiSuggestedAction": "Trova un coffee shop nelle vicinanze" - } -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/locales/zh.json b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/locales/zh.json deleted file mode 100644 index 2eba2a4a58..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/locales/zh.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "escalate": { - "phoneInfo": "我们的代理商提供24/7 在 1 (800) 555-1234。" - }, - "main":{ - "calendarSuggestedAction": "我的日程表是什么?", - "cancelled": "好的,我们从头再来。", - "completed": "我还能帮你什么?", - "confused": "对不起,我帮不了。", - "emailSuggestedAction": "发送电子邮件", - "error": "对不起, 看起来出了问题。", - "greeting": "您好!", - "greetingWithName": "您好!, {0}", - "helpText": "我是您的智能助理!我有不少技能,可以帮您完成很多任务。现在我可以帮您管理您的日历, 电子邮件, 任务和查找地图兴趣点。或者, 您可以教我更多的技能!", - "helpTitle": "智能助手的帮助", - "introPath": "Intro.zh.json", - "logout": "你已成功退出。", - "meetingSuggestedAction": "安排会议", - "noActiveDialog": "看来没有什么可以取消的。有什么需要我帮忙的吗?", - "poiSuggestedAction": "查找附近的咖啡店" - } -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/serviceClients/IServiceManager.ts b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/serviceClients/IServiceManager.ts deleted file mode 100644 index b71ecfc803..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/serviceClients/IServiceManager.ts +++ /dev/null @@ -1,3 +0,0 @@ -// tslint:disable-next-line: no-empty-interface -export interface IServiceManager { -} diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/serviceClients/serviceManager.ts b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/serviceClients/serviceManager.ts deleted file mode 100644 index 5cf562dfe2..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/serviceClients/serviceManager.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { IServiceManager } from './IServiceManager'; - -/** - * class which manages the service - */ -// tslint:disable-next-line: no-unnecessary-class -export class ServiceManager implements IServiceManager { -} diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/.env.test b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/.env.test deleted file mode 100644 index 2a64cc0531..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/.env.test +++ /dev/null @@ -1,10 +0,0 @@ -# Environment variables for devs -ENDPOINT=development - -BOT_FILE_NAME=test/mockResources/mockedConfiguration.bot -BOT_FILE_SECRET= -APPINSIGHTS_NAME=sample-appInsights-name -STORAGE_NAME=sample-cosmosdb-name -BLOB_NAME=sample-blob-name -LUIS_GENERAL=sample_General -CONTENT_MODERATOR_NAME=<--name--> \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/flow/_interruptionTest.js b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/flow/_interruptionTest.js deleted file mode 100644 index 2ba162c6c0..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/flow/_interruptionTest.js +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License - -const assert = require('assert'); -const <%=skillTemplateName%> = require('./<%=skillTemplateNameFile%>'); -const testNock = require('../testBase'); -let testAdapter; - -describe("interruption", function() { - before(async function() { - await <%=skillTemplateName%>.initialize(); - testAdapter = <%=skillTemplateName%>.getTestAdapter(); - }); - - describe("help", function() { - it("send 'Help' and check you get the expected response", function(done){ - const flow = testAdapter - .send('Help') - .assertReply('[Enter your help message here]'); - - testNock.resolveWithMocks('helpInterruption_response', done, flow); - }); - }); - - describe("cancel", function() { - it("send 'Cancel' and check you get the expected response", function(done){ - const flow = testAdapter - .send('Cancel') - .assertReply(`Ok, let's start over.`); - - testNock.resolveWithMocks('cancelInterruption_response', done, flow); - }); - }); -}); diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/flow/_mainDialogTest.js b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/flow/_mainDialogTest.js deleted file mode 100644 index 5b56f4e1ae..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/flow/_mainDialogTest.js +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License - -const assert = require('assert'); -const <%=skillTemplateName%> = require('./<%=skillTemplateNameFile%>'); -const testNock = require('../testBase'); -const unhandledReplies = [ - "Can you try to ask me again? I didn't get what you mean.", - "Can you say that in a different way?", - "Can you try to ask in a different way?", - "Could you elaborate?", - "Please say that again in a different way.", - "I didn't understand, perhaps try again in a different way.", - "I didn't get what you mean, can you try in a different way?", - "Sorry, I didn't understand what you meant.", - "I didn't quite get that." -]; -let testAdapter; - -describe("mainDialog", function() { - before(async function() { - await <%=skillTemplateName%>.initialize(); - testAdapter = <%=skillTemplateName%>.getTestAdapter(); - }); - - describe("intro message", function() { - it("send conversationUpdate and verify the response", function(done){ - - const flow = testAdapter - .send({ - type: "conversationUpdate", - membersAdded: [ - { - id: "1", - name: "Bot" - } - ], - channelId: "emulator", - recipient: { - id: "1" - }, - locale: "en" - }) - .assertReply('[Enter your intro message here]'); - - testNock.resolveWithMocks('introMessage_response', done, flow); - }); - }); - - describe("help intent", function() { - it("send 'Help' and check you get the expected response", function(done){ - const flow = testAdapter - .send('Help') - .assertReply('[Enter your help message here]'); - - testNock.resolveWithMocks('helpIntent_response', done, flow); - }); - }); - - describe("unhandled message", function() { - it("send 'Blah Blah' and check you get the expected response", function(done){ - const flow = testAdapter - .send('Blah Blah') - .assertReply(function (activity, description) { - assert.notEqual(-1, unhandledReplies.indexOf(activity.text)); - }) - - testNock.resolveWithMocks('unhandledMessage_response', done, flow); - }); - }); -}); diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/flow/_sampleDialogTest.js b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/flow/_sampleDialogTest.js deleted file mode 100644 index 423a00c03b..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/flow/_sampleDialogTest.js +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License - -const assert = require('assert'); -const <%=skillTemplateName%> = require('./<%=skillTemplateNameFile%>'); -const testNock = require('../testBase'); -let testAdapter; - -describe("sample dialog", function() { - before(async function() { - await <%=skillTemplateName%>.initialize(); - testAdapter = <%=skillTemplateName%>.getTestAdapter(); - }); - - - it("send 'Run Dialog' and check you get the expected response", function(done){ - - const flow = testAdapter - .send('run dialog') - .assertReply('What is your name?'); - - testNock.resolveWithMocks('sampleDialog_response', done, flow); - }); -}); diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/flow/_skillTestBase.js b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/flow/_skillTestBase.js deleted file mode 100644 index 7e3eab7f72..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/flow/_skillTestBase.js +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -const { TelemetryClient } = require('applicationinsights'); -const { AutoSaveStateMiddleware, ConversationState, MemoryStorage, TestAdapter, UserState } = require('botbuilder-core'); -const { BotConfiguration, ServiceTypes } = require('botframework-config'); -const config = require('dotenv').config; -const i18next = require('i18next'); -const i18nextNodeFsBackend = require('i18next-node-fs-backend'); -const path = require('path'); -const <%=skillTemplateName%> = require('../../lib/<%=skillTemplateNameFile%>').<%=skillTemplateName%>; -const { Locales, SkillConfiguration, SkillDefinition } = require('bot-solution'); -const TEST_MODE = require('../testBase').testMode; -let languageModelsRaw; -let skillsRaw; - -const configuration = async function() { - // Configure internationalization and default locale - await i18next.use(i18nextNodeFsBackend) - .init({ - fallbackLng: 'en', - preload: [ 'de', 'en', 'es', 'fr', 'it', 'zh' ], - backend: { - loadPath: path.join(__dirname, '..', '..', 'src', 'locales', '{{lng}}.json') - } - }); - - await Locales.addResourcesFromPath(i18next, 'common'); - - - setupEnvironment(TEST_MODE); -} - -const setupEnvironment = function (testMode) { - switch (testMode) { - case 'record': - config({ path: path.join(__dirname, '..', '..', '.env.development') }); - languageModelsRaw = require('../../src/languageModels.json'); - skillsRaw = require('../../src/skills.json'); - break; - case 'lockdown': - config({ path: path.join(__dirname, '..', '.env.test') }); - languageModelsRaw = require('../mockResources/languageModels.json'); - skillsRaw = require('../mockResources/skills.json'); - break; - } -} - -const searchService = function(botConfiguration, serviceType, nameOrId) { - const candidates = botConfiguration.services - .filter((s) => !serviceType || s.type === serviceType); - const service = candidates.find((s) => s.id === nameOrId || s.name === nameOrId) - || candidates.find((s) => true); - if (!service && nameOrId) { - throw new Error(`Service '${nameOrId}' [type: ${serviceType}] not found in .bot file.`); - } - return service; -} - -/** - * Initializes the properties for the bot to be tested. - */ -const initialize = async function(testStorage) { - await configuration(); - - const storage = testStorage || new MemoryStorage(); - const botConfiguration = BotConfiguration.loadSync(process.env.BOT_FILE_NAME, process.env.BOT_FILE_SECRET); - // Initializes your bot language models and skills definitions - const languageModels = new Map(Object.entries(languageModelsRaw)); - const skills = skillsRaw.map((skill) => { - const result = Object.assign(new SkillDefinition(), skill); - result.configuration = new Map(Object.entries(skill.configuration || {})); - return result; - }); - const skillMode = false - const services = new SkillConfiguration( - botConfiguration, - languageModels, - skills[0].supportedProviders, - skills[0].parameters, - skills[0].configuration); - const APPINSIGHTS_NAME = process.env.APPINSIGHTS_NAME || ''; - const conversationState = new ConversationState(storage); - const userState = new UserState(storage); - // Get AppInsights configuration by service name - const appInsightsConfig = searchService(botConfiguration, ServiceTypes.AppInsights, APPINSIGHTS_NAME); - const telemetryClient = new TelemetryClient(appInsightsConfig.instrumentationKey); - this.bot = new <%=skillTemplateName%>(services, conversationState, userState, telemetryClient, skillMode); -} - -/** - * Initializes the TestAdapter. - * @returns TestAdapter with the Bot logic configured. - */ -const getTestAdapter = function() { - const bot = this.bot; - - return new TestAdapter(async function (context) { - const cultureInfo = context.activity.locale || 'en'; - await i18next.changeLanguage(cultureInfo); - return bot.onTurn(context); - }) - .use(new AutoSaveStateMiddleware(bot.conversationState, bot.userState)); -} - -module.exports = { - configuration: configuration, - initialize: initialize, - getTestAdapter: getTestAdapter -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/mocha.opts b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/mocha.opts deleted file mode 100644 index 232f238668..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/mocha.opts +++ /dev/null @@ -1,4 +0,0 @@ ---timeout 50000 ---recursive -./**/*Test.js ---colors \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/mockResources/_skills.json b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/mockResources/_skills.json deleted file mode 100644 index f76bd476a5..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/mockResources/_skills.json +++ /dev/null @@ -1,25 +0,0 @@ -[ - { - "type": "skill", - "id": "<%=skillTemplateName%>", - "name": "<%=skillTemplateName%>", - "dispatchIntent": "<%=skillTemplateIntentName%>", - "supportedProviders": [ - ], - "luisServiceIds": [ - "<%=skillTemplateId%>", - "general" - ], - "parameters": [ - ], - "configuration": { - "googleAppName": "", - "googleClientId": "", - "googleClientSecret": "", - "googleScopes": "", - "displaySize": "3", - "pathToBot": "./<%=skillTemplateName%>/lib/<%=skillTemplateName%>.js", - "ClassName": "<%=skillTemplateNameClass%>" - } - } -] \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/mockResources/languageModels.json b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/mockResources/languageModels.json deleted file mode 100644 index 3379b4b831..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/mockResources/languageModels.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "en": { - "botFilePath": ".\\test\\mockResources\\LocaleConfigurations\\mockedSkillEn.bot", - "botFileSecret": "" - }, - "de": { - "botFilePath": ".\\test\\mockResources\\LocaleConfigurations\\mockedSkillDe.bot", - "botFileSecret": "" - }, - "es": { - "botFilePath": ".\\test\\mockResources\\LocaleConfigurations\\mockedSkillEs.bot", - "botFileSecret": "" - }, - "fr": { - "botFilePath": ".\\test\\mockResources\\LocaleConfigurations\\mockedSkillFr.bot", - "botFileSecret": "" - }, - "it": { - "botFilePath": ".\\test\\mockResources\\LocaleConfigurations\\mockedSkillIt.bot", - "botFileSecret": "" - }, - "zh": { - "botFilePath": ".\\test\\mockResources\\LocaleConfigurations\\mockedSkillZh.bot", - "botFileSecret": "" - } -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/nockFixtures/cancelInterruption_response.json b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/nockFixtures/cancelInterruption_response.json deleted file mode 100644 index 959d0e7c7e..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/nockFixtures/cancelInterruption_response.json +++ /dev/null @@ -1,41 +0,0 @@ -[ - { - "scope": "https://westus.api.cognitive.microsoft.com:443", - "method": "POST", - "path": "/luis/v2.0/apps/f7c2ee78-8679-4a3e-b384-0cd10c67e554?verbose=false&staging=false&spellCheck=false&log=true", - "body": "Cancel", - "status": 200, - "response": { - "query": "Cancel", - "topScoringIntent": { - "intent": "Cancel", - "score": 0.962457538 - }, - "entities": [] - }, - "rawHeaders": [ - "Cache-Control", - "no-store, proxy-revalidate, no-cache, max-age=0, private", - "Pragma", - "no-cache", - "Content-Length", - "126", - "Content-Type", - "application/json; charset=utf-8", - "Apim-Request-Id", - "55605c8d-5c2e-46d4-81de-72fe73eb7335", - "Request-Id", - "55605c8d-5c2e-46d4-81de-72fe73eb7335", - "Strict-Transport-Security", - "max-age=31536000; includeSubDomains; preload", - "X-Content-Type-Options", - "nosniff", - "X-Frame-Options", - "SAMEORIGIN", - "Date", - "Wed, 27 Mar 2019 16:32:51 GMT", - "Connection", - "close" - ] - } -] \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/nockFixtures/helpIntent_response.json b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/nockFixtures/helpIntent_response.json deleted file mode 100644 index b4c9a176c9..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/nockFixtures/helpIntent_response.json +++ /dev/null @@ -1,41 +0,0 @@ -[ - { - "scope": "https://westus.api.cognitive.microsoft.com:443", - "method": "POST", - "path": "/luis/v2.0/apps/f7c2ee78-8679-4a3e-b384-0cd10c67e554?verbose=false&staging=false&spellCheck=false&log=true", - "body": "Help", - "status": 200, - "response": { - "query": "Help", - "topScoringIntent": { - "intent": "Help", - "score": 0.946496367 - }, - "entities": [] - }, - "rawHeaders": [ - "Cache-Control", - "no-store, proxy-revalidate, no-cache, max-age=0, private", - "Pragma", - "no-cache", - "Content-Length", - "122", - "Content-Type", - "application/json; charset=utf-8", - "Apim-Request-Id", - "f50224ae-017d-4e61-afae-476a2a786476", - "Request-Id", - "f50224ae-017d-4e61-afae-476a2a786476", - "Strict-Transport-Security", - "max-age=31536000; includeSubDomains; preload", - "X-Content-Type-Options", - "nosniff", - "X-Frame-Options", - "SAMEORIGIN", - "Date", - "Wed, 27 Mar 2019 16:32:54 GMT", - "Connection", - "close" - ] - } -] \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/nockFixtures/helpInterruption_response.json b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/nockFixtures/helpInterruption_response.json deleted file mode 100644 index a20a622030..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/nockFixtures/helpInterruption_response.json +++ /dev/null @@ -1,41 +0,0 @@ -[ - { - "scope": "https://westus.api.cognitive.microsoft.com:443", - "method": "POST", - "path": "/luis/v2.0/apps/f7c2ee78-8679-4a3e-b384-0cd10c67e554?verbose=false&staging=false&spellCheck=false&log=true", - "body": "Help", - "status": 200, - "response": { - "query": "Help", - "topScoringIntent": { - "intent": "Help", - "score": 0.946496367 - }, - "entities": [] - }, - "rawHeaders": [ - "Cache-Control", - "no-store, proxy-revalidate, no-cache, max-age=0, private", - "Pragma", - "no-cache", - "Content-Length", - "122", - "Content-Type", - "application/json; charset=utf-8", - "Apim-Request-Id", - "7625fa6e-c91f-4240-923a-087b67984a41", - "Request-Id", - "7625fa6e-c91f-4240-923a-087b67984a41", - "Strict-Transport-Security", - "max-age=31536000; includeSubDomains; preload", - "X-Content-Type-Options", - "nosniff", - "X-Frame-Options", - "SAMEORIGIN", - "Date", - "Wed, 27 Mar 2019 16:40:16 GMT", - "Connection", - "close" - ] - } -] \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/nockFixtures/introMessage_response.json b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/nockFixtures/introMessage_response.json deleted file mode 100644 index 0637a088a0..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/nockFixtures/introMessage_response.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/nockFixtures/sampleDialog_response.json b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/nockFixtures/sampleDialog_response.json deleted file mode 100644 index e9dbcb2ba4..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/nockFixtures/sampleDialog_response.json +++ /dev/null @@ -1,80 +0,0 @@ -[ - { - "scope": "https://westus.api.cognitive.microsoft.com:443", - "method": "POST", - "path": "/luis/v2.0/apps/f7c2ee78-8679-4a3e-b384-0cd10c67e554?verbose=false&staging=false&spellCheck=false&log=true", - "body": "run dialog", - "status": 200, - "response": { - "query": "run dialog", - "topScoringIntent": { - "intent": "Cancel", - "score": 0.0366765819 - }, - "entities": [] - }, - "rawHeaders": [ - "Cache-Control", - "no-store, proxy-revalidate, no-cache, max-age=0, private", - "Pragma", - "no-cache", - "Content-Length", - "131", - "Content-Type", - "application/json; charset=utf-8", - "Apim-Request-Id", - "354cc543-21cb-475b-a21f-d19c48f275bf", - "Request-Id", - "354cc543-21cb-475b-a21f-d19c48f275bf", - "Strict-Transport-Security", - "max-age=31536000; includeSubDomains; preload", - "X-Content-Type-Options", - "nosniff", - "X-Frame-Options", - "SAMEORIGIN", - "Date", - "Wed, 27 Mar 2019 20:34:01 GMT", - "Connection", - "close" - ] - }, - { - "scope": "https://westus.api.cognitive.microsoft.com:443", - "method": "POST", - "path": "/luis/v2.0/apps/f7c2ee78-8679-4a3e-b384-0cd10c67e554?verbose=false&staging=false&spellCheck=false&log=true", - "body": "run dialog", - "status": 200, - "response": { - "query": "run dialog", - "topScoringIntent": { - "intent": "Sample", - "score": 0.9730142 - }, - "entities": [] - }, - "rawHeaders": [ - "Cache-Control", - "no-store, proxy-revalidate, no-cache, max-age=0, private", - "Pragma", - "no-cache", - "Content-Length", - "128", - "Content-Type", - "application/json; charset=utf-8", - "Apim-Request-Id", - "5f808060-f5cf-49e6-9f4c-8fef78132515", - "Request-Id", - "5f808060-f5cf-49e6-9f4c-8fef78132515", - "Strict-Transport-Security", - "max-age=31536000; includeSubDomains; preload", - "X-Content-Type-Options", - "nosniff", - "X-Frame-Options", - "SAMEORIGIN", - "Date", - "Wed, 27 Mar 2019 20:34:01 GMT", - "Connection", - "close" - ] - } -] \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/nockFixtures/unhandledMessage_response.json b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/nockFixtures/unhandledMessage_response.json deleted file mode 100644 index 1db8541464..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/nockFixtures/unhandledMessage_response.json +++ /dev/null @@ -1,80 +0,0 @@ -[ - { - "scope": "https://westus.api.cognitive.microsoft.com:443", - "method": "POST", - "path": "/luis/v2.0/apps/f7c2ee78-8679-4a3e-b384-0cd10c67e554?verbose=false&staging=false&spellCheck=false&log=true", - "body": "Blah Blah", - "status": 200, - "response": { - "query": "Blah Blah", - "topScoringIntent": { - "intent": "Cancel", - "score": 0.0366765819 - }, - "entities": [] - }, - "rawHeaders": [ - "Cache-Control", - "no-store, proxy-revalidate, no-cache, max-age=0, private", - "Pragma", - "no-cache", - "Content-Length", - "130", - "Content-Type", - "application/json; charset=utf-8", - "Apim-Request-Id", - "feef9326-f69e-4490-850b-7ffe41e921d2", - "Request-Id", - "feef9326-f69e-4490-850b-7ffe41e921d2", - "Strict-Transport-Security", - "max-age=31536000; includeSubDomains; preload", - "X-Content-Type-Options", - "nosniff", - "X-Frame-Options", - "SAMEORIGIN", - "Date", - "Wed, 27 Mar 2019 20:07:18 GMT", - "Connection", - "close" - ] - }, - { - "scope": "https://westus.api.cognitive.microsoft.com:443", - "method": "POST", - "path": "/luis/v2.0/apps/f7c2ee78-8679-4a3e-b384-0cd10c67e554?verbose=false&staging=false&spellCheck=false&log=true", - "body": "Blah Blah", - "status": 200, - "response": { - "query": "Blah Blah", - "topScoringIntent": { - "intent": "None", - "score": 0.8330091 - }, - "entities": [] - }, - "rawHeaders": [ - "Cache-Control", - "no-store, proxy-revalidate, no-cache, max-age=0, private", - "Pragma", - "no-cache", - "Content-Length", - "125", - "Content-Type", - "application/json; charset=utf-8", - "Apim-Request-Id", - "0298966e-3a1b-44ab-968d-eeecd71ad899", - "Request-Id", - "0298966e-3a1b-44ab-968d-eeecd71ad899", - "Strict-Transport-Security", - "max-age=31536000; includeSubDomains; preload", - "X-Content-Type-Options", - "nosniff", - "X-Frame-Options", - "SAMEORIGIN", - "Date", - "Wed, 27 Mar 2019 20:07:19 GMT", - "Connection", - "close" - ] - } -] \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/testBase.js b/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/testBase.js deleted file mode 100644 index f6c19886da..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/test/testBase.js +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License -const TEST_MODE = 'lockdown'; - -const nockBack = require('nock').back; -nockBack.setMode(TEST_MODE); -nockBack.fixtures = __dirname + '/nockFixtures'; - -const uuidRegex = /[a-f\d-]{8}-[a-f\d-]{4}-[a-f\d-]{4}-[a-f\d-]{4}-[a-f\d-]{12}/; -const qnaRegex = /\/\/[^.]+\.azurewebsites/; - -const replaceUUID = function (value) { - return value.replace(uuidRegex, 'f7c2ee78-8679-4a3e-b384-0cd10c67e554'); -} - -const replaceScope = function (value) { - return value.replace(qnaRegex, '//assistant-hostname-qnahost.azurewebsites'); -} - -const beforeNock = function (scope) { - scope.filteringRequestBody = function (body, rBody) { - if (body === JSON.stringify(rBody)) { - return JSON.parse(body); - } - - return body; - } - - scope.filteringPath = replaceUUID; - - scope.filteringScope = replaceScope; -}; - -const afterRecordNock = function (scopes) { - return scopes.map(function (scope) { - scope.path = replaceUUID(scope.path) - scope.scope = replaceScope(scope.scope); - - return scope; - }); -} - -const resolveWithMocks = function (testName, done, testFlow) { - nockBack(testName + '.json', { before: beforeNock, afterRecord: afterRecordNock }, function (nockDone) { - testFlow - .then(function () { - nockDone(); - done(); - }) - .catch(function (err) { - done(err); - }); - }); -} - -module.exports = { - resolveWithMocks: resolveWithMocks, - testMode: TEST_MODE -} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/package-lock.json b/templates/Skill-Template/typescript/generator-botbuilder-skill/package-lock.json deleted file mode 100644 index 7ed615d959..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/package-lock.json +++ /dev/null @@ -1,3496 +0,0 @@ -{ - "name": "generator-botbuilder-skill", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" - }, - "@sinonjs/commons": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.4.0.tgz", - "integrity": "sha512-9jHK3YF/8HtJ9wCAbG+j8cD0i0+ATS9A7gXFqS36TblLPNy6rEEc+SB0imo91eCboGaBYGV/MT1/br/J+EE7Tw==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/formatio": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", - "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", - "dev": true, - "requires": { - "samsam": "1.3.0" - } - }, - "@sinonjs/samsam": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.2.0.tgz", - "integrity": "sha512-j5F1rScewLtx6pbTK0UAjA3jJj4RYiSKOix53YWv+Jzy/AZ69qHxUpU8fwVLjyKbEEud9QrLpv6Ggs7WqTimYw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.0.2", - "array-from": "^2.1.1", - "lodash": "^4.17.11" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", - "dev": true - }, - "acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", - "dev": true - }, - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" - }, - "array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "requires": { - "lodash": "^4.17.11" - } - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "binaryextensions": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.2.tgz", - "integrity": "sha512-xVNN69YGDghOqCCtA6FI7avYrr02mTJjOgB0/f1VPD3pJC8QEvjTKWc4epDx8AqxxA75NI0QpVM2gPJXUbE4Tg==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" - }, - "callsites": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", - "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-table": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", - "requires": { - "colors": "1.0.3" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" - }, - "cloneable-readable": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", - "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" - }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "dargs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-6.0.0.tgz", - "integrity": "sha512-6lJauzNaI7MiM8EHQWmGj+s3rP5/i1nYs8GAvKrLAx/9dpc9xS/4seFb1ioR39A+kcfu4v3jnEa/EE5qWYnitQ==" - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "detect-conflict": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz", - "integrity": "sha1-CIZXpmqWHAUBnbfEIwiDsca0F24=" - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "editions": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz", - "integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==", - "requires": { - "errlop": "^1.1.1", - "semver": "^5.6.0" - } - }, - "ejs": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", - "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==" - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "errlop": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/errlop/-/errlop-1.1.1.tgz", - "integrity": "sha512-WX7QjiPHhsny7/PQvrhS5VMizXXKoKCS3udaBp8gjlARdbn+XmK300eKBAAN0hGyRaTCtRpOaxK+xFVPUJ3zkw==", - "requires": { - "editions": "^2.1.2" - } - }, - "error": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", - "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", - "requires": { - "string-template": "~0.2.1", - "xtend": "~4.0.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "eslint": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.15.1.tgz", - "integrity": "sha512-NTcm6vQ+PTgN3UBsALw5BMhgO6i5EpIjQF/Xb5tIh3sk9QhrFafujUOczGz4J24JBlzWclSB9Vmx8d+9Z6bFCg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^4.0.2", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.12.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "eslint-config-prettier": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-3.6.0.tgz", - "integrity": "sha512-ixJ4U3uTLXwJts4rmSVW/lMXjlGwCijhBJHk8iVqKKSifeI0qgFEfWl8L63isfc8Od7EiBALF6BX3jKLluf/jQ==", - "dev": true, - "requires": { - "get-stdin": "^6.0.0" - } - }, - "eslint-config-xo": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.26.0.tgz", - "integrity": "sha512-l+93kmBSNr5rMrsqwC6xVWsi8LI4He3z6jSk38e9bAkMNsVsQ8XYO+qzXfJFgFX4i/+hiTswyHtl+nDut9rPaA==", - "dev": true - }, - "eslint-plugin-prettier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.0.1.tgz", - "integrity": "sha512-/PMttrarPAY78PLvV3xfWibMOdMDl57hmlQ2XqFeA37wd+CJ7WSxV7txqjVPHi/AAFKd2lX0ZqfsOc/i5yFCSQ==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-scope": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.2.tgz", - "integrity": "sha512-5q1+B/ogmHl8+paxtOKx38Z8LtWkVGuNt3+GQNErqwLl6ViNp/gdJGMCjZNxZ8j/VYjDNZ2Fo+eQc1TAVPIzbg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", - "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", - "dev": true - }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", - "dev": true - }, - "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", - "dev": true, - "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", - "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "first-chunk-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", - "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", - "requires": { - "readable-stream": "^2.0.2" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", - "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "gh-got": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-6.0.0.tgz", - "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==", - "requires": { - "got": "^7.0.0", - "is-plain-obj": "^1.1.0" - } - }, - "github-username": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/github-username/-/github-username-4.1.0.tgz", - "integrity": "sha1-y+KABBiDIG2kISrp5LXxacML9Bc=", - "requires": { - "gh-got": "^6.0.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" - }, - "globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", - "dev": true - }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" - }, - "grouped-queue": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-0.3.3.tgz", - "integrity": "sha1-wWfSpTGcWg4JZO9qJbfC34mWyFw=", - "requires": { - "lodash": "^4.17.2" - } - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" - }, - "import-fresh": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", - "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "inquirer": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", - "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.11", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" - }, - "strip-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", - "requires": { - "ansi-regex": "^4.0.0" - } - } - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" - }, - "is-scoped": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-1.0.0.tgz", - "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=", - "requires": { - "scoped-regex": "^1.0.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "requires": { - "buffer-alloc": "^1.2.0" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "istextorbinary": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.5.1.tgz", - "integrity": "sha512-pv/JNPWnfpwGjPx7JrtWTwsWsxkrK3fNzcEVnt92YKEIErps4Fsk49+qzCe9iQF2hjqK8Naqf8P9kzoeCuQI1g==", - "requires": { - "binaryextensions": "^2.1.2", - "editions": "^2.1.3", - "textextensions": "^2.4.0" - } - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.2.tgz", - "integrity": "sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "just-extend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", - "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "requires": { - "chalk": "^2.0.1" - } - }, - "lolex": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", - "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", - "dev": true - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "requires": { - "pify": "^3.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "mem-fs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-1.1.3.tgz", - "integrity": "sha1-uK6NLj/Lb10/kWXBLUVRoGXZicw=", - "requires": { - "through2": "^2.0.0", - "vinyl": "^1.1.0", - "vinyl-file": "^2.0.0" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "mem-fs-editor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-5.1.0.tgz", - "integrity": "sha512-2Yt2GCYEbcotYbIJagmow4gEtHDqzpq5XN94+yAx/NT5+bGqIjkXnm3KCUQfE6kRfScGp9IZknScoGRKu8L78w==", - "requires": { - "commondir": "^1.0.1", - "deep-extend": "^0.6.0", - "ejs": "^2.5.9", - "glob": "^7.0.3", - "globby": "^8.0.1", - "isbinaryfile": "^3.0.2", - "mkdirp": "^0.5.0", - "multimatch": "^2.0.0", - "rimraf": "^2.2.8", - "through2": "^2.0.0", - "vinyl": "^2.0.1" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", - "dev": true, - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" - } - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "nise": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.10.tgz", - "integrity": "sha512-sa0RRbj53dovjc7wombHmVli9ZihXbXCQ2uH3TNm03DyvOSIQbxg+pbqDKrk2oxMK1rtLGVlKxcB9rrc6X5YjA==", - "dev": true, - "requires": { - "@sinonjs/formatio": "^3.1.0", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "lolex": "^2.3.2", - "path-to-regexp": "^1.7.0" - }, - "dependencies": { - "@sinonjs/formatio": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.1.tgz", - "integrity": "sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" - } - } - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npmignore": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/npmignore/-/npmignore-0.2.0.tgz", - "integrity": "sha1-zZcbRd1HReYxZVClEXzaDd2NZs8=", - "requires": { - "array-uniq": "^1.0.1", - "minimist": "^1.1.0", - "verbalize": "^0.1.2" - } - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "requires": { - "p-finally": "^1.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" - }, - "parent-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.0.tgz", - "integrity": "sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "dev": true, - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "prettier": { - "version": "1.16.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", - "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "pretty-bytes": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.1.0.tgz", - "integrity": "sha512-wa5+qGVg9Yt7PB6rYm3kXlKzgzgivYTLRandezh43jjRqgyDyP+9YxfJpJiLs9yKD1WeU8/OvtToWpW7255FtA==" - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "read-chunk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.1.0.tgz", - "integrity": "sha512-ZdiZJXXoZYE08SzZvTipHhI+ZW0FpzxmFtLI3vIeMuRN9ySbIZ+SZawKogqJ7dxW9fJ/W73BNtxu4Zu/bZp+Ng==", - "requires": { - "pify": "^4.0.1", - "with-open-file": "^0.1.5" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - } - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "^1.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" - }, - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "requires": { - "is-promise": "^2.1.0" - } - }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "samsam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", - "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", - "dev": true - }, - "scoped-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz", - "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg=" - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shelljs": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", - "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "sinon": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-5.1.1.tgz", - "integrity": "sha512-h/3uHscbt5pQNxkf7Y/Lb9/OM44YNCicHakcq73ncbrIS8lXg+ZGOZbtuU+/km4YnyiCYfQQEwANaReJz7KDfw==", - "dev": true, - "requires": { - "@sinonjs/formatio": "^2.0.0", - "diff": "^3.5.0", - "lodash.get": "^4.4.2", - "lolex": "^2.4.2", - "nise": "^1.3.3", - "supports-color": "^5.4.0", - "type-detect": "^4.0.8" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", - "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==" - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "string-template": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", - "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=" - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "strip-bom-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", - "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", - "requires": { - "first-chunk-stream": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - }, - "table": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", - "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", - "dev": true, - "requires": { - "ajv": "^6.9.1", - "lodash": "^4.17.11", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", - "dev": true - }, - "string-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", - "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.0.0" - } - }, - "strip-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", - "dev": true, - "requires": { - "ansi-regex": "^4.0.0" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "textextensions": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.4.0.tgz", - "integrity": "sha512-qftQXnX1DzpSV8EddtHIT0eDDEiBF8ywhFYR2lI9xrGtxqKN+CvLXhACeCIGbCpQfxxERbrkZEFb8cZcDKbVZA==" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", - "requires": { - "readable-stream": "2 || 3" - } - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "untildify": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", - "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==" - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "^1.0.1" - } - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "verbalize": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/verbalize/-/verbalize-0.1.2.tgz", - "integrity": "sha1-Fl/aRkAzFUj46ZCx1+FDletyAgc=", - "requires": { - "chalk": "~0.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=" - }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "requires": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" - } - } - } - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", - "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.3.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^2.0.0", - "vinyl": "^1.1.0" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "with-open-file": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.5.tgz", - "integrity": "sha512-zY51cJCXG6qBilVuMceKNwU3rzjB/Ygt96BuSQ4+tXo3ewlxvj9ET99lpUHNzWfkYmsyfqKZEB9NJORmGZ1Ltw==", - "requires": { - "p-finally": "^1.0.0", - "p-try": "^2.0.0", - "pify": "^3.0.0" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "yeoman-assert": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yeoman-assert/-/yeoman-assert-3.1.1.tgz", - "integrity": "sha512-bCuLb/j/WzpvrJZCTdJJLFzm7KK8IYQJ3+dF9dYtNs2CUYyezFJDuULiZ2neM4eqjf45GN1KH/MzCTT3i90wUQ==", - "dev": true - }, - "yeoman-environment": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.3.4.tgz", - "integrity": "sha512-KLxE5ft/74Qj7h3AsQZv8G6MEEHYJwmD5F99nfOVaep3rBzCtbrJKkdqWc7bDV141Nr8UZZsIXmzc3IcCm6E2w==", - "requires": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "debug": "^3.1.0", - "diff": "^3.5.0", - "escape-string-regexp": "^1.0.2", - "globby": "^8.0.1", - "grouped-queue": "^0.3.3", - "inquirer": "^6.0.0", - "is-scoped": "^1.0.0", - "lodash": "^4.17.10", - "log-symbols": "^2.2.0", - "mem-fs": "^1.1.0", - "strip-ansi": "^4.0.0", - "text-table": "^0.2.0", - "untildify": "^3.0.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "yeoman-generator": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-3.2.0.tgz", - "integrity": "sha512-iR/qb2je3GdXtSfxgvOXxUW0Cp8+C6LaZaNlK2BAICzFNzwHtM10t/QBwz5Ea9nk6xVDQNj4Q889TjCXGuIv8w==", - "requires": { - "async": "^2.6.0", - "chalk": "^2.3.0", - "cli-table": "^0.3.1", - "cross-spawn": "^6.0.5", - "dargs": "^6.0.0", - "dateformat": "^3.0.3", - "debug": "^4.1.0", - "detect-conflict": "^1.0.0", - "error": "^7.0.2", - "find-up": "^3.0.0", - "github-username": "^4.0.0", - "istextorbinary": "^2.2.1", - "lodash": "^4.17.10", - "make-dir": "^1.1.0", - "mem-fs-editor": "^5.0.0", - "minimist": "^1.2.0", - "pretty-bytes": "^5.1.0", - "read-chunk": "^3.0.0", - "read-pkg-up": "^4.0.0", - "rimraf": "^2.6.2", - "run-async": "^2.0.0", - "shelljs": "^0.8.0", - "text-table": "^0.2.0", - "through2": "^3.0.0", - "yeoman-environment": "^2.0.5" - } - }, - "yeoman-test": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/yeoman-test/-/yeoman-test-1.9.1.tgz", - "integrity": "sha512-aWB8CglmjBfXd+U5g5Cm1b8KVW0uotjo521IgkepvhNXiAX/YswHYGVnbEFb0m9ZdXztELuNJn2UtuwgFZIw6Q==", - "dev": true, - "requires": { - "inquirer": "^5.2.0", - "lodash": "^4.17.10", - "mkdirp": "^0.5.1", - "pinkie-promise": "^2.0.1", - "rimraf": "^2.4.4", - "sinon": "^5.0.7", - "yeoman-environment": "^2.3.0", - "yeoman-generator": "^2.0.5" - }, - "dependencies": { - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "dargs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz", - "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=", - "dev": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "inquirer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", - "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.1.0", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^5.5.2", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "mem-fs-editor": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-4.0.3.tgz", - "integrity": "sha512-tgWmwI/+6vwu6POan82dTjxEpwAoaj0NAFnghtVo/FcLK2/7IhPUtFUUYlwou4MOY6OtjTUJtwpfH1h+eSUziw==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "deep-extend": "^0.6.0", - "ejs": "^2.5.9", - "glob": "^7.0.3", - "globby": "^7.1.1", - "isbinaryfile": "^3.0.2", - "mkdirp": "^0.5.0", - "multimatch": "^2.0.0", - "rimraf": "^2.2.8", - "through2": "^2.0.0", - "vinyl": "^2.0.1" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pretty-bytes": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", - "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", - "dev": true - }, - "read-chunk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz", - "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=", - "dev": true, - "requires": { - "pify": "^3.0.0", - "safe-buffer": "^5.1.1" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "yeoman-generator": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-2.0.5.tgz", - "integrity": "sha512-rV6tJ8oYzm4mmdF2T3wjY+Q42jKF2YiiD0VKfJ8/0ZYwmhCKC9Xs2346HVLPj/xE13i68psnFJv7iS6gWRkeAg==", - "dev": true, - "requires": { - "async": "^2.6.0", - "chalk": "^2.3.0", - "cli-table": "^0.3.1", - "cross-spawn": "^6.0.5", - "dargs": "^5.1.0", - "dateformat": "^3.0.3", - "debug": "^3.1.0", - "detect-conflict": "^1.0.0", - "error": "^7.0.2", - "find-up": "^2.1.0", - "github-username": "^4.0.0", - "istextorbinary": "^2.2.1", - "lodash": "^4.17.10", - "make-dir": "^1.1.0", - "mem-fs-editor": "^4.0.0", - "minimist": "^1.2.0", - "pretty-bytes": "^4.0.2", - "read-chunk": "^2.1.0", - "read-pkg-up": "^3.0.0", - "rimraf": "^2.6.2", - "run-async": "^2.0.0", - "shelljs": "^0.8.0", - "text-table": "^0.2.0", - "through2": "^2.0.0", - "yeoman-environment": "^2.0.5" - } - } - } - } - } -} diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/package.json b/templates/Skill-Template/typescript/generator-botbuilder-skill/package.json deleted file mode 100644 index 729280a8b4..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "generator-botbuilder-skill", - "version": "1.0.0", - "description": "Project template for skills using the Bot Builder SDK V4.", - "homepage": "https://github.com/Microsoft/AI/tree/master/templates/Skill-Template/src/typescript", - "author": { - "name": "Microsoft", - "email": "botframework@microsoft.com", - "url": "http://dev.botframework.com" - }, - "files": [ - "generators", - "app", - ".gitignore", - ".npmignore" - ], - "main": "generators/app/index.js", - "keywords": [ - "botbuilder", - "skills", - "bots", - "bot framework", - "Microsoft AI", - "yeoman-generator", - "Virtual Assistant" - ], - "devDependencies": { - "yeoman-test": "^1.9.1", - "yeoman-assert": "^3.1.1", - "eslint": "^5.12.0", - "prettier": "^1.15.3", - "eslint-config-prettier": "^3.4.0", - "eslint-plugin-prettier": "^3.0.1", - "eslint-config-xo": "^0.26.0", - "mocha": "^6.0.2" - }, - "engines": { - "npm": ">= 4.0.0" - }, - "dependencies": { - "chalk": "^2.4.2", - "lodash": "^4.17.11", - "npmignore": "^0.2.0", - "yeoman-generator": "^3.2.0" - }, - "lint-staged": { - "*.js": [ - "eslint --fix", - "git add" - ], - "*.json": [ - "prettier --write", - "git add" - ] - }, - "scripts": { - "pretest": "eslint .", - "test": "cd test/ && mocha --opts mocha.opts" - }, - "license": "MIT" -} diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/test/generator-botbuilder-skill.test.suite.js b/templates/Skill-Template/typescript/generator-botbuilder-skill/test/generator-botbuilder-skill.test.suite.js deleted file mode 100644 index 1ac085c9e9..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/test/generator-botbuilder-skill.test.suite.js +++ /dev/null @@ -1,667 +0,0 @@ -"use strict"; -const path = require("path"); -const assert = require("yeoman-assert"); -const helpers = require("yeoman-test"); -const rimraf = require("rimraf"); -const _camelCase = require("lodash/camelCase"); -const _upperFirst = require("lodash/upperFirst"); -const semver = require('semver'); - -describe("The generator-botbuilder-skill tests", function() { - var skillName; - var skillNameId; - var skillDesc; - var skillNamePascalCase; - var skillNameCamelCase; - var skillNameIdPascalCase; - var skillUserStateNameClass; - var skillUserStateNameFile; - var pathConfirmation; - var skillGenerationPath; - var finalConfirmation; - var run = true; - var srcFiles; - var flowTestFiles; - var skillServices; - var skillTestServices; - var packageJSON; - const conversationStateTag = "ConversationState"; - const userStateTag = "UserState"; - const cognitiveDirectories = ["LUIS"]; - const rootFiles = [ - ".gitignore", - "tsconfig.json", - "package.json", - "tslint.json", - ".env.development", - ".env.production" - ]; - const deploymentFiles = [ - path.join("de", "bot.recipe"), - path.join("en", "bot.recipe"), - path.join("es", "bot.recipe"), - path.join("fr", "bot.recipe"), - path.join("it", "bot.recipe"), - path.join("zh", "bot.recipe") - ] - const testFiles = [ - "mocha.opts", - path.join("flow","mainDialogTests.js"), - path.join("flow","sampleDialogTests.js"), - path.join("flow","skillTestBase.js") - ]; - const commonDirectories = [ - "cognitiveModels", - ]; - - const languageDirectories = [ - "de", - "en", - "es", - "fr", - "it", - "zh" - ]; - - const commonTestDirectories = [ - "flow" - ]; - const commonTestFiles = ["mocha.opts", ".env.test", "testBase.js"]; - const commonSrcDirectories = [ - path.join("serviceClients"), - path.join("dialogs"), - ] - const commonDialogsDirectories = [ - path.join("main"), - path.join("main", "resources"), - path.join("sample"), - path.join("sample", "resources"), - path.join("shared"), - path.join("shared", "dialogOptions"), - path.join("shared", "resources") - ] - const commonDialogsFiles = [ - path.join("main", "mainDialog.ts"), - path.join("main", "mainResponses.ts"), - path.join("sample", "sampleDialog.ts"), - path.join("sample", "sampleResponses.ts"), - path.join("shared", "skillDialogBase.ts"), - path.join("shared", "sharedResponses.ts") - ] - const mockResourcesFiles = [ - path.join("skills.json"), - path.join("languageModels.json"), - path.join("mockedConfiguration.bot") - ]; - - const localeConfigurationTestFiles = [ - "mockedSkillDe.bot", - "mockedSkillEn.bot", - "mockedSkillEs.bot", - "mockedSkillFr.bot", - "mockedSkillIt.bot", - "mockedSkillZh.bot" - ]; - - describe("should create", function() { - skillName = "customSkill"; - skillDesc = "A description for customSkill"; - skillNamePascalCase = _upperFirst(_camelCase(skillName)); - skillNameCamelCase = _camelCase(skillName); - skillGenerationPath = path.join(__dirname, "tmp"); - skillNameId = skillNameCamelCase.substring( - 0, - skillNameCamelCase.indexOf("Skill") - ); - skillNameIdPascalCase = _upperFirst(skillNameId); - skillUserStateNameClass = `I${skillNamePascalCase.concat(userStateTag)}`; - skillUserStateNameFile = skillNameCamelCase.concat( - userStateTag - ); - pathConfirmation = true; - finalConfirmation = true; - srcFiles = ["index.ts", `${skillUserStateNameFile}.ts`, `${skillNameCamelCase}.ts`, "languageModels.json"]; - flowTestFiles = ["interruptionTest.js", "mainDialogTest.js", "sampleDialogTest.js", `${skillName}TestBase.js`]; - before(async function(){ - await helpers - .run(path.join(__dirname, "..", "generators", "app")) - .inDir(skillGenerationPath) - .withArguments([ - "-n", - skillName, - "-d", - skillDesc, - "-p", - skillGenerationPath, - "--noPrompt" - ]); - - skillServices = require(path.join(skillGenerationPath, skillName, "src", "skills.json"))[0]; - skillTestServices = require(path.join(skillGenerationPath, skillName, "test", "mockResources", "skills.json"))[0]; - packageJSON = require(path.join(skillGenerationPath, skillName, "package.json")); - }); - - after(function() { - rimraf.sync(path.join(__dirname, "tmp", "*")); - }); - - describe("the base", function() { - it(skillName.concat(" folder"), function(done) { - assert.file( - path.join(skillGenerationPath, skillName) - ); - done(); - }); - }); - - describe("the folders", function() { - commonDirectories.forEach(directoryName => { - it(directoryName.concat(" folder"), function(done){ - assert.file( - path.join(skillGenerationPath, skillName, directoryName) - ); - done(); - }); - }); - - cognitiveDirectories.forEach(directoryName => - it(directoryName.concat(" folder"), function(done) { - assert.file( - path.join(skillGenerationPath, skillName, "cognitiveModels", directoryName) - ); - done(); - }) - ); - - commonTestDirectories.forEach(testDirectoryName => - it(testDirectoryName.concat(" folder"), function(done) { - assert.file( - path.join(skillGenerationPath, skillName, "test", testDirectoryName) - ); - done(); - }) - ); - }); - - describe("in the root folder", function() { - rootFiles.forEach(fileName => - it(fileName.concat(" file"), function(done){ - assert.file( - path.join(skillGenerationPath, skillName, fileName) - ); - done(); - }) - ); - }); - - describe("in the deploymentScripts folder", function() { - deploymentFiles.forEach(fileName => - it(fileName.concat(" file"), function(done){ - assert.file( - path.join(skillGenerationPath, skillName, "deploymentScripts", fileName) - ); - done(); - }) - ); - }); - - describe("in the src folder", function() { - srcFiles.forEach(fileName => - it(fileName.concat(" file"), function(done){ - assert.file( - path.join(skillGenerationPath, skillName, "src", fileName) - ); - done(); - }) - ); - - commonSrcDirectories.forEach(directoryName => - it(directoryName.concat(" folder"), function(done) { - assert.file( - path.join(skillGenerationPath, skillName, "src", directoryName) - ) - done(); - }) - ); - }); - - describe("in the dialogs folder", function() { - commonDialogsDirectories.forEach(directoryName => - it(directoryName.concat(" folder"), function(done) { - assert.file( - path.join(skillGenerationPath, skillName, "src", "dialogs", directoryName) - ) - done(); - }) - ); - - commonDialogsFiles.forEach(fileName => - it(fileName.concat(" file"), function(done){ - assert.file( - path.join(skillGenerationPath, skillName, "src", "dialogs", fileName) - ); - done(); - }) - ); - }); - - describe("in the test folder", function() { - commonTestFiles.forEach(fileName => - it(fileName.concat(" file"), function(done){ - assert.file( - path.join(skillGenerationPath, skillName, "test", fileName) - ); - done(); - }) - ); - }); - - describe("in the LocaleConfigurations test folder", function() { - localeConfigurationTestFiles.forEach(fileName => - it(fileName.concat(" file"), function(done){ - assert.file( - path.join(skillGenerationPath, skillName, "test", "mockResources", "LocaleConfigurations", fileName) - ); - done(); - }) - ); - }); - - describe("in the flow folder", function() { - flowTestFiles.forEach(fileName => - it(fileName.concat(" file"), function(done){ - assert.file( - path.join(skillGenerationPath, skillName, "test", "flow", fileName) - ); - done(); - }), - ); - }); - - describe("in the mockResources folder", function() { - mockResourcesFiles.forEach(fileName => - it(fileName.concat(" file"), function(done){ - assert.file( - path.join(skillGenerationPath, skillName, "test", "mockResources", fileName) - ); - done(); - }), - ); - }); - - describe("in the mockedSkillDe.bot file", function() { - it("an id property with the given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "test", "mockResources", "LocaleConfigurations", "mockedSkillDe.bot"), - `"id": "${skillNameId}"` - ); - done(); - }) - }); - - describe("in the mockedSkillEn.bot file", function() { - it("an id property with the given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "test", "mockResources", "LocaleConfigurations", "mockedSkillEn.bot"), - `"id": "${skillNameId}"` - ); - done(); - }) - }); - - describe("in the mockedSkillEs.bot file", function() { - it("an id property with the given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "test", "mockResources", "LocaleConfigurations", "mockedSkillEs.bot"), - `"id": "${skillNameId}"` - ); - done(); - }) - }); - - describe("in the mockedSkillFr.bot file", function() { - it("an id property with the given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "test", "mockResources", "LocaleConfigurations", "mockedSkillFr.bot"), - `"id": "${skillNameId}"` - ); - done(); - }) - }); - - describe("in the mockedSkillIt.bot file", function() { - it("an id property with the given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "test", "mockResources", "LocaleConfigurations", "mockedSkillIt.bot"), - `"id": "${skillNameId}"` - ); - done(); - }) - }); - - describe("in the mockedSkillZh.bot file", function() { - it("an id property with the given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "test", "mockResources", "LocaleConfigurations", "mockedSkillZh.bot"), - `"id": "${skillNameId}"` - ); - done(); - }) - }); - - describe("in skills file of the skill", function() { - it("an id property with the given name", function(done){ - assert.equal(skillServices.id, skillNameCamelCase); - done(); - }), - it("a name property with the given name", function(done){ - assert.equal(skillServices.name, skillNameCamelCase); - done(); - }), - it("a dispatchIntent property with an intent containing the given name", function(done){ - assert.equal(skillServices.dispatchIntent, `l_${skillNameIdPascalCase}`); - done(); - }), - it("a luisServicesIds property with the given name id", function(done){ - assert.equal(skillServices.luisServiceIds[0], skillNameId); - done(); - }), - it("a pathToBot property to a path with the given name", function(done){ - assert.equal(skillServices.configuration.pathToBot, `./${skillNameCamelCase}/lib/${skillNameCamelCase}.js`); - done(); - }), - it("a ClassName property with a class of a given name", function(done){ - assert.equal(skillServices.configuration.ClassName, skillNamePascalCase); - done(); - }) - }); - - describe("in skills file of the tests", function() { - it("an id property with the given name", function(done){ - assert.equal(skillTestServices.id, skillNameCamelCase); - done(); - }), - it("a name property with the given name", function(done){ - assert.equal(skillTestServices.name, skillNameCamelCase); - done(); - }), - it("a dispatchIntent property with an intent containing the given name", function(done){ - assert.equal(skillTestServices.dispatchIntent, `l_${skillNameIdPascalCase}`); - done(); - }), - it("a luisServicesIds property with the given name id", function(done){ - assert.equal(skillTestServices.luisServiceIds[0], skillNameId); - done(); - }), - it("a pathToBot property to a path with the given name", function(done){ - assert.equal(skillTestServices.configuration.pathToBot, `./${skillNameCamelCase}/lib/${skillNameCamelCase}.js`); - done(); - }), - it("a ClassName property with a class of a given name", function(done){ - assert.equal(skillTestServices.configuration.ClassName, skillNamePascalCase); - done(); - }) - }); - - describe("in interruptionTest file", function() { - it("and have a const value with given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "test", "flow", "interruptionTest.js"), - `const ${skillNameCamelCase} = require('./${skillNameCamelCase}TestBase.js');` - ); - done(); - }), - - it("and have a call to an object with given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "test", "flow", "interruptionTest.js"), - `${skillNameCamelCase}.initialize();` - ); - assert.fileContent( - path.join(skillGenerationPath, skillName, "test", "flow", "interruptionTest.js"), - `testAdapter = ${skillNameCamelCase}.getTestAdapter();` - ); - done(); - }) - }); - - describe("in sampleDialogTest file", function() { - it("and have a const value with given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "test", "flow", "sampleDialogTest.js"), - `const ${skillNameCamelCase} = require('./${skillNameCamelCase}TestBase.js');` - ); - done(); - }), - - it("and have a call to an object with given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "test", "flow", "sampleDialogTest.js"), - `${skillNameCamelCase}.initialize();` - ); - assert.fileContent( - path.join(skillGenerationPath, skillName, "test", "flow", "sampleDialogTest.js"), - `testAdapter = ${skillNameCamelCase}.getTestAdapter();` - ); - done(); - }) - }); - - describe("in mainDialogTest file", function() { - it("and have a const value with given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "test", "flow", "mainDialogTest.js"), - `const ${skillNameCamelCase} = require('./${skillNameCamelCase}TestBase.js');` - ); - done(); - }), - - it("and have a call to an object with given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "test", "flow", "mainDialogTest.js"), - `${skillNameCamelCase}.initialize();` - ); - assert.fileContent( - path.join(skillGenerationPath, skillName, "test", "flow", "mainDialogTest.js"), - `testAdapter = ${skillNameCamelCase}.getTestAdapter();` - ); - done(); - }) - }); - - describe(`in ${skillName}TestBase file`, function() { - it("and have a const value with given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "test", "flow", `${skillName}TestBase.js`), - `const ${skillNamePascalCase} = require('../../lib/${skillNameCamelCase}.js').${skillNamePascalCase};` - ); - done(); - }), - - it("and initialize the skill with given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "test", "flow", `${skillName}TestBase.js`), - `this.bot = new ${skillNamePascalCase}(services, conversationState, userState, telemetryClient, skillMode);` - ); - done(); - }) - }); - - describe("and have in the package.json", function() { - it("a name property with the given name", function(done) { - assert.equal(packageJSON.name, skillName); - done(); - }); - - it("a description property with given description", function(done) { - assert.equal(packageJSON.description, skillDesc); - done(); - }); - }); - - describe("and have in the mainDialog file", function() { - - it("an import component containing an UserState with the given name", function(done) { - assert.fileContent( - path.join(skillGenerationPath, skillName, "src", "dialogs", "main", "mainDialog.ts"), - `import { ${skillUserStateNameClass} } from '../../${skillUserStateNameFile}';` - ); - done(); - }); - - it("an accessor containing an UserState with the given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "src", "dialogs", "main", "mainDialog.ts"), - `StatePropertyAccessor<${skillUserStateNameClass}>` - ); - done(); - }); - - it("a creation of a property containing an UserState with the given name" , function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "src", "dialogs", "main", "mainDialog.ts"), - `.createProperty('${skillUserStateNameClass}')` - ); - done(); - }); - - it("a property with the name of the project", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "src", "dialogs", "main", "mainDialog.ts"), - `private projectName: string = '${skillNameId}'` - ); - done() - }); - }); - - describe("and have in the sampleDialog file", function() { - it("an import component containing an UserState with the given name", function(done) { - assert.fileContent( - path.join(skillGenerationPath, skillName, "src", "dialogs", "sample", "sampleDialog.ts"), - `import { ${skillUserStateNameClass} } from '../../${skillUserStateNameFile}';` - ); - done(); - }); - - it("an accessor containing an UserState with the given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "src", "dialogs", "sample", "sampleDialog.ts"), - `StatePropertyAccessor<${skillUserStateNameClass}>` - ); - done(); - }); - }); - - describe("and have in the LUIS folder", function() { - languageDirectories.forEach(fileName => - it(fileName.concat(" folder with the .lu file"), function(done){ - assert.file( - path.join(skillGenerationPath, skillName, "cognitiveModels", "LUIS", fileName, `${skillNameId}.lu`) - ); - done(); - }) - ); - }); - - xdescribe("and have in the skillConversationState file", function() { - it("a creation of a property containing the skillProjectName with the given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "src", "skillConversationState.ts"), - `luisResult?: '${skillNameId}LU'` - ); - done(); - }); - }); - - describe("and have in the bot.recipe file", function() { - languageDirectories.forEach(fileName => - it(fileName.concat(" folder with the skillProjectNameId in each bot.recipe file"), function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "deploymentScripts", fileName, "bot.recipe"), - `"id": "${skillNameId}"`, - `"name": "${skillNameId}"`, - `"luPath": "..\\cognitiveModels\\LUIS\\de\\${skillNameId}.lu"` - ); - done(); - }) - ); - }); - - describe("and have in the skillDialogBase file", function() { - - it("a property with the name of the project", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "src", "dialogs", "main", "mainDialog.ts"), - `private projectName: string = '${skillNameId}'` - ); - done(); - }); - }); - - describe("and have in the index file", function() { - it("an import component with the given name", function(done) { - assert.fileContent( - path.join(skillGenerationPath, skillName, "src", "index.ts"), - `import { ${skillNamePascalCase} } from './${skillNameCamelCase}';` - ); - done(); - }); - - it("a declaration of a property with type of the given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "src", "index.ts"), - `let bot: ${skillNamePascalCase};` - ); - done(); - }); - - it("an initialization of the property with type of the given name", function(done){ - assert.fileContent( - path.join(skillGenerationPath, skillName, "src", "index.ts"), - `bot = new ${skillNamePascalCase}(` - ); - done(); - }); - }); - }); - - describe("should not create", function() { - before(async function() { - if(semver.gte(process.versions.node, '10.12.0')){ - run = false; - } - else { - finalConfirmation = false; - await helpers - .run(path.join( - __dirname, - "..", - "generators", - "app" - )) - .inDir(skillGenerationPath) - .withPrompts({ - skillName: skillName, - skillDesc: skillDesc, - pathConfirmation: pathConfirmation, - skillGenerationPath: skillGenerationPath, - finalConfirmation: finalConfirmation - }); - } - }); - - after(function() { - rimraf.sync(path.join(__dirname, "tmp", "*")); - }); - - describe("the base", function() { - it(skillName + " folder when the final confirmation is deny", function(done) { - if(!run){ - this.skip() - } - assert.noFile(skillGenerationPath, skillName); - done(); - }); - }); - }) -}); diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/test/mocha.opts b/templates/Skill-Template/typescript/generator-botbuilder-skill/test/mocha.opts deleted file mode 100644 index 8dc6551e55..0000000000 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/test/mocha.opts +++ /dev/null @@ -1,3 +0,0 @@ ---timeout 30000 ---recursive -./*.js \ No newline at end of file diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/README.md b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/README.md index 6c5fa0ee9b..39bfbfe938 100644 --- a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/README.md +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/README.md @@ -38,7 +38,9 @@ yo botbuilder-assistant | Generator | Description | |-----------------------------------------------------|-------------------------------------------------| -| [botbuilder-assistant](generators/app/README.md) | Generator that creates a basic assistant | +| [botbuilder-assistant](generators/app/README.md) | Generator that creates a basic assistant | +| [botbuilder-assistant:skill](generators/skill/README.md) | Generator that creates a basic skill | + ## License diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/app/templates/customAssistant/_.npmrc b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/app/templates/customAssistant/_.npmrc index 14f698d254..26f0e30032 100644 --- a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/app/templates/customAssistant/_.npmrc +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/app/templates/customAssistant/_.npmrc @@ -1,2 +1,2 @@ -registry=https://www.myget.org/F/project-kobuk/npm/ +registry=https://botbuilder.myget.org/F/aitemplates/npm/ always-auth=false \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/README.md b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/README.md similarity index 62% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/README.md rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/README.md index b3447889a8..9f15c4a91d 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/README.md +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/README.md @@ -6,18 +6,25 @@ - Run the following command for generating your new project. ```bash -> yo botbuilder-skill +> yo botbuilder-assistant:skill ``` #### **At this point you have two different options to procedure** ### Generate the skill using prompts -- The generator will start prompting for some information that is needed for generating the skill: +- The generator will start prompting for some information that is needed for generating the sample: - `What's the name of your skill? (customSkill)` > The name of your skill (used also as your project's name and for the root folder's name). - `What will your skill do? ()` > The description of your skill. + - `Which languages will your skill use? (by default takes all the languages)` + - [x] Chinese (`zh`) + - [x] Deutsch (`de`) + - [x] English (`en`) + - [x] French (`fr`) + - [x] Italian (`it`) + - [x] Spanish (`es`) - `Do you want to change the new skill's location?` > A confirmation to change the destination for the generation. - `Where do you want to generate the skill? (by default takes the path where you are running the generator)` @@ -25,13 +32,14 @@ - `Looking good. Shall I go ahead and create your new skill?` > Final confirmation for creating the desired skill. -### Generate the skill using CLI parameters +### Generate the sample using CLI parameters | Option | Description | |-----------------------------------|--------------------------------------------------------------------------------------------------------------| -| -n, --skillName | name of new skill (by default takes `customSkill`) | -| -d, --skillDesc | description of the new skill | -| -p, --skillGenerationPath | destination path for the new skill (by default takes the path where you are runnning the generator) | +| -n, --skillName | name of new skill (by default takes `customSkill`) | +| -d, --skillDesc | description of the new skill (by default takes ``) | +| -l, --skillLang | languages for the new skill. Possible values are `de`, `en`, `es`, `fr`, `it`, `zh` (by default takes all the languages)| +| -p, --skillGenerationPath | destination path for the new skill (by default takes the path where you are runnning the generator) | | --noPrompt | indicates to avoid the prompts | **NOTE:** If you don't use the _--noPrompt_ option, the process will keep prompting, but using the input values by default. @@ -39,18 +47,21 @@ #### Example ```bash -> yo botbuilder-skill -n newSkill -d "A description for my new skill" -p "\aPath" --noPrompt +> yo botbuilder-skill -n "My Skill" -d "A description for my new skill" -l "en,es" -p "\aPath" --noPrompt ``` After this, you can check the summary in your screen: ```bash - Name: - Description: +- Selected languages: - Path: ``` **WARNING:** The process will fail if it finds another folder with the same name of the new skill. +**NOTE:** Remind to have an **unique** skill's name for deployment steps. + ## License MIT © [Microsoft](http://dev.botframework.com) \ No newline at end of file diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/index.js b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/index.js new file mode 100644 index 0000000000..e19bc79aa1 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/index.js @@ -0,0 +1,332 @@ +/** + * Copyright(c) Microsoft Corporation.All rights reserved. + * Licensed under the MIT License. + */ +"use strict"; +const { Copier } = require("./src/copier"); +const Generator = require(`yeoman-generator`); +const chalk = require(`chalk`); +const fs = require("fs"); +const path = require(`path`); +const pkg = require(`../../package.json`); +const _pick = require(`lodash/pick`); +const _kebabCase = require(`lodash/kebabCase`); +const templateName = "customSkill"; +const languages = [`zh`, `de`, `en`, `fr`, `it`, `es`]; +let skillName; +let skillDesc; +let skillGenerationPath = process.cwd(); +let isAlreadyCreated = false; +let copier; + +const languagesChoice = [ + { + name: "Chinese", + value: "zh", + checked: true + }, + { + name: "Deutsch", + value: "de", + checked: true + }, + { + name: "English", + value: "en", + checked: true + }, + { + name: "French", + value: "fr", + checked: true + }, + { + name: "Italian", + value: "it", + checked: true + }, + { + name: "Spanish", + value: "es", + checked: true + } +]; + +const bigBot = + ` ╭───────────────────────╮\n` + + ` ` + + chalk.blue.bold(`//`) + + ` ` + + chalk.blue.bold(`\\\\`) + + ` │ Welcome to the │\n` + + ` ` + + chalk.blue.bold(`//`) + + ` () () ` + + chalk.blue.bold(`\\\\`) + + ` │ BotBuilder Skill │\n` + + ` ` + + chalk.blue.bold(`\\\\`) + + ` ` + + chalk.blue.bold(`//`) + + ` /│ generator! │\n` + + ` ` + + chalk.blue.bold(`\\\\`) + + ` ` + + chalk.blue.bold(`//`) + + ` ╰───────────────────────╯\n` + + ` v${pkg.version}`; + +const tinyBot = + ` ` + chalk.blue.bold(`<`) + ` ** ` + chalk.blue.bold(`>`) + ` `; + +module.exports = class extends Generator { + constructor(args, opts) { + super(args, opts); + + this.option(`skillName`, { + description: `The name you want to give to your skill.`, + type: String, + default: `customSkill`, + alias: `n` + }); + + this.option(`skillDesc`, { + description: `A brief bit of text used to describe what your skill does.`, + type: String, + alias: `d` + }); + + this.option(`skillLang`, { + description: `The languages you want to use with your skill.`, + type: String, + alias: `l`, + default: languages.join() + }); + + this.option(`skillGenerationPath`, { + description: `The path where the skill will be generated.`, + type: String, + default: process.cwd(), + alias: `p` + }); + + this.option(`noPrompt`, { + description: `Do not prompt for any information or confirmation.`, + type: Boolean, + default: false + }); + + // Instantiate the copier + copier = new Copier(this); + } + + prompting() { + this.log(bigBot); + // Validate language option + if (this.options.skillLang) { + this.options.skillLang = this.options.skillLang + .replace(/\s/g, "") + .split(","); + if ( + !this.options.skillLang.every(language => { + return languages.includes(language); + }) + ) { + this.log.error( + "ERROR: One of the languages is not recognized, please check your language value\n\t" + ); + process.exit(1); + } + } else { + this.log.error( + "ERROR: Language must be selected from the list:\n\t" + + languages.map(l => `${l.value} -> ${l.name}`).join("\n\t") + + "\nDefault value: en" + ); + process.exit(1); + } + + // Generate the main prompts + const prompts = [ + // Name of the skill + { + type: `input`, + name: `skillName`, + message: `What's the name of your skill?`, + default: this.options.skillName ? this.options.skillName : `customSkill` + }, + // Description of the skill + { + type: `input`, + name: `skillDesc`, + message: `What's the description of your skill?`, + default: this.options.skillDesc ? this.options.skillDesc : `` + }, + // Language of the skill + { + type: "checkbox", + name: "skillLang", + message: "Which languages will your skill use?", + choices: languagesChoice + }, + // Path of the skill + { + type: `confirm`, + name: `pathConfirmation`, + message: `Do you want to change the new skill's location?`, + default: false + }, + { + when: function(response) { + return response.pathConfirmation === true; + }, + type: `input`, + name: `skillGenerationPath`, + message: `Where do you want to generate the skill?`, + default: this.options.skillGenerationPath + ? this.options.skillGenerationPath + : process.cwd(), + validate: path => { + if (fs.existsSync(path)) { + return true; + } + + this.log( + chalk.red( + `\n`, + `ERROR: This is not a valid path. Please try again.` + ) + ); + } + }, + // Final confirmation of the skill + { + type: `confirm`, + name: `finalConfirmation`, + message: `Looking good. Shall I go ahead and create your new skill?`, + default: true + } + ]; + + // Check that if it was generated with CLI commands + if (this.options.noPrompt) { + this.props = _pick(this.options, [ + `skillName`, + `skillDesc`, + `skillLang`, + `skillGenerationPath` + ]); + + // Validate we have what we need, or we'll need to throw + if (!this.props.skillName) { + this.log.error( + `ERROR: Must specify a name for your skill when using --noPrompt argument. Use --skillName or -n option.` + ); + process.exit(1); + } + + this.props.finalConfirmation = true; + return; + } + + return this.prompt(prompts).then(props => { + this.props = props; + }); + } + + writing() { + const skillLang = this.props.skillLang; + if (this.props.finalConfirmation !== true) { + return; + } + + skillDesc = this.props.skillDesc; + if (!this.props.skillName.replace(/\s/g, ``).length) { + this.props.skillName = templateName; + } + + skillName = _kebabCase(this.props.skillName).replace(/([^a-z0-9-]+)/gi, ``); + + skillGenerationPath = path.join(skillGenerationPath, skillName); + if (this.props.skillGenerationPath !== undefined) { + skillGenerationPath = path.join( + this.props.skillGenerationPath, + skillName + ); + } + + if (fs.existsSync(skillGenerationPath)) { + isAlreadyCreated = true; + return; + } + + this.log(chalk.magenta(`\nCurrent values for the new skill:`)); + this.log(chalk.magenta(`Name: ` + skillName)); + this.log(chalk.magenta(`Description: ` + skillDesc)); + this.log(chalk.magenta(`Selected languages: ` + skillLang.join())); + this.log(chalk.magenta(`Path: ` + skillGenerationPath + `\n`)); + + // Create new skill obj + const newSkill = { + skillName: skillName, + skillDescription: skillDesc + }; + + // Start the copy of the template + copier.selectLanguages(skillLang); + copier.copyIgnoringTemplateFiles(templateName, skillGenerationPath); + copier.copyTemplateFiles(templateName, skillGenerationPath, newSkill); + } + + install() { + if (this.props.finalConfirmation !== true || isAlreadyCreated) { + return; + } + + process.chdir(skillGenerationPath); + this.installDependencies({ npm: true, bower: false }); + } + + end() { + if (this.props.finalConfirmation === true) { + if (isAlreadyCreated) { + this.log( + chalk.red.bold( + `-------------------------------------------------------------------------------------------- ` + ) + ); + this.log( + chalk.red.bold( + ` ERROR: It's seems like you already have an skill with the same name in the destination path. ` + ) + ); + this.log( + chalk.red.bold( + ` Try again changing the name or the destination path or deleting the previous bot. ` + ) + ); + this.log( + chalk.red.bold( + `-------------------------------------------------------------------------------------------- ` + ) + ); + } else { + this.log(chalk.green(`------------------------ `)); + this.log(chalk.green(` Your new skill is ready! `)); + this.log(chalk.green(`------------------------ `)); + this.log( + `Open the ` + + chalk.green.bold(`README.md`) + + ` to learn how to run your skill. ` + ); + } + } else { + this.log(chalk.red.bold(`-------------------------------- `)); + this.log(chalk.red.bold(` New skill creation was canceled. `)); + this.log(chalk.red.bold(`-------------------------------- `)); + } + + this.log(`Thank you for using the Microsoft Bot Framework. `); + this.log(`\n` + tinyBot + `The Bot Framework Team`); + } +}; diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/src/copier.js b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/src/copier.js new file mode 100644 index 0000000000..e399ca3420 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/src/copier.js @@ -0,0 +1,98 @@ +/** + * Copyright(c) Microsoft Corporation.All rights reserved. + * Licensed under the MIT License. + */ +"use strict"; +const path = require(`path`); +const templateFiles = new Map(); +const allLanguages = [`zh`, `de`, `en`, `fr`, `it`, `es`]; +let ignoredLanguages = []; +let selectedLanguages = []; + +class Copier { + // Constructor + constructor(generator) { + this.generator = generator; + } + + // Copy the template ignoring the templates files, those that starts with _ character + copyIgnoringTemplateFiles(srcFolder, dstFolder) { + this.generator.fs.copy( + this.generator.templatePath(srcFolder), + this.generator.destinationPath(dstFolder), + { + globOptions: { + ignore: ["**/_*.*", ...ignoredLanguages] + } + } + ); + } + + // Copy the templates files passing the attributes of the new skill + copyTemplateFiles(srcFolder, dstFolder, newSkill) { + this.loadTemplatesFiles(newSkill); + templateFiles.forEach((dstFile, srcFile) => { + this.generator.fs.copyTpl( + this.generator.templatePath(srcFolder, srcFile), + this.generator.destinationPath(dstFolder, dstFile), + newSkill + ); + }); + } + + selectLanguages(languages) { + selectedLanguages = languages; + // Take all the languages that will be ignored + ignoredLanguages = allLanguages + .filter(language => { + return !selectedLanguages.includes(language); + }) + .map(language => { + return this.pathToLUFolder(language); + }); + + // Add the paths of the deployment languages + selectedLanguages.forEach(language => { + templateFiles.set( + path.join(`deployment`, `resources`, `LU`, language, `general.lu`), + path.join(`deployment`, `resources`, `LU`, language, `general.lu`) + ); + }); + } + + // Here you have to add the paths of your templates files + loadTemplatesFiles(newSkill) { + templateFiles.set(`_package.json`, `package.json`); + templateFiles.set(`_.gitignore`, `.gitignore`); + templateFiles.set(`_.npmrc`, `.npmrc`); + templateFiles.set( + path.join(`src`, `bots`, `_dialogBot.ts`), + path.join(`src`, `bots`, `dialogBot.ts`) + ); + templateFiles.set( + path.join(`src`, `dialogs`, `_mainDialog.ts`), + path.join(`src`, `dialogs`, `mainDialog.ts`) + ); + templateFiles.set( + path.join(`src`, `dialogs`, `_skillDialogBase.ts`), + path.join(`src`, `dialogs`, `skillDialogBase.ts`) + ); + templateFiles.set( + path.join(`src`, `adapters`, `_customSkillAdapter.ts`), + path.join(`src`, `adapters`, `customSkillAdapter.ts`) + ); + selectedLanguages.forEach(language => { + templateFiles.set( + path.join(`deployment`, `resources`, `LU`, language, `_skill.lu`), + path.join(`deployment`, `resources`, `LU`, language, `${newSkill.skillName}.lu`) + ); + }); + } + + pathToLUFolder(language) { + // Return path.join(`**`,`LU`, language, `*`); + return path.join(`**`, language, `*.*`); + } +} + +exports.Copier = Copier; diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/_.gitignore b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/_.gitignore new file mode 100644 index 0000000000..105e7776fc --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/_.gitignore @@ -0,0 +1,11 @@ +# node.js dependencies folder +node_modules/ + +# Generated folder by build process +lib/ + +# Environment variables +.env.* + +# Bot Files +*.bot \ No newline at end of file diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/_.npmrc b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/_.npmrc new file mode 100644 index 0000000000..26f0e30032 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/_.npmrc @@ -0,0 +1,2 @@ +registry=https://botbuilder.myget.org/F/aitemplates/npm/ +always-auth=false \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/_package.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/_package.json similarity index 51% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/_package.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/_package.json index 335e266eb1..cb24e0a693 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/_package.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/_package.json @@ -1,8 +1,8 @@ { - "name": "<%= name %>", + "name": "<%= skillName %>", "version": "1.0.0", - "description": "<%= description %>", - "author": "Microsoft Bot Framework Team", + "description": "<%= skillDescription %>", + "author": "", "license": "MIT", "main": "lib/index.js", "scripts": { @@ -10,25 +10,32 @@ "copy-templates": "copyfiles --up 1 \"./src/**/*.json\" \"./lib\"", "prebuild": "npm run lint", "build": "tsc --p tsconfig.json && npm run copy-templates", - "postinstall": "npm run build", + "postinstall": "npm run build && node ./deployment/webConfigPrep.js", "lint": "tslint -t vso ./src/**/*.ts", - "start": "npm run build && node ./lib/index.js", - "watch": "nodemon ./lib/index.js", + "lint-fix": "tslint --fix ./src/**/*.ts", + "start": "npm run build && node ./lib/index.js NODE_ENV=development", + "watch": "nodemon ./lib/index.js NODE_ENV=development", "test": "mocha ./test/" }, "dependencies": { + "@microsoft/microsoft-graph-client": "^1.3.0", + "@microsoft/microsoft-graph-types": "^1.5.0", "applicationinsights": "^1.0.4", - "bot-solution": "^1.0.0", - "botbuilder": "^4.2.1", - "botbuilder-ai": "^4.2.1", - "botbuilder-azure": "4.2.1", - "botbuilder-core": "^4.2.1", - "botbuilder-dialogs": "^4.2.1", - "botframework-config": "^4.2.1", - "botframework-schema": "^4.2.1", + "azure-cognitiveservices-contentmoderator": "^4.0.0", + "botbuilder": "4.3.4", + "botbuilder-ai": "4.3.4", + "botbuilder-azure": "4.3.4", + "botbuilder-core": "4.3.4", + "botframework-connector": "4.3.4", + "botbuilder-dialogs": "4.3.4", + "botframework-config": "4.3.4", + "botframework-schema": "4.3.4", + "botbuilder-skills": "4.3.4", + "botbuilder-solutions": "4.3.4", "dotenv": "^6.0.0", "i18next": "^15.0.6", - "i18next-node-fs-backend":"^2.1.1", + "i18next-node-fs-backend": "^2.1.1", + "mocha": "^6.1.4", "ms-rest-azure": "^2.5.0", "restify": "^7.2.1" }, @@ -38,9 +45,9 @@ "@types/i18next-node-fs-backend": "^0.0.30", "@types/node": "^10.10.1", "@types/restify": "^7.2.4", - "mocha": "^5.2.0", - "nock": "^10.0.6", "copyfiles": "^2.1.0", + "nock": "^10.0.6", + "nodemon": "^1.18.4", "replace": "^1.0.0", "rimraf": "^2.6.2", "tslint": "^5.12.1", diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/de/_skill.lu b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/de/_skill.lu similarity index 91% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/de/_skill.lu rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/de/_skill.lu index 4cefdb999d..8e712b35ef 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/de/_skill.lu +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/de/_skill.lu @@ -9,4 +9,4 @@ - Hallo - Hallo - logout -- Goodbye +- Goodbye \ No newline at end of file diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/de/general.lu b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/de/general.lu new file mode 100644 index 0000000000..5a933de202 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/de/general.lu @@ -0,0 +1,522 @@ +> # Intent definitions + +## Cancel +- Abbrechen +- App stornieren +- Absage +- Absagen +- Streichung nie +- Absage +- Abgebrochen +- abgebrochen +- Nichts tun +- Tu das nicht +- Das nicht mehr tun +- Vergessen Sie es +- Gehen Sie weg +- Nur absagen +- Nur absagen +- Nervendenken +- Vergessen Sie es +- Egal, absagen +- Nichts dagegen, dass +- Keine Absage +- Keine Kündigung +- Kein Absagen +- Kein Absagen, dass +- Keine Ahnung +- Keine Absage +- Kein Absagen +- Nichts egal +- Nichts bitte +- oh absagen +- Oh nicht, dass +- Bitte nichts tun +- Beenden +- Tut mir leid, nicht + + +## Confirm +- Bestätigen +- Tu es +- Ende +- Für die +- Großartig +- Ich bin mir sicher +- Es ist in Ordnung +- Keine Zweifel +- Natürlich +- Oh ja +- Oh ja +- Okay +- OK für jetzt +- Okay +- perfekt +- Perfektes Dankeschön +- Richting +- Richtig ja +- Klingt gut +- Hört sich gut an +- Klingt gut +- Hört sich gut an +- Klingt großartig +- Klingt perfekt +- Sicher +- Sicher tut +- Sicher ist +- Sicher Sache +- Ja, ja +- Vielen Dank +- Danke ja +- Das ist richtig +- Das ist richtig +- Das Recht +- Das klingt gut +- Das ist in Ordnung +- Das ist gut +- Sehr gut +- Bereits +- Ja +- Ja Liebling +- Ja bro +- Ja, Kumpel +- Ja cool +- Ja voran +- Ja, los geht es +- Ja gut +- Ja + + +## Escalate +- Kann ich mit einer Person sprechen +- Kontaktaufnahme +- Kontakt zum Kundendienst +- Kundenservice +- Menschliche Dienste +- Ich brauche manuellen Kundenservice +- Ich brauche echte menschliche Hilfe +- Ich brauche Unterstützung +- Ich möchte mit einem Menschen sprechen +- Ich möchte mit einem echten Menschen sprechen +- Gibt es jemanden, mit dem ich sprechen kann +- Gibt es einen echten Menschen +- Gibt es eine echte Person +- Sprechen Sie mit einem Menschen + + +## FinishTask +- Alles fertig +- Alles gesetzt +- fertig +- Beenden +- Fertig +- Fertig mit +- Ich bin fertig +- Ich bin fertig +- Es endete +- Es ist geschafft +- Es ist fertig +- Nur nur sein +- Senden +- Einreichen + + +## GoBack +- Zurück +- Bitte zurück +- Zurück zu +- Zurück zum letzten +- Zurück zum letzten Schritt +- Ich melde mich wieder +- Bitte melden Sie sich +- Endlich wieder +- Zurück +- Zurück +- Gehen Sie bitte zurück +- Zurück zu +- Letzter Schritt +- No go back to +- No no go back to +- Bitte zurück +- Rückgabe + + +## Help +- Jede Hilfe +- Können Sie helfen +- Kannst du mir helfen +- Geben Sie mir Hilfe +- Hilfe +- Wie bekomme ich es +- Wie es geht +- Ich brauche Hilfe +- Ich brauche ein wenig Hilfe +- Ich brauche Hilfe +- Gibt es Hilfe +- Offene Hilfe +- Bitte helfen +- Einige Hilfe +- Wer kann mir helfen + +## Logout +- Unterschrift +- Vergesst mich +- Unterschreiben +- logout +- Log-out + +## None +- Alle +- Ich will sie alle +- Ich möchte sie alle + + +## ReadAloud +- Können Sie es lesen +- Können Sie lesen, dass +- Können Sie das für mich lesen +- Können Sie Seite laut lesen +- Könntest du mir sagen, was das sagt +- Details laut +- Ich lese das für mich +- Ich muss diese Seite hören +- Ich möchte, dass Sie das für mich lesen +- Lesen Sie diese Seite +- Lesen Sie +- Lesen Sie es +- Lesen Sie mir bitte die Seite +- Lesen Sie bitte meine neueste E-Mail +- Lesen Sie hier +- Bitte lesen Sie das laut +- Lesen Sie bitte diese Seite +- Bitte lesen Sie diese Seite laut +- Bitte lesen Sie diese Seite laut aus +- Lesen Sie das mir +- Lesen Sie alle auf dem Bildschirm zu mir +- Vorlesen +- Den aktuellen Text auf dem Bildschirm vorlesen +- Vorlesen Sie die Akte laut +- Lesen Sie es +- Vorlesen +- Lesen Sie es laut +- Lesen Sie es auslaut +- Lesen Sie es bitte +- Lesen Sie es mir +- Lesen Sie mir diese Seite +- Lesen Sie meine Liste +- Vorlesen vorlesen +- Leseseite +- Seite laut lesen +- Seite lesen +- Satz laut vorgelesen +- Text gelesen +- Text laut gelesen +- Lesen Sie, dass +- Lesen Sie das laut +- Lesen Sie die Seite +- Lesen Sie die Seite auf dem Bildschirm zu mir +- Die Seite laut vorlesen +- Lesen Sie die Seite zu mir +- Text zu mir lesen +- Lesen Sie die Wörter auf dieser Seite +- Lesen Sie das bitte für mich +- Lesen Sie diese Seite +- Lesen Sie diese Seite laut +- Diese Seite laut vorlesen +- Lesen Sie diese Seite zu mir +- Lesen Sie mir +- Lesen Sie, was mir gerade auf dem Bildschirm steht +- Sprechen Sie von dem, was auf dieser Seite ist +- Lesen Sie damit +- Erzähl mir die Informationen auf dem Bildschirm +- Sagen Sie mir den aktuellen Text auf dem Bildschirm +- Vokalisieren Sie, was s auf der Seite +- Was sagt die Seite +- Ich bitte Sie, das für mich zu lesen +- Würdest du das laut lesen bitte +- Das würden Sie mir bitte vorlesen + + +## Reject +- Ich mag es nicht +- Ich lehne ab +- Negative +- Nie +- Nein +- Nein, das will ich nicht +- Spätestens +- Kein Abschied +- Nicht mehr nein +- Oh nein +- Im Nein auf der +- Nein danke +- Nein, das nicht +- Keine Ablehnung +- Nein, danke +- Nein, danke +- Auf keinen Fall +- Kein Unrecht +- Nein +- Nicht +- Überhaupt nicht +- Nicht einmal nah +- Nicht genau +- Jetzt nicht +- Nicht ganz +- Nicht erst jetzt +- Nicht das +- Nicht viel +- Oh nein +- Ablehnen +- Absage + + +## Repeat +- Wieder +- Könntest du es noch einmal sagen +- Ich hörte nicht wieder +- Ich habe nicht gehört +- Entschuldigung +- Wiederholen +- Wiederholung bitte +- Wiederholen Sie das +- Sag noch einmal +- Sagen Sie bitte noch einmal +- Sagen Sie das noch einmal +- Tut mir Leid +- Was +- Was hast du gesagt +- Was war das wieder + + +## SelectAny +- Eins davon +- Jeder ist ok +- Jeder ist in Ordnung +- Etwas +- Wählen Sie jemanden +- Wählen Sie einen von ihm zufällig aus +- Entscheiden Sie sich für einen zufälligen +- Entscheiden Sie sich für irgendetwas +- Wählen Sie eine Zufallswahl aus +- Wählen Sie einen Zufallsfall aus +- Wählen Sie eine +- Wählen Sie jede Wahl +- Wählen Sie eine davon aus + + +## SelectItem +- Letzter wählen +- Wählen Sie die letzte +- Wählen Sie Nr. 2 +- Wählen Sie die {DirectionalReference=Unten links} +- Die erste Wahl treffen +- Wählen Sie die vierte +- Wählen Sie die {DirectionalReference=Oben links} Wahl +- Wählen Sie die {DirectionalReference=Oben rechts} Eine +- Wählen {DirectionalReference=Oben rechts} +- Wählen {DirectionalReference=Oben rechts} Eine +- Ich mag {DirectionalReference=Links} Eine +- Ich mag zweite +- Ich mag den zweiten +- Ich mag die {DirectionalReference=Unteres} Eine +- Ich mag den ersten +- Ich mag den dritten +- Ich mag die dritte Wahl +- Ich mag die {DirectionalReference=Oben rechts} Eine +- Ich mag die {DirectionalReference=Oben rechts} +- Ich mag {DirectionalReference=Oben rechts} +- Ich möchte {DirectionalReference=Unteres} +- Ich will Vierter +- Ich möchte {DirectionalReference=Links} +- Ich möchte {DirectionalReference=Richting} Eine +- Ich will den ersten +- Ich will die vierte Wahl +- Ich will die {DirectionalReference=Links} +- Ich will die {DirectionalReference=Niedriger} Wahl +- Ich will die {DirectionalReference=Richting} Eine +- Ich will den zweiten +- Ich will den dritten +- Ich möchte wählen {DirectionalReference=Unteres} Eine +- Ich möchte wählen {DirectionalReference=Unteres Recht} +- Ich möchte wählen {DirectionalReference=Richting} +- Ich möchte den zweiten wählen +- Ich möchte die erste auswählen +- Ich möchte den vierten wählen +- Ich möchte die letzte Wahl treffen +- Ich möchte die {DirectionalReference=Links} Eine +- Ich möchte die {DirectionalReference=Niedriger} Wahl +- Ich möchte die {DirectionalReference=Richting} +- Ich möchte den Dritten wählen +- Entscheiden Sie sich für den ersten +- Entscheiden Sie sich für Letzte +- Entscheiden Sie sich für {DirectionalReference=Links} +- Entscheiden Sie sich für {DirectionalReference=Richting} Eine +- Entscheiden Sie sich für den letzten +- Entscheiden Sie sich für die {DirectionalReference=Links} Eine +- Entscheiden Sie sich für die {DirectionalReference=Niedriger} Wahl +- Entscheiden Sie sich für die {DirectionalReference=Richting} +- Entscheiden Sie sich für die zweite +- Für die zweite Wahl entscheiden +- Wählen Sie den vierten +- Auswählen {DirectionalReference=Niedriger} Eine +- Wählen Sie Nr. 5 +- Wählen Sie die {DirectionalReference=Unteres} Wahl +- Wählen Sie die erste +- Die letzte Wahl wählen +- Wählen Sie die {DirectionalReference=Niedriger} Eine +- Wählen Sie die {DirectionalReference=Richting} Eine +- Wählen Sie die dritte +- Wählen Sie die {DirectionalReference=Oben rechts} +- Dritter auswählen +- Auswählen {DirectionalReference=Oberen} +- Was ist mit dem letzten +- Was ist mit dem dritten + + +## SelectNone +- Ich möchte keinen wählen +- Ich möchte keine auswählen +- Ich will keines von beiden +- Ich will keine von ihnen +- Weder +- Keine davon +- Weder +- Weder einer von ihnen +- Weder danke +- nichts +- Keine +- Keiner von ihnen +- Nichts davon +- Keiner von ihnen dankt +- Nichts davon +- Nichts davon +- Sie sehen schlecht aus, können Sie mir andere Möglichkeiten geben + + +## ShowNext +- Und danach +- Anzeige mehr +- Displays mehr +- Geben Sie mir mehr +- Vorwärts +- Zum nächsten +- Gehen Sie zu den nächsten drei Punkten +- Ich muss zum nächsten +- Ich will mehr +- Mehr +- Zum nächsten +- nächster +- Mehr verraten +- Zeigt mir den Nächsten +- Mehr zeigen +- Zeigen Sie die nächsten 3 +- Die nächsten 4 Artikel anzeigen +- Zeigen Sie die nächste +- Die nächsten zwei Optionen anzeigen +- Mehr sagen +- Mehr sagen +- Was ist mit dem nächsten +- Was danach +- Was danach kommt +- Mehr dazu +- Was kommt als nächstes +- Was ist die nächste 2 +- Was kommt als nächstes + + +## ShowPrevious +- Zurück zum letzten +- Die vorherige mitbringen +- Anzeige vorher +- Zurück zum letzten +- Zurück zum letzten +- Zurück zum vorherigen +- Zurück zum letzten +- Gehen Sie vorher +- Zum vorherigen +- Zum vorherigen +- Voriges +- Vorigen bitte +- Zurück zum vorherigen +- Offenbaren +- Offenlegung zuvor +- Show früher +- Zeigen Sie mir die vorherige +- Show previous +- Zeigen Sie die vorherige +- Was davor +- Was ist die vorherige +- Was ist da + + +## StartOver +- Klar und wieder starten +- Könntest du es überfängt +- Bitte wieder anfangen +- Neu starten +- Neustart +- Wieder starten +- Start +- Start von vorn +- Anfangen +- Ein neues Kapitel aufschlagen + + +## Stop +- Baby einfach nur ruhig sein +- Sei still +- Seien Sie jetzt ruhig +- Kommen Sie zum Halt +- Entlassen +- Ende +- Ende +- Ausstieg +- Ausreise-Stopp +- Gott verschlossen +- Hey Stop +- Ich liebe dich, nicht mehr zu reden +- Ich meine, aufhören zu hören +- Ich sagte Halt +- Nur ruhig sein +- Mein Gott verschlossen +- Egal, halt +- Nicht ruhig sein +- Jetzt nicht ruhig sein +- No no no no no no no no no no no no not not halt to talking +- Keine Schließung +- Kein Halt +- Niemand interessiert sich nicht mehr zu reden +- Nirgendwo nur ruhig sein +- ach mein Gott verschlossen +- ok Stop +- ruhig +- Jetzt ruhig +- Halten Sie die Klappe +- Halt den Mund +- Abschalten ruhig +- Schweigen +- Mund zu +- Halten Sie bitte an +- hör auf zu reden +- Ausschalten +- Haltestelle abbiegen + + +> # Entity definitions + +$DirectionalReference:simple + + +> # PREBUILT Entity definitions + +$PREBUILT:number + +$PREBUILT:ordinal + + +> # Phrase list definitions + + +> # List entities + diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/en/_skill.lu b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/en/_skill.lu similarity index 100% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/en/_skill.lu rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/en/_skill.lu diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/en/general.lu b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/en/general.lu new file mode 100644 index 0000000000..c7555a5016 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/en/general.lu @@ -0,0 +1,521 @@ +> # Intent definitions + +## Cancel +- cancel +- cancel app +- cancel cancel +- cancel it +- cancel never mind +- cancel that +- canceled +- cancelled +- do nothing +- don't do that +- don't do that anymore +- forget about it +- go away +- just cancel +- just cancel it +- nerver mind +- never mind +- never mind cancel +- never mind cancel that +- no cancel +- no cancel cancel +- no cancel it +- no cancel that +- no never mind +- no no cancel +- no no cancel it +- nothing never mind +- nothing please +- oh cancel +- oh don't do that +- please do nothing +- quit +- sorry, don't do it + + +## Confirm +- confirm +- do it +- fine +- go for it +- great +- i'm sure +- it's fine +- no doubt +- of course +- oh yeah +- oh yes +- ok +- ok for now +- okay +- perfect +- perfect thank you +- right +- right yes +- sounds good +- sounds good thank you +- sounds good thanks +- sounds good to me +- sounds great +- sounds perfect +- sure +- sure does +- sure is +- sure thing +- sure yes +- thank you very much +- thank you yes +- that is correct +- that is right +- that right +- that sounds good +- that's fine +- this is good +- very good +- ya +- yeah +- yeah baby +- yeah bro +- yeah buddy +- yeah cool +- yeah go ahead +- yeah go for it +- yeah good +- yes + + +## Escalate +- can i talk to a person +- contact support +- contact the customer service +- customer service +- human service +- i need manual customer service +- i need real human help +- i need support +- i want to talk to a human +- i want to talk to a real human +- is there any person i can talk to +- is there any real human +- is there any real person +- talk to a human + + +## FinishTask +- all finished +- all set +- done +- finish +- finished +- finished with +- i am done +- i am finished +- it finished +- it's done +- it's finished +- just be +- submit +- submit it + + +## GoBack +- back +- back please +- back to +- back to last +- back to last step +- get back +- get back please +- get back to last +- go back +- go back on +- go back please +- go back to +- last step +- no go back to +- no no go back to +- please return +- return + + +## Help +- any help +- can you help +- can you help me +- give me some help +- help +- how can i get it +- how to do it +- i need help +- i need some assist +- i need some help +- is there any help +- open help +- please help +- some help +- who can help me + +## Logout +- signout +- forget me +- sign out +- logout +- log out + +## None +- all of them +- i want them all +- i want to all of them + + +## ReadAloud +- can you read it +- can you read that +- can you read that for me +- can you you read page aloud +- could you tell me what that says +- detail aloud what that says +- hey read that for me +- i need to hear this page +- i would like you to read that for me +- make a reading of this page +- please read +- please read it +- please read me the page +- please read my latest email +- please read this +- please read this out loud +- please read this page +- please read this page aloud +- please read this page out loud +- please read this to me +- read all on the screen to me +- read aloud +- read aloud the current text onscreen +- read file aloud +- read it +- read it aloud +- read it out loud +- read it outloud +- read it please +- read it to me +- read me this page +- read my to list +- read outloud +- read page +- read page aloud +- read page outloud +- read sentence out loud +- read text +- read text aloud +- read that +- read that out loud +- read the page +- read the page onscreen to me +- read the page out loud +- read the page to me +- read the text to me +- read the words on this page +- read this for me please +- read this page +- read this page aloud +- read this page out loud +- read this page to me +- read to me +- read what is currently on the screen to me +- speak of what is on this page +- start reading this +- tell me about the information on the screen +- tell me the current text on screen +- vocalize what s on the page +- what does the page say +- would you please read that for me +- would you read that out loud please +- would you read that to me please + + +## Reject +- i don't like it +- i reject +- negative +- never +- no +- no i don't want that +- no later +- no leave it +- no more no +- no no +- no no no +- no no thank you +- no not that one +- no reject it +- no thank you +- no thanks +- no way +- no wrong +- nope +- not +- not at all +- not even close +- not exactly +- not now +- not quite +- not right now +- not that +- nothing much +- oh no +- reject +- reject it + + +## Repeat +- again +- could you say it again +- i didn't hear repeat again +- i have not heard +- pardon +- repeat +- repeat please +- repeat that +- say again +- say again please +- say that again +- sorry +- what +- what did you say +- what was that again + + +## SelectAny +- any of it +- any one is ok +- anyone is fine +- anything +- choose anyone +- choose one of it randomly +- opt for a random one +- opt for any of it +- select a random choice +- select a random one +- select any +- select any choice +- select any of it + + +## SelectItem +- choose last +- choose last one +- choose no.2 +- choose the {DirectionalReference=bottom left} +- choose the first choice +- choose the fourth one +- choose the {DirectionalReference=upper left} choice +- choose the {DirectionalReference=upper right} one +- choose {DirectionalReference=top right} +- choose {DirectionalReference=top right} one +- i like {DirectionalReference=left} one +- i like second +- i like second one +- i like the {DirectionalReference=bottom} one +- i like the first one +- i like the third +- i like the third choice +- i like the {DirectionalReference=top right} one +- i like the {DirectionalReference=upper right} +- i like {DirectionalReference=upper right} +- i want {DirectionalReference=bottom} +- i want fourth +- i want {DirectionalReference=left} +- i want {DirectionalReference=right} one +- i want the first +- i want the fourth choice +- i want the {DirectionalReference=left} +- i want the {DirectionalReference=lower} choice +- i want the {DirectionalReference=right} one +- i want the second one +- i want third one +- i want to choose {DirectionalReference=bottom} one +- i want to choose {DirectionalReference=lower right} +- i want to choose {DirectionalReference=right} +- i want to choose second one +- i want to choose the first one +- i want to choose the fourth +- i want to choose the last choice +- i want to choose the {DirectionalReference=left} one +- i want to choose the {DirectionalReference=lower} choice +- i want to choose the {DirectionalReference=right} +- i want to choose third +- opt for first one +- opt for last +- opt for {DirectionalReference=left} +- opt for {DirectionalReference=right} one +- opt for the last one +- opt for the {DirectionalReference=left} one +- opt for the {DirectionalReference=lower} choice +- opt for the {DirectionalReference=right} +- opt for the second +- opt for the second choice +- select fourth one +- select {DirectionalReference=lower} one +- select no.5 +- select the {DirectionalReference=bottom} choice +- select the first +- select the last choice +- select the {DirectionalReference=lower} one +- select the {DirectionalReference=right} one +- select the third one +- select the {DirectionalReference=upper right} +- select third +- select {DirectionalReference=upper} +- what about the last +- what about the third one + + +## SelectNone +- i don't want to choose any one +- i don't want to select any one +- i want neither of them +- i want none of them +- neither +- neither of those +- neither one +- neither one of them +- neither thank you +- none +- none none +- none none of them +- none of them +- none of them thank you +- none of these +- none of those +- they look bad, can you give me other choices + + +## ShowNext +- and after that +- display more +- displays more +- give me more +- go forward +- go to the next one +- go to the next three items +- i need to go to the next one +- i want more +- more +- move to the next one +- next +- reveal more +- show me the next +- show more +- show the next 3 +- show the next 4 items +- show the next one +- show the next two options +- tell me more +- tell more +- what about next one +- what after that +- what's after that +- what's more +- what's next +- what's the next 2 +- what's up next + + +## ShowPrevious +- back to the last one +- bring the previous one +- display previously +- get back to the last one +- go back to last one +- go back to previous +- go back to the last one +- go previously +- go to the previous +- go to the previous one +- previous one +- previous one please +- return to the previous one +- reveal previous +- reveal previously +- show earlier +- show me the previous one +- show previous +- show the previous one +- what before that +- what is the previous +- what's before that + + +## StartOver +- clear and start again +- could you start it over +- please begin again +- restart +- restart it +- start again +- start it over +- start over +- start over it +- turn over a new leaf + + +## Stop +- baby just be quiet +- be quiet +- be quiet now +- come on stop +- dismiss +- end +- end it +- exit exit +- exit stop +- god shut up +- hey stop +- i love you to stop talking +- i mean stop listening +- i said stop +- just be quiet +- my god shut up +- never mind stop +- no be quiet +- no be quiet now +- no no no no stop talking +- no shut up +- no stop +- nobody cares stop talking +- nowhere just be quiet +- oh my god shut up +- ok stop stop +- quiet +- quiet now +- shut the fuck up +- shut up +- shut up be quiet +- shut up quiet +- shut your mouth +- stop please +- stop talking +- turn off +- turn off stop + + +> # Entity definitions + +$DirectionalReference:simple + + +> # PREBUILT Entity definitions + +$PREBUILT:number + +$PREBUILT:ordinal + + +> # Phrase list definitions + + +> # List entities \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/es/_skill.lu b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/es/_skill.lu similarity index 93% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/es/_skill.lu rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/es/_skill.lu index 4d5f2323f7..156ed649bf 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/es/_skill.lu +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/es/_skill.lu @@ -9,4 +9,4 @@ - Hola - Hola - Cerrar sesión -- Adiós +- Adiós \ No newline at end of file diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/es/general.lu b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/es/general.lu new file mode 100644 index 0000000000..ef03696138 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/es/general.lu @@ -0,0 +1,522 @@ +> # Intent definitions + +## Cancel +- Cancelar +- cancelar aplicación +- cancelar cancelar +- cancelarlo +- cancelar no importa +- cancelar que +- Cancelado +- Cancelado +- no hacer nada +- No hagas eso +- no hagas eso ya +- Olvídalo +- Vete +- simplemente cancelar +- simplemente cancelarlo +- Mente de los nervios +- Olvídalo +- no importa cancelar +- no importa cancelar que +- no cancelar +- no cancelar cancelar +- no cancelarlo +- no cancelar que +- no no importa +- no no cancelar +- no no cancelarlo +- nada no importa +- nada por favor +- Oh cancelar +- Oh no hagas eso +- por favor no hacer nada +- Dejar +- lo siento, no lo hagas + + +## Confirm +- Confirmar +- Hazlo +- Final +- ir a por ello +- Gran +- Estoy seguro +- Está bien +- Sin duda +- Claro +- Venga, sí +- Venga, sí +- Vale +- OK por ahora +- Bien +- Perfecto +- perfecto gracias +- Correcto +- derecho sí +- Suena bien +- suena bien gracias +- suena bien gracias +- me suena bien +- Excelente +- suena perfecto +- Seguro +- seguro que no +- seguro es +- Claro +- seguro que sí +- Muchas gracias +- Gracias sí +- que es correcto +- que es correcto +- ese derecho +- que suena bien +- Está bien +- Está bueno +- Muy bien +- ya +- Sí +- Sí bebé +- sí bro +- sí amigo +- sí fresco +- sí adelante +- sí ir a por ello +- sí bueno +- Sí + + +## Escalate +- puedo hablar con una persona +- Contactar con el soporte +- Contacte con el servicio al cliente +- servicio al cliente +- servicio humano +- necesito servicio al cliente manual +- necesito ayuda humana real +- necesito apoyo +- Quiero hablar con un humano +- Quiero hablar con un humano real +- ¿Hay alguna persona con la que pueda hablar +- ¿Hay algún humano real +- ¿Hay alguna persona real +- hablar con un humano + + +## FinishTask +- todo terminado +- Todo listo +- Hecho +- Terminar +- Terminado +- terminado con +- Estoy hecho +- Estoy acabado +- terminó +- Está hecho +- ha terminado +- sólo ser +- Enviar +- enviarlo + + +## GoBack +- Atrás +- volver por favor +- volver a +- volver al último +- volver al último paso +- Vuelve +- volver por favor +- volver al último +- Volver +- volver a +- volver por favor +- volver a +- último paso +- no volver a +- no no volver a +- por favor regrese +- devolución + + +## Help +- cualquier ayuda +- puede ayudar a +- Me puedes ayudar +- Dame un poco de ayuda +- Ayuda +- ¿Cómo puedo conseguirlo +- Cómo hacerlo +- Necesito ayuda +- necesito ayuda +- necesito ayuda +- ¿Hay alguna ayuda +- abrir ayuda +- por favor ayuda +- algo de ayuda +- que me puede ayudar + +## Logout +- SignOut +- me olvido +- cerrar sesión +- Cerrar sesión +- cerrar sesión + +## None +- todos ellos +- Quiero todos ellos +- Quiero a todos ellos + + +## ReadAloud +- puede leerlo +- puede leer que +- ¿Puedes leer eso para mí +- ¿puede usted leer la página en voz alta +- ¿podría decirme lo que dice +- detalle en voz alta lo que dice +- He y leído que para mí +- necesito escuchar esta página +- me gustaría que usted lea que para mí +- hacer una lectura de esta página +- por favor, lea +- por favor, léalo +- por favor, Léeme la página +- por favor lea mi último correo electrónico +- por favor lea este +- por favor lea esto en voz alta +- por favor lea esta página +- por favor lea esta página en voz alta +- por favor, lea esta página en voz alta +- por favor, Léeme esto +- leer todo en la pantalla para mí +- leer en voz alta +- leer en voz alta el texto actual en pantalla +- Leer archivo en voz alta +- Léelo +- leerlo en voz alta +- leerlo en voz alta +- leerlo Outloud +- leerlo por favor +- Léelo a mí +- leer me esta página +- leer mi lista +- leer Outloud +- Página de lectura +- leer la página en voz alta +- leer la página Outloud +- leer la oración en voz alta +- Leer texto +- Leer texto en voz alta +- leer que +- leer que en voz alta +- leer la página +- leer la página en pantalla para mí +- leer la página en voz alta +- leer la página para mí +- leer el texto para mí +- leer las palabras en esta página +- leer esto para mí por favor +- leer esta página +- leer esta página en voz alta +- leer esta página en voz alta +- leer esta página para mí +- leer a mí +- leer lo que está actualmente en la pantalla para mí +- hablar de lo que está en esta página +- empezar a leer este +- Cuéntame sobre la información en la pantalla +- dime el texto actual en la pantalla +- vocalizar lo que s en la página +- ¿Qué dice la página +- ¿podría por favor leer eso para mí +- ¿leería eso en voz alta por favor +- ¿me lo lees por favor + + +## Reject +- No me gusta +- i rechazar +- Negativo +- Nunca +- no +- no, yo no quiero que +- no más tarde +- no dejarlo +- no más no +- no no +- En el no en el +- no no gracias +- no no que uno +- no rechazarlo +- No, gracias +- No, gracias +- No es posible +- no está mal +- No +- No +- De nada +- ni siquiera cerca +- No exactamente +- Ahora no +- no muy +- no en este momento +- no es que +- Nada del otro mundo +- No +- Rechazar +- rechazarlo + + +## Repeat +- Otra vez +- ¿podría decirlo de nuevo +- Yo no oí repetir de nuevo +- no he escuchado +- Disculpa +- Repetir +- repetir por favor +- repetir que +- Cómo +- decir otra vez por favor +- decir que de nuevo +- Lo siento +- Qué +- Qué has dicho +- ¿Qué fue eso de nuevo + + +## SelectAny +- cualquiera de ella +- cualquier uno está bien +- alguien está bien +- Nada +- elegir a cualquiera +- elegir uno de ellos al azar +- optar por uno aleatorio +- optar por cualquiera de ellos +- seleccionar una opción aleatoria +- seleccionar uno aleatorio +- Seleccione cualquier +- Seleccione cualquier opción +- seleccionar cualquiera de ellos + + +## SelectItem +- elegir último +- elegir último uno +- Elija no. 2 +- Elija el {DirectionalReference=abajo a la izquierda} +- elegir la primera opción +- elegir el cuarto uno +- Elija el {DirectionalReference=arriba a la izquierda} Elección +- Elija el {DirectionalReference=arriba a la derecha} Una +- Elegir {DirectionalReference=arriba a la derecha} +- Elegir {DirectionalReference=arriba a la derecha} Una +- Me gusta {DirectionalReference=Izquierda} Una +- me gusta segundo +- me gusta segundo uno +- me gusta el {DirectionalReference=Parte inferior} Una +- me gusta el primero +- me gusta la tercera +- me gusta la tercera opción +- me gusta el {DirectionalReference=arriba a la derecha} Una +- me gusta el {DirectionalReference=arriba a la derecha} +- Me gusta {DirectionalReference=arriba a la derecha} +- Quiero {DirectionalReference=Parte inferior} +- Quiero cuarto +- Quiero {DirectionalReference=Izquierda} +- Quiero {DirectionalReference=Correcto} Una +- Quiero la primera +- Quiero la cuarta opción +- Quiero que el {DirectionalReference=Izquierda} +- Quiero que el {DirectionalReference=Inferior} Elección +- Quiero que el {DirectionalReference=Correcto} Una +- Quiero que el segundo +- Quiero tercer uno +- Quiero elegir {DirectionalReference=Parte inferior} Una +- Quiero elegir {DirectionalReference=abajo a la derecha} +- Quiero elegir {DirectionalReference=Correcto} +- Quiero elegir un segundo +- Quiero elegir el primero +- Quiero elegir el cuarto +- Quiero elegir la última opción +- Quiero elegir el {DirectionalReference=Izquierda} Una +- Quiero elegir el {DirectionalReference=Inferior} Elección +- Quiero elegir el {DirectionalReference=Correcto} +- Quiero elegir tercero +- optar por primero uno +- optar por el último +- optar por {DirectionalReference=Izquierda} +- optar por {DirectionalReference=Correcto} Una +- optar por el último +- optar por el {DirectionalReference=Izquierda} Una +- optar por el {DirectionalReference=Inferior} Elección +- optar por el {DirectionalReference=Correcto} +- optar por el segundo +- optar por la segunda opción +- seleccionar cuarto uno +- Seleccione {DirectionalReference=Inferior} Una +- Seleccione no. 5 +- Seleccione la {DirectionalReference=Parte inferior} Elección +- Seleccione la primera +- Seleccione la última opción +- Seleccione la {DirectionalReference=Inferior} Una +- Seleccione la {DirectionalReference=Correcto} Una +- Seleccione la tercera +- Seleccione la {DirectionalReference=arriba a la derecha} +- seleccionar tercero +- Seleccione {DirectionalReference=Superior} +- ¿Qué pasa con la última +- ¿Qué pasa con el tercero + + +## SelectNone +- no quiero elegir uno +- no quiero seleccionar uno +- Quiero ninguno de ellos +- Quiero ninguno de ellos +- Ni +- ninguno de los +- ni uno +- ni uno de ellos +- ni gracias +- Ninguno +- Ninguno Ninguno +- Ninguno Ninguno de ellos +- ninguno de ellos +- ninguno de ellos gracias +- ninguno de estos +- ninguno de los +- se ven mal, ¿puedes darme otras opciones + + +## ShowNext +- y después de eso +- Mostrar más +- muestra más +- Dame más +- seguir adelante +- ir a la siguiente +- ir a los siguientes tres artículos +- necesito ir a la siguiente +- Quiero más +- Más +- pasar a la siguiente +- próximo +- revelar más +- Muéstrame el siguiente +- Mostrar más +- Mostrar los próximos 3 +- Mostrar los siguientes 4 artículos +- Mostrar el siguiente +- Mostrar las siguientes dos opciones +- Cuéntame más +- decir más +- ¿Qué hay de la próxima +- lo que después de que +- lo que está después de que +- lo que es más +- lo que sigue +- ¿Cuál es el próximo 2 +- ¿Qué pasa después + + +## ShowPrevious +- volver a la última +- traer el anterior +- Mostrar previamente +- volver a la última +- volver a la última +- volver a la anterior +- volver a la última +- ir previamente +- ir a la anterior +- ir a la anterior +- uno anterior +- anterior por favor +- volver a la anterior +- revelar anterior +- revelar previamente +- Mostrar anteriormente +- Muéstrame el anterior +- Mostrar anterior +- Mostrar el anterior +- lo que antes de que +- ¿Cuál es el anterior +- lo que es antes de que + + +## StartOver +- claro y empezar de nuevo +- podría empezar más +- por favor, empiece de nuevo +- Reiniciar +- reiniciarlo +- empezar de nuevo +- iniciarlo +- empezar de más de +- empezar por encima de ella +- Dar vuelta a la página + + +## Stop +- bebé sólo estar tranquilo +- Callado +- estar tranquilo ahora +- vamos a parar +- Despedir +- Final +- terminar +- salida salida +- parada de salida +- Dios Cállate +- Hey detener +- te quiero para dejar de hablar +- me refiero a dejar de escuchar +- dije que pare +- sólo Cállate +- mi Dios Cállate +- no importa dejar de +- no sea silencioso +- no se calla ahora +- no no no no dejar de hablar +- no Cállate +- sin parar +- nadie le importa dejar de hablar +- en ninguna parte sólo estar tranquilo +- Oh mi Dios Cállate +- parada OK parada +- Tranquilo +- tranquilo ahora +- Cállate la boca +- Cállate +- Cállate silencio +- Cállate tranquilo +- Cállate la boca +- detener por favor +- dejar de hablar +- Apaga +- Apague la parada + + +> # Entity definitions + +$DirectionalReference:simple + + +> # PREBUILT Entity definitions + +$PREBUILT:number + +$PREBUILT:ordinal + + +> # Phrase list definitions + + +> # List entities + diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/fr/_skill.lu b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/fr/_skill.lu similarity index 92% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/fr/_skill.lu rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/fr/_skill.lu index 2dbc216001..9e4743d570 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/fr/_skill.lu +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/fr/_skill.lu @@ -9,4 +9,4 @@ - Salut - Salut - Déconnexion -- Au revoir +- Au revoir \ No newline at end of file diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/fr/general.lu b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/fr/general.lu new file mode 100644 index 0000000000..5a55dc1b9f --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/fr/general.lu @@ -0,0 +1,522 @@ +> # Intent definitions + +## Cancel +- Annuler +- annuler l'application +- annuler annuler +- l'annuler +- annuler jamais l'esprit +- annuler que +- Annulé +- Annulé +- ne rien faire +- Fais pas ça +- ne le fais plus +- oublier +- Allez-vous-en +- Il suffit d'annuler +- Il suffit de l'annuler +- L'esprit des nerfs +- Ça ne fait rien +- jamais l'esprit annuler +- jamais l'esprit annuler que +- pas d'annulation +- pas d'annulation annuler +- pas l'annuler +- pas annuler que +- sans jamais l'esprit +- non non annuler +- non non annuler +- rien de jamais l'esprit +- rien s'il vous plaît +- Oh annuler +- Oh ne fais pas ça +- s'il vous plaît ne rien faire +- Quitter +- Désolé, ne le faites pas + + +## Confirm +- Confirmer +- Fais-le +- Fin +- aller pour elle +- génial +- J'en suis sûr +- C'est bon +- sans doute +- Bien sûr +- Oh oui +- Oh oui +- D'accord +- OK pour l'instant +- d'accord +- Parfait +- parfait Merci +- Oui +- droit Oui +- Ça a l'air bien +- sonne bien merci +- sonne bien merci +- sonne bien pour moi +- sonne bien +- sonne parfait +- Sûr +- bien sûr ne +- est sûr +- chose sure +- bien sûr Oui +- Merci beaucoup +- Merci Oui +- qui est correct +- qui est juste +- ce droit +- qui sonne bien +- C'est très bien +- C'est bien +- Très bien +- Déjà +- Oui +- Oui chéri +- Oui Bro +- Oui copain +- Ouais cool +- Oui aller de l'avant +- Ouais aller pour elle +- Oui bon +- Oui + + +## Escalate +- puis-je parler à une personne +- Contacter le support +- Contacter le service client +- service à la clientèle +- le service humain +- J'ai besoin du service à la clientèle manuel +- J'ai besoin d'aide humaine réelle +- J'ai besoin de soutien +- Je veux parler à un humain +- Je veux parler à un vrai humain +- est-il une personne que je peux parler à +- y at-il des vrais humains +- y at-il une personne réelle +- parler à un humain + + +## FinishTask +- tous finis +- tous ensemble +- Fait +- Finir +- Fini +- fini avec +- Je suis fait +- Je suis fini +- Il a terminé +- C'est fait +- C'est fini +- juste être +- Envoyer +- le soumettre + + +## GoBack +- Précédent +- retour s'il vous plaît +- Retour à +- Retour à la dernière +- Retour à la dernière étape +- Reviens +- revenir s'il vous plaît +- revenir à la dernière +- Retour +- revenir sur +- revenir s'il vous plaît +- revenir à +- dernière étape +- pas revenir à +- pas de revenir à +- Veuillez retourner +- Retour + + +## Help +- toute aide +- pouvez-vous aider +- Est-ce que vous pouvez m'aider +- Donnez-moi de l'aide +- Aide +- Comment puis-je l'obtenir +- Comment le faire +- J'ai besoin d'aide +- J'ai besoin d'aide +- J'ai besoin d'aide +- est-il une aide +- ouvrir l'aide +- Aider, s'il vous plaît +- un peu d'aide +- qui peut m'aider + +## Logout +- SignOut +- Myosotis +- se déconnecter +- Déconnexion +- déconnexion + +## None +- Tous +- Je veux tous les +- Je veux tous les + + +## ReadAloud +- pouvez-vous le lire +- pouvez-vous lire que +- pouvez-vous lire que pour moi +- pouvez-vous lire la page à haute voix +- pourriez-vous me dire ce que dit +- détail à haute voix ce qui dit +- Hey lire que pour moi +- J'ai besoin d'entendre cette page +- Je voudrais que vous lisiez que pour moi +- faire une lecture de cette page +- s'il vous plaît lire +- s'il vous plaît le lire +- s'il vous plaît lisez-moi la page +- s'il vous plaît lire mon dernier e-mail +- s'il vous plaît lire ce +- s'il vous plaît lire à haute voix +- Veuillez lire cette page +- s'il vous plaît lire cette page à haute voix +- s'il vous plaît lire cette page à haute voix +- s'il vous plaît lire ceci pour moi +- lire tout sur l'écran pour moi +- lire à haute voix +- lire à haute voix le texte actuel à l'écran +- lire le fichier à haute voix +- le lire +- le lire à haute voix +- le lire à haute voix +- le lire Outloud +- Lire s'il vous plaît +- me le lire +- Lisez-moi cette page +- lire ma liste +- lire Outloud +- lire la page +- lire la page à haute voix +- lire la page Outloud +- lire la phrase à haute voix +- lire le texte +- lire le texte à haute voix +- lire que +- lire que à haute voix +- lire la page +- lire la page à l'écran pour moi +- lire la page à haute voix +- lire la page pour moi +- lire le texte pour moi +- lire les mots sur cette page +- lire ceci pour moi s'il vous plaît +- lire cette page +- lire cette page à haute voix +- lire cette page à haute voix +- lire cette page pour moi +- Lisez-moi +- lire ce qui est actuellement sur l'écran pour moi +- parler de ce qui est sur cette page +- commencer à lire ce +- Parlez-moi des informations sur l'écran +- me dire le texte actuel à l'écran +- vocaliser ce que s sur la page +- qu'est-ce que la page dire +- voulez-vous s'il vous plaît lire que pour moi +- voulez-vous lire que à haute voix s'il vous plaît +- voulez-vous lire que pour moi s'il vous plaît + + +## Reject +- J'aime pas ça +- Je rejette +- Négatif +- Jamais +- non +- non, je ne veux pas que +- pas plus tard +- pas le laisser +- pas plus non +- Oh, non +- Dans le no du +- non non merci +- non pas que l'on +- pas le rejeter +- Non, merci +- Non merci +- Pas question +- pas mal +- Non +- Pas +- Pas du tout +- même pas proche +- Pas exactement +- Pas maintenant +- pas tout à fait +- pas en ce moment +- pas que +- Pas grand-chose +- Oh non +- Rejeter +- le rejeter + + +## Repeat +- Nouveau +- pourriez-vous dis-le à nouveau +- Je n'ai pas entendu répéter à nouveau +- Je n'ai pas entendu +- pardon +- Répéter +- répéter s'il vous plaît +- répéter que +- Répéter +- dire à nouveau s'il vous plaît +- dire que de nouveau +- Pardon +- Quel +- Qu'as-tu dit +- ce qui était encore + + +## SelectAny +- tout de celui-ci +- n'importe lequel est OK +- n'importe qui est bien +- Rien +- choisir n'importe qui +- Choisissez l'un de celui-ci aléatoirement +- opter pour un aléatoire +- opter pour tout cela +- choisir un choix aléatoire +- Sélectionnez un aléatoire +- Sélectionnez +- choisir n'importe quel choix +- Sélectionnez l'un d'entre eux + + +## SelectItem +- choisir la dernière +- Choisissez le dernier +- Choisissez no. 2 +- choisir le {DirectionalReference=en bas à gauche} +- choisir le premier choix +- choisir le quatrième +- choisir le {DirectionalReference=en haut à gauche} Choix +- choisir le {DirectionalReference=en haut à droite} Un +- Choisir {DirectionalReference=en haut à droite} +- Choisir {DirectionalReference=en haut à droite} Un +- J'aime {DirectionalReference=Gauche} Un +- J'aime deuxième +- i like second +- J'aime le {DirectionalReference=Bas} Un +- J'aime le premier +- J'aime le troisième +- J'aime le troisième choix +- J'aime le {DirectionalReference=en haut à droite} Un +- J'aime le {DirectionalReference=en haut à droite} +- J'aime {DirectionalReference=en haut à droite} +- Je veux {DirectionalReference=Bas} +- Je veux quatrième +- Je veux {DirectionalReference=Gauche} +- Je veux {DirectionalReference=Oui} Un +- Je veux le premier +- Je veux le quatrième choix +- Je veux que le {DirectionalReference=Gauche} +- Je veux que le {DirectionalReference=Inférieur} Choix +- Je veux que le {DirectionalReference=Oui} Un +- Je veux le second +- Je veux un troisième +- Je veux choisir {DirectionalReference=Bas} Un +- Je veux choisir {DirectionalReference=en bas à droite} +- Je veux choisir {DirectionalReference=Oui} +- Je veux choisir un deuxième +- Je veux choisir le premier +- Je veux choisir le quatrième +- Je veux choisir le dernier choix +- Je veux choisir le {DirectionalReference=Gauche} Un +- Je veux choisir le {DirectionalReference=Inférieur} Choix +- Je veux choisir le {DirectionalReference=Oui} +- Je veux choisir troisième +- Optez pour un premier +- Optez pour la dernière +- opter pour {DirectionalReference=Gauche} +- opter pour {DirectionalReference=Oui} Un +- Optez pour le dernier +- opter pour le {DirectionalReference=Gauche} Un +- opter pour le {DirectionalReference=Inférieur} Choix +- opter pour le {DirectionalReference=Oui} +- opter pour la deuxième +- opter pour le deuxième choix +- Sélectionnez la quatrième +- Sélectionnez {DirectionalReference=Inférieur} Un +- Sélectionnez n ° 5 +- Sélectionnez le {DirectionalReference=Bas} Choix +- Sélectionnez le premier +- sélectionner le dernier choix +- Sélectionnez le {DirectionalReference=Inférieur} Un +- Sélectionnez le {DirectionalReference=Oui} Un +- Sélectionnez le troisième +- Sélectionnez le {DirectionalReference=en haut à droite} +- Sélectionnez troisième +- Sélectionnez {DirectionalReference=Supérieur} +- qu'en est-il de la dernière +- qu'en est-il du troisième + + +## SelectNone +- Je ne veux pas choisir un +- Je ne veux pas sélectionner un +- Je ne veux aucun d'entre eux +- Je veux aucun d'entre eux +- Ni +- aucun de ces +- ni un +- ni l'un d'eux +- ni Merci +- Aucun +- aucun aucun +- aucun d'entre eux +- aucun d'entre eux +- aucun d'entre eux vous remercie +- aucun de ces +- aucun de ces +- ils ont l'air mauvais, pouvez-vous me donner d'autres choix + + +## ShowNext +- et après que +- afficher plus +- affiche plus +- Donnez-moi plus +- aller de l'avant +- aller à la prochaine +- aller aux trois prochains éléments +- J'ai besoin d'aller à l'autre +- Je veux plus +- Plus +- passer à la suivante +- prochain +- révéler plus +- Montrez-moi la prochaine +- afficher plus +- afficher les 3 prochains +- afficher les 4 prochains Articles +- montrer le prochain +- afficher les deux options suivantes +- me dire plus +- en savoir plus +- qu'en est-il prochain +- ce qui après que +- ce qui est après que +- ce qui est plus +- what's Next +- ce qui est le prochain 2 +- what's up Next + + +## ShowPrevious +- Retour à la dernière +- apporter le précédent +- afficher précédemment +- revenir à la dernière +- revenir à la dernière +- revenir à la précédente +- revenir à la dernière +- aller précédemment +- aller à la précédente +- aller à la précédente +- précédent +- précédent s'il vous plaît +- revenir à la précédente +- révéler les précédents +- révéler précédemment +- montrer plus tôt +- Montrez-moi le précédent +- afficher précédent +- montrer le précédent +- ce qui avant que +- Quel est le précédent +- ce qui est avant que + + +## StartOver +- clair et recommencer +- pourriez-vous commencer +- s'il vous plaît recommencer +- Redémarrer +- Redémarrez-le +- recommencer +- commencer +- recommencer +- recommencer +- Tourner la page + + +## Stop +- bébé juste être tranquille +- restez calme +- être silencieux maintenant +- venir sur arrêt +- Rejeter +- Fin +- fin il +- sortie sortie +- arrêt de sortie +- Dieu la ferme +- Hey arrêter +- Je t'aime pour arrêter de parler +- Je veux dire arrêter d'écouter +- J'ai dit stop +- juste être tranquille +- mon Dieu la ferme +- jamais l'esprit arrêter +- ne soyez pas silencieux +- pas être tranquille maintenant +- non non non non arrêtez de parler +- pas de fermeture +- pas d'arrêt +- personne ne se soucie cesser de parler +- nulle part juste être tranquille +- Oh mon Dieu la ferme +- OK stop stop +- Calme +- calme maintenant +- Ferme ta gueule +- La ferme +- Shut Up être silencieux +- taisez-vous +- La ferme +- s'il vous plaît arrêter +- cesser de parler +- Désactiver +- éteindre l'arrêt + + +> # Entity definitions + +$DirectionalReference:simple + + +> # PREBUILT Entity definitions + +$PREBUILT:number + +$PREBUILT:ordinal + + +> # Phrase list definitions + + +> # List entities + diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/it/_skill.lu b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/it/_skill.lu similarity index 94% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/it/_skill.lu rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/it/_skill.lu index a35543b4c0..f0764ff515 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/it/_skill.lu +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/it/_skill.lu @@ -9,4 +9,4 @@ - Ciao - Ciao - Logout -- Addio +- Addio \ No newline at end of file diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/it/general.lu b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/it/general.lu new file mode 100644 index 0000000000..d949498943 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/it/general.lu @@ -0,0 +1,522 @@ +> # Intent definitions + +## Cancel +- Annulla +- Annulla app +- Annulla Annulla +- annullarlo +- annullare non importa +- annullare che +- Annullato +- annullato +- non fare nulla +- Non farlo +- non farlo più +- dimenticarlo +- Vattene +- basta annullare +- Basta annullarlo +- Nervi mente +- Non importa +- non importa annullare +- non importa annullare che +- Nessuna cancellazione +- No Annulla Annulla +- non annullarlo +- non annullare che +- non importa mai +- No No Annulla +- No no annullarlo +- niente non importa +- niente per favore +- Oh Annulla +- Oh non farlo +- si prega di fare nulla +- Smettere +- Scusa, non farlo + + +## Confirm +- Confermare +- Fallo +- fine +- andare per esso +- Grande +- Sono sicuro +- Va bene +- senza dubbio +- Naturalmente, +- Oh sì +- Oh sì +- Ok +- OK per ora +- ok +- Perfetto +- perfetto grazie +- va bene +- destra Sì +- Buona idea +- suona bene grazie +- suona bene grazie +- suona bene per me +- suona grande +- suona perfetto +- Sicuro +- certo fa +- sicuro è +- cosa sicura +- certo sì +- Mille Grazie +- Grazie sì +- che è corretto +- che è giusto +- tale diritto +- che suona bene +- Va bene +- Questo va bene +- Molto bene +- Già +- Sì +- Sì piccola +- Sì bro +- Sì amico +- Sì cool +- Sì andare avanti +- Sì andare per esso +- Sì buono +- Sì + + +## Escalate +- Posso parlare con una persona +- Contatta il supporto +- Contattare il servizio clienti +- servizio clienti +- servizio umano +- Ho bisogno di servizio clienti manuale +- Ho bisogno di aiuto umano reale +- Ho bisogno di sostegno +- Voglio parlare con un umano +- Voglio parlare con un vero e proprio umano +- C'è una persona che posso parlare con +- C'è un vero umano +- C'è una persona reale +- parlare con un umano + + +## FinishTask +- Tutto finito +- tutti insieme +- Fatto +- Finire +- Finito +- rifinito con +- Io sono fatto +- Ho finito +- ha finito +- è fatto +- è finita +- solo essere +- Invia +- presentarlo + + +## GoBack +- Indietro +- indietro per favore +- Torna a +- indietro per durare +- Torna all'ultimo passo +- Indietro +- tornare per favore +- tornare a durare +- Indietro +- tornare su +- tornare indietro per favore +- tornare a +- ultimo passo +- non tornare a +- No no tornare a +- si prega di tornare +- Ritorno + + +## Help +- qualsiasi aiuto +- si può aiutare +- Puoi aiutarmi +- Dammi un po' di aiuto +- Guida +- Come posso ottenerlo +- come farlo +- Ho bisogno di aiuto +- Ho bisogno di un po' di assistenza +- Ho bisogno di aiuto +- C'è qualche aiuto +- Aprire la guida +- si prega di aiutare +- qualche aiuto +- che mi può aiutare + +## Logout +- SignOut +- mi dimentichi +- Esci +- Logout +- Esci + +## None +- tutti loro +- Voglio che tutti +- Voglio tutti loro + + +## ReadAloud +- si può leggere +- si può leggere che +- si può leggere che per me +- si può leggere pagina ad alta voce +- Potresti dirmi quello che dice +- dettaglio ad alta voce quello che dice +- Hey leggere che per me +- Ho bisogno di sentire questa pagina +- Mi piacerebbe che tu leggere che per me +- fare una lettura di questa pagina +- si prega di leggere +- si prega di leggerlo +- si prega di leggere la pagina +- si prega di leggere la mia ultima e-mail +- si prega di leggere questo +- si prega di leggere questo ad alta voce +- si prega di leggere questa pagina +- si prega di leggere questa pagina ad alta voce +- si prega di leggere questa pagina ad alta voce +- si prega di leggere questo per me +- leggere tutti sullo schermo per me +- leggere ad alta voce +- leggere ad alta voce il testo corrente sullo schermo +- leggere file ad alta voce +- Leggilo +- leggerlo ad alta voce +- leggerlo ad alta voce +- leggerlo a voce alta +- leggerlo per favore +- leggerlo a me +- Leggimi questa pagina +- leggere la mia lista +- leggere a voce alta +- pagina di lettura +- leggere la pagina ad alta voce +- leggere pagina Outloud +- leggere la frase ad alta voce +- leggere il testo +- leggere il testo ad alta voce +- leggere che +- leggere che ad alta voce +- leggere la pagina +- leggere la pagina sullo schermo per me +- leggere la pagina ad alta voce +- leggere la pagina per me +- leggere il testo a me +- leggere le parole in questa pagina +- leggere questo per me per favore +- leggere questa pagina +- leggere questa pagina ad alta voce +- leggere questa pagina ad alta voce +- leggere questa pagina per me +- leggere a me +- leggere ciò che è attualmente sullo schermo per me +- parlare di ciò che è in questa pagina +- iniziare a leggere questo +- Dimmi circa le informazioni sullo schermo +- Dimmi il testo corrente sullo schermo +- vocalizzare ciò che s sulla pagina +- che cosa dice la pagina +- si prega di leggere che per me +- Vuoi leggere che ad alta voce per favore +- Vuoi leggere che a me per favore + + +## Reject +- Non mi piace +- i rifiutare +- Negativo +- Mai +- No +- No non voglio che +- non più tardi +- non lasciarlo +- non più no +- Oh no +- Nel no sul +- No No grazie +- No, non che uno +- non rifiutarlo +- No grazie +- No grazie +- Assolutamente no +- non è sbagliato +- No +- Non +- Niente affatto +- nemmeno vicino +- Non esattamente +- Non ora +- Non proprio +- non in questo momento +- non che +- Non molto +- Oh no +- Rifiutare +- rifiutarlo + + +## Repeat +- di nuovo +- si potrebbe dire di nuovo +- non ho sentito ripetere di nuovo +- non ho sentito +- Scusa +- Ripetere +- Ripetere per favore +- ripetere che +- Dillo ancora +- dire di nuovo per favore +- dire che ancora una volta +- Siamo spiacenti +- che cosa +- Cosa hai detto +- quello che era di nuovo + + +## SelectAny +- qualsiasi di esso +- uno è OK +- Chiunque va bene +- Nulla +- scegliere chiunque +- scegliere uno di esso in modo casuale +- optare per uno casuale +- optare per qualsiasi di esso +- Selezionare una scelta casuale +- Selezionare uno casuale +- selezionare qualsiasi +- selezionare qualsiasi scelta +- selezionarne uno + + +## SelectItem +- scegliere ultimo +- Scegli l'ultima +- scegliere No. 2 +- scegliere il {DirectionalReference=in basso a sinistra} +- scegliere la prima scelta +- scegliere il quarto +- scegliere il {DirectionalReference=in alto a sinistra} Scelta +- scegliere il {DirectionalReference=in alto a destra} Uno +- Scegliere {DirectionalReference=in alto a destra} +- Scegliere {DirectionalReference=in alto a destra} Uno +- Mi piace {DirectionalReference=Sinistra} Uno +- Mi piace il secondo +- Mi piace secondo uno +- Mi piace il {DirectionalReference=Fondoschiena} Uno +- Mi piace il primo +- Mi piace il terzo +- Mi piace la terza scelta +- Mi piace il {DirectionalReference=in alto a destra} Uno +- Mi piace il {DirectionalReference=in alto a destra} +- Mi piace {DirectionalReference=in alto a destra} +- Voglio {DirectionalReference=Fondoschiena} +- Voglio quarto +- Voglio {DirectionalReference=Sinistra} +- Voglio {DirectionalReference=va bene} Uno +- Voglio il primo +- Voglio la quarta scelta +- Voglio che il {DirectionalReference=Sinistra} +- Voglio che il {DirectionalReference=Inferiore} Scelta +- Voglio che il {DirectionalReference=va bene} Uno +- Voglio che il secondo +- Voglio terzo +- Voglio scegliere {DirectionalReference=Fondoschiena} Uno +- Voglio scegliere {DirectionalReference=in basso a destra} +- Voglio scegliere {DirectionalReference=va bene} +- Voglio scegliere secondo uno +- Voglio scegliere il primo +- Voglio scegliere il quarto +- Voglio scegliere l'ultima scelta +- Voglio scegliere il {DirectionalReference=Sinistra} Uno +- Voglio scegliere il {DirectionalReference=Inferiore} Scelta +- Voglio scegliere il {DirectionalReference=va bene} +- Voglio scegliere il terzo +- optare per il primo +- optare per l'ultima +- optare per {DirectionalReference=Sinistra} +- optare per {DirectionalReference=va bene} Uno +- optare per l'ultimo +- optare per il {DirectionalReference=Sinistra} Uno +- optare per il {DirectionalReference=Inferiore} Scelta +- optare per il {DirectionalReference=va bene} +- optare per la seconda +- optare per la seconda scelta +- selezionarne una quarta +- Selezionare {DirectionalReference=Inferiore} Uno +- Selezionare No. 5 +- Selezionare la {DirectionalReference=Fondoschiena} Scelta +- Selezionare il primo +- Selezionare l'ultima scelta +- Selezionare la {DirectionalReference=Inferiore} Uno +- Selezionare la {DirectionalReference=va bene} Uno +- Selezionare la terza +- Selezionare la {DirectionalReference=in alto a destra} +- Selezionare il terzo +- Selezionare {DirectionalReference=Superiore} +- per quanto riguarda l'ultimo +- per quanto riguarda il terzo + + +## SelectNone +- non voglio scegliere uno qualsiasi +- non voglio selezionare uno qualsiasi +- voglio nessuno di loro +- Voglio che nessuno di loro +- Né +- nessuno di questi +- né uno +- nessuno di loro +- né grazie +- Nessuno +- nessuno nessuno +- nessuno di loro +- nessuno di loro +- nessuno di loro grazie +- nessuno di questi +- nessuno di quelli +- sembrano cattivi, puoi darmi altre scelte + + +## ShowNext +- e dopo che +- visualizzare più +- Visualizza più +- Dammi più +- andare avanti +- andare al prossimo +- Vai ai prossimi tre elementi +- Ho bisogno di andare a quello successivo +- Voglio di più +- Più +- passare a quello successivo +- prossimo +- rivelano più +- Fammi vedere il prossimo +- Mostra di più +- Mostra i prossimi 3 +- Mostra i prossimi 4 articoli +- mostrare il prossimo +- Mostra le prossime due opzioni +- Dimmi di più +- raccontare di più +- per quanto riguarda il prossimo +- cosa dopo che +- ciò che è dopo che +- cosa c'è di più +- ciò che è prossimo +- Qual è il prossimo 2 +- cosa c'è accanto + + +## ShowPrevious +- Torna all'ultimo +- portare il precedente +- visualizzare in precedenza +- tornare all'ultimo +- tornare a durare uno +- tornare alla precedente +- tornare all'ultimo +- andare in precedenza +- andare al precedente +- andare al precedente +- precedente +- precedente si prega di +- tornare a quello precedente +- rivelare precedente +- rivelare in precedenza +- mostrare in precedenza +- Mostrami il precedente +- Mostra precedente +- mostrare quello precedente +- cosa prima che +- Qual è il precedente +- ciò che è prima che + + +## StartOver +- chiaro e ricominciare +- si potrebbe iniziare sopra +- si prega di ricominciare +- Riavviare +- riavviarlo +- ricominciare +- avviarlo +- ricominciare +- iniziare su di esso +- girare su una nuova foglia + + +## Stop +- bambino solo essere tranquillo +- Taci +- essere tranquillo ora +- Andiamo stop +- Respingere +- Fine +- fine +- uscita Exit +- uscita Stop +- Dio zitto +- Hey stop +- ti amo smettere di parlare +- Voglio dire smettere di ascoltare +- Ho detto stop +- solo essere tranquillo +- il mio Dio zitto +- non importa smettere +- non essere tranquillo +- non essere tranquillo ora +- No no no no smettere di parlare +- non zitto +- No Stop +- nessuno si preoccupa smettere di parlare +- da nessuna parte solo essere tranquillo +- Oh mio Dio zitto +- OK arresto STOP +- Tranquilla +- tranquillo ora +- stai zitto +- Zitto +- Zitto essere tranquillo +- Zitto tranquillo +- Chiudi la bocca +- smettere per favore +- smettere di parlare +- Spegni +- disattivare l'arresto + + +> # Entity definitions + +$DirectionalReference:simple + + +> # PREBUILT Entity definitions + +$PREBUILT:number + +$PREBUILT:ordinal + + +> # Phrase list definitions + + +> # List entities + diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/zh/_skill.lu b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/zh/_skill.lu similarity index 92% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/zh/_skill.lu rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/zh/_skill.lu index 7e3063ca91..9fc4466f32 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/cognitiveModels/LUIS/zh/_skill.lu +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/zh/_skill.lu @@ -9,4 +9,4 @@ - 你好 - 你好 - 注销 -- 再见 +- 再见 \ No newline at end of file diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/zh/general.lu b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/zh/general.lu new file mode 100644 index 0000000000..f0b984dbd9 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/LU/zh/general.lu @@ -0,0 +1,522 @@ +> # Intent definitions + +## Cancel +- 取消 +- 取消应用程序 +- 取消取消 +- 取消它 +- 取消没关系 +- 取消这一点 +- 取消 +- 取消 +- 什么都不做 +- 别这样 +- 别再这么做了 +- 忘了它吧 +- 走开 +- 只是取消 +- 只是取消它 +- 神经的头脑 +- 没关系 +- 别介意取消 +- 没关系取消, +- 没有取消 +- 没有取消取消 +- 不取消它 +- 没有取消, +- 别介意 +- 没有没有取消 +- 不, 不, 取消它 +- 没什么没关系 +- 没什么, 请 +- 哦, 取消 +- 哦, 不要这样做 +- 请什么都不做 +- 退出 +- 对不起, 不要这样做 + + +## Confirm +- 确认 +- 做吧 +- 结束 +- 去吧 +- 伟大 +- 我确定 +- 没事的 +- 毫无疑问 +- 答案是肯定的 +- 哦,是的 +- 哦,是的 +- 还行 +- 好吧, 现在 +- 好 +- 完美 +- 完美的谢谢你 +- 对 +- 对是的 +- 听上去很好 +- 听起来不错, 谢谢 +- 听起来不错, 谢谢 +- 听起来不错 +- 听起来不错 +- 听起来很完美 +- 确定 +- 肯定不 +- 肯定是 +- 肯定的事情 +- 当然是的 +- 谢谢 +- 谢谢你是的 +- 这是正确的 +- 这是正确的 +- 该权利 +- 听起来不错 +- 这很好 +- 这很好 +- 非常好 +- 已经 +- 是的 +- 是的,宝贝 +- 是的兄弟 +- 是的, 哥们 +- 是的很酷 +- 是的, 去吧 +- 是的, 去吧 +- 是的很好 +- 是的 + + +## Escalate +- 我能和一个人交谈吗? +- 联系支持 +- 联系客服 +- 客服服务 +- 人性化服务 +- 我需要手动客服 +- 我需要真正的人类帮助 +- 我需要支持 +- 我想和一个人谈谈 +- 我想和一个真正的人类谈谈 +- 有没有人, 我可以交谈 +- 是否有任何真正的人类 +- 有什么真实的人吗? +- 和人类交谈 + + +## FinishTask +- 全部完成 +- 全部设置 +- 做 +- 完成 +- 完成 +- 完成了 +- 我做完了 +- 我完了 +- 它完成了 +- 它的完成 +- 它的完成 +- 只是是 +- 提交 +- 提交它 + + +## GoBack +- 返回 +- 退后请 +- 返回到 +- 返回到最后一个 +- 返回到最后一步 +- 回来 +- 请退后 +- 回到最后 +- 回去 +- 回去吧 +- 请回去 +- 返回到 +- 最后一步 +- 不回去 +- 不, 不, 不, 回去 +- 请返回 +- 返回 + + +## Help +- 任何帮助 +- 你能帮上忙吗 +- 你可以帮我吗 +- 给我一些帮助 +- 帮助 +- 我怎么能得到它 +- 如何做到这一点 +- 我需要帮助 +- 我需要一些帮助 +- 我需要一些帮助 +- 有什么帮助吗? +- 打开帮助 +- 请帮帮忙 +- 一些帮助 +- 谁能帮我 + +## Logout +- 签出 +- 忘了我吧 +- 注销 +- 注销 +- 注销 + +## None +- 所有的人 +- 我希望他们都 +- 我想所有的人 + + +## ReadAloud +- 你能读懂吗? +- 你能读懂吗 +- 你能为我读一下吗 +- 你能大声朗读页面吗? +- 你能告诉我那是什么意思吗? +- 细节大声说什么 +- 嘿, 为我读一下 +- 我需要听到这一页 +- 我想让你为我读这些 +- 阅读这一页 +- 请阅读 +- 请阅读它 +- 请阅读我的页面 +- 请阅读我最新的电子邮件 +- 请阅读此内容 +- 请大声读出来 +- 请阅读此页面 +- 请大声朗读这一页 +- 请大声阅读这一页 +- 请读给我听 +- 在屏幕上给我读所有的内容 +- 朗读 +- 朗读屏幕上的当前文本 +- 大声朗读文件 +- 阅读它 +- 大声朗读 +- 大声读出来 +- 大声读出来 +- 请阅读它 +- 读给我听 +- 读我这一页 +- 阅读我的列表 +- 大声朗读 +- 阅读页面 +- 大声朗读页面 +- 大声阅读页面 +- 大声朗读句子 +- 读取文本 +- 大声朗读课文 +- 读一下 +- 大声读出来 +- 阅读页面 +- 在屏幕上给我读这一页 +- 大声地读出这一页 +- 读这一页给我听 +- 读课文给我听 +- 阅读本页上的单词 +- 请帮我读一下这个 +- 阅读此页 +- 大声朗读这一页 +- 大声读出这一页 +- 读这一页给我听 +- 读给我听 +- 阅读当前屏幕上的内容给我 +- 说到这一页上的内容 +- 开始阅读这 +- 告诉我屏幕上的信息 +- 告诉我屏幕上的当前文本 +- 发声的页面上的内容 +- 页面上写了什么 +- 请你帮我读一下 +- 请你大声读出来好吗? +- 请你读给我听好吗? + + +## Reject +- 我不喜欢 +- 我拒绝 +- 负 +- 从来 没有 +- 不 +- 不, 我不希望 +- 没有以后 +- 没有离开它 +- 没有更多的没有 +- 哦不 +- 在 "否" 上 +- 不, 不, 谢谢 +- 不, 不是那个 +- 不拒绝它 +- 不,谢谢 +- 不,谢谢 +- 不可能 +- 没有错 +- 不 +- 不 +- 一点也不 +- 甚至没有关闭 +- 不完全是 +- 不是现在 +- 不完全是 +- 不是现在 +- 不是这样的 +- 很少 +- 哦不 +- 拒绝 +- 拒绝它 + + +## Repeat +- 再次 +- 你能再说一遍吗? +- 我没有听到重复再次 +- 我没有听说过 +- 对不起 +- 重复 +- 请重复一遍 +- 重复, +- 再说一遍 +- 请再说一遍 +- 再说一遍 +- 对不起 +- 什么? +- 你说什么 +- 那又是什么 + + +## SelectAny +- 它的任何一个 +- 任何一个都是确定的 +- 任何人都很好 +- 什么 +- 选择任何人 +- 随机选择其中一个 +- 选择一个随机的 +- 选择它的任何一个 +- 选择随机选择 +- 选择一个随机的 +- 选择任何 +- 选择任何选项 +- 选择它的任何一个 + + +## SelectItem +- 选择最后一个 +- 选择最后一个 +- 选择2号 +- 选择 {DirectionalReference=左下角} +- 选择第一选择 +- 选择第四个 +- 选择 {DirectionalReference=左上角} 选择 +- 选择 {DirectionalReference=右上角} 一个 +- 选择 {DirectionalReference=右上角} +- 选择 {DirectionalReference=右上角} 一个 +- 我喜欢 {DirectionalReference=离开} 一个 +- 我喜欢第二 +- 我喜欢第二个 +- 我喜欢的 {DirectionalReference=底部} 一个 +- 我喜欢第一个 +- 我喜欢第三个 +- 我喜欢第三个选择 +- 我喜欢的 {DirectionalReference=右上角} 一个 +- 我喜欢的 {DirectionalReference=右上角} +- 我喜欢 {DirectionalReference=右上角} +- 我想要 {DirectionalReference=底部} +- 我想要第四 +- 我想要 {DirectionalReference=离开} +- 我想要 {DirectionalReference=对} 一个 +- 我想要的第一个 +- 我想要第四个选择 +- 我想 {DirectionalReference=离开} +- 我想 {DirectionalReference=降低} 选择 +- 我想 {DirectionalReference=对} 一个 +- 我想要第二个 +- 我想要第三个 +- 我想选择 {DirectionalReference=底部} 一个 +- 我想选择 {DirectionalReference=右下角} +- 我想选择 {DirectionalReference=对} +- 我想选择第二个 +- 我想选择第一个 +- 我想选择第四个 +- 我想选择最后的选择 +- 我想选择的 {DirectionalReference=离开} 一个 +- 我想选择的 {DirectionalReference=降低} 选择 +- 我想选择的 {DirectionalReference=对} +- 我想选择第三 +- 选择第一个 +- 选择最后一个 +- 选择 {DirectionalReference=离开} +- 选择 {DirectionalReference=对} 一个 +- 选择最后一个 +- 选择 {DirectionalReference=离开} 一个 +- 选择 {DirectionalReference=降低} 选择 +- 选择 {DirectionalReference=对} +- 选择第二个 +- 选择第二个选项 +- 选择第四个 +- 选择 {DirectionalReference=降低} 一个 +- 选择5号 +- 选择 {DirectionalReference=底部} 选择 +- 选择第一个 +- 选择最后一个选项 +- 选择 {DirectionalReference=降低} 一个 +- 选择 {DirectionalReference=对} 一个 +- 选择第三个 +- 选择 {DirectionalReference=右上角} +- 选择第三个 +- 选择 {DirectionalReference=上} +- 那最后一个呢? +- 那第三个呢? + + +## SelectNone +- 我不想选择任何一个 +- 我不想选择任何一个 +- 我不想要他们两个 +- 我不想要他们中的任何一个 +- 也 +- 这两个 +- 都不是一个 +- 他们中的任何一个 +- 也不谢谢你 +- 没有 +- 无 +- 他们都没有 +- 他们中没有一个 +- 他们都不感谢你 +- 这些都没有 +- 没有这些 +- 他们看起来很糟糕, 你能给我其他的选择吗? + + +## ShowNext +- 在那之后 +- 显示更多 +- 显示更多 +- 给我更多 +- 勇往直前 +- 转到下一个 +- 转到接下来的三个项目 +- 我需要去下一个 +- 我想要更多 +- 更 +- 移动到下一个 +- 下 +- 揭示更多 +- 给我看看下一个 +- 显示更多 +- 显示下一个3 +- 显示接下来的4个项目 +- 显示下一个 +- 显示接下来的两个选项 +- 告诉我更多 +- 告诉更多 +- 下一个呢? +- 之后是什么 +- 之后是什么 +- 更重要的是 +- 下一步是什么 +- 接下来的2是什么 +- 接下来会发生什么 + + +## ShowPrevious +- 回到最后一个 +- 带来了前一个 +- 以前显示 +- 回到最后一个 +- 回到最后一个 +- 回到以前的 +- 回到最后一个 +- 去之前 +- 转到上一个 +- 转到上一个 +- 上一个 +- 请前一个 +- 返回到上一个 +- 显示以前的 +- 显示以前 +- 更早显示 +- 给我看看前一个 +- 显示上一个 +- 显示前一个 +- 在那之前 +- 什么是以前的 +- 什么是之前, + + +## StartOver +- 清除并重新开始 +- 你能不能重新开始 +- 请重新开始 +- 重新 启动 +- 重新启动它 +- 重新开始 +- 重新开始 +- 重新开始 +- 开始在它 +- 翻开新的一页 + + +## Stop +- 宝贝, 安静点 +- 保持安静 +- 现在安静点 +- 来吧, 停 +- 解雇 +- 结束 +- 结束它 +- 退出出口 +- 退出站 +- 上帝闭嘴 +- 嘿, 住手 +- 我爱你停止说话 +- 我的意思是停止听 +- 我说停止 +- 只是安静 +- 我的上帝闭嘴 +- 没关系停止 +- 不要安静 +- 现在不要安静 +- 不, 不, 不, 不, 停止说话 +- 没有闭嘴 +- 没有停止 +- 没有人在乎停止说话 +- 无处只是安静 +- 哦, 我的上帝闭嘴 +- 好的, 停 +- 安静 +- 安静的现在 +- 他妈的闭嘴 +- 闭嘴 +- 闭嘴, 安静点 +- 闭嘴, 安静 +- 闭上你的嘴 +- 请停止 +- 别说话了 +- 关闭 +- 关闭停止 + + +> # Entity definitions + +$DirectionalReference:simple + + +> # PREBUILT Entity definitions + +$PREBUILT:number + +$PREBUILT:ordinal + + +> # Phrase list definitions + + +> # List entities + diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/parameters.template.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/parameters.template.json new file mode 100644 index 0000000000..5a7e55527e --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/parameters.template.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "appInsightsLocation": { + "value": "westus2" + }, + "luisServiceLocation": { + "value": "westus" + }, + "qnaMakerSearchSku": { + "value": "standard" + } + } + } \ No newline at end of file diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/template.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/template.json new file mode 100644 index 0000000000..5c72fd61db --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/resources/template.json @@ -0,0 +1,224 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json", + "contentVersion": "1.0.0.0", + "parameters": { + "name": { + "type": "string", + "defaultValue": "[resourceGroup().name]" + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + }, + "microsoftAppId": { + "type": "string" + }, + "microsoftAppPassword": { + "type": "string" + }, + "cosmosDbName": { + "type": "string", + "defaultValue": "[toLower(parameters('name'))]" + }, + "storageAccountName": { + "type": "string", + "defaultValue": "[toLower(parameters('name'))]" + }, + "appServicePlanName": { + "type": "string", + "defaultValue": "[parameters('name')]" + }, + "appServicePlanSku": { + "type": "object", + "defaultValue": { + "tier": "Standard", + "name": "S1" + } + }, + "appInsightsName": { + "type": "string", + "defaultValue": "[parameters('name')]" + }, + "appInsightsLocation": { + "type": "string", + "defaultValue": "westus2" + }, + "botWebAppName": { + "type": "string", + "defaultValue": "[parameters('name')]" + }, + "botServiceName": { + "type": "string", + "defaultValue": "[parameters('name')]" + }, + "botServiceSku": { + "type": "string", + "defaultValue": "S1" + }, + "luisServiceName": { + "type": "string", + "defaultValue": "[concat(parameters('name'), '-luis')]" + }, + "luisServiceSku": { + "type": "string", + "defaultValue": "S0" + }, + "luisServiceLocation": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + } + }, + "variables": { + "botEndpoint": "[concat('https://', toLower(parameters('botWebAppName')), '.azurewebsites.net/api/messages')]", + "cleanStorageAccountName": "[toLower(take(replace(replace(parameters('storageAccountName'), '-', ''), '_', ''), 24))]" + }, + "resources": [ + { + "apiVersion": "2018-02-01", + "name": "99ea37e6-a3e6-4102-a249-71c880607386", + "type": "Microsoft.Resources/deployments", + "properties": { + "mode": "Incremental", + "template": { + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "resources": [] + } + } + }, + { + "comments": "CosmosDB for bot state.", + "type": "Microsoft.DocumentDB/databaseAccounts", + "kind": "GlobalDocumentDB", + "apiVersion": "2015-04-08", + "name": "[parameters('cosmosDbName')]", + "location": "[parameters('location')]", + "properties": { + "databaseAccountOfferType": "Standard", + "locations": [ + { + "locationName": "[parameters('location')]", + "failoverPriority": 0 + } + ] + } + }, + { + "comments": "storage account", + "type": "Microsoft.Storage/storageAccounts", + "kind": "StorageV2", + "apiVersion": "2018-07-01", + "name": "[variables('cleanStorageAccountName')]", + "location": "[parameters('location')]", + "sku": { + "name": "Standard_LRS" + } + }, + { + "comments": "app service plan", + "type": "Microsoft.Web/serverFarms", + "apiVersion": "2018-02-01", + "name": "[parameters('appServicePlanName')]", + "location": "[parameters('location')]", + "sku": "[parameters('appServicePlanSku')]", + "properties": {} + }, + { + "comments": "app insights", + "type": "Microsoft.Insights/components", + "kind": "web", + "apiVersion": "2015-05-01", + "name": "[parameters('appInsightsName')]", + "location": "[parameters('appInsightsLocation')]", + "properties": { + "Application_Type": "web" + } + }, + { + "comments": "bot web app", + "type": "Microsoft.Web/sites", + "apiVersion": "2018-02-01", + "name": "[parameters('botWebAppName')]", + "location": "[parameters('location')]", + "properties": { + "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]", + "siteConfig": { + "webSocketsEnabled": true, + "appSettings": [ + { + "name": "MicrosoftAppId", + "value": "[parameters('microsoftAppId')]" + }, + { + "name": "MicrosoftAppPassword", + "value": "[parameters('microsoftAppPassword')]" + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]" + ] + }, + { + "comments": "bot service", + "type": "Microsoft.BotService/botServices", + "kind": "sdk", + "apiVersion": "2018-07-12", + "name": "[parameters('botServiceName')]", + "location": "global", + "sku": { + "name": "[parameters('botServiceSku')]" + }, + "properties": { + "displayName": "[parameters('botServiceName')]", + "endpoint": "[variables('botEndpoint')]", + "msaAppId": "[parameters('microsoftAppId')]", + "developerAppInsightKey": "[reference(resourceId('Microsoft.Insights/components', parameters('appInsightsName'))).InstrumentationKey]", + "developerAppInsightsApplicationId": "[reference(resourceId('Microsoft.Insights/components', parameters('appInsightsName'))).ApplicationId]" + } + }, + { + "comments": "Cognitive service key for all LUIS apps.", + "type": "Microsoft.CognitiveServices/accounts", + "kind": "LUIS", + "apiVersion": "2017-04-18", + "name": "[parameters('luisServiceName')]", + "location": "[parameters('luisServiceLocation')]", + "sku": { + "name": "[parameters('luisServiceSku')]" + } + } + ], + "outputs": { + "appInsights": { + "type": "object", + "value": { + "appId": "[reference(resourceId('Microsoft.Insights/components', parameters('appInsightsName'))).AppId]", + "instrumentationKey": "[reference(resourceId('Microsoft.Insights/components', parameters('appInsightsName'))).InstrumentationKey]" + } + }, + "storage": { + "type": "object", + "value": { + "connectionString": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('cleanStorageAccountName'), ';AccountKey=', listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('cleanStorageAccountName')), '2018-07-01').keys[0].value, ';EndpointSuffix=core.windows.net')]", + "container": "transcripts" + } + }, + "cosmosDb": { + "type": "object", + "value": { + "cosmosDBEndpoint": "[reference(resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName'))).documentEndpoint]", + "authkey": "[listKeys(resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName')), '2015-04-08').primaryMasterKey]", + "databaseId": "botstate-db", + "collectionId": "botstate-collection" + } + }, + "luis": { + "type": "object", + "value": { + "key": "[listKeys(resourceId('Microsoft.CognitiveServices/accounts', parameters('luisServiceName')),'2017-04-18').key1]" + } + } + } + } \ No newline at end of file diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/scripts/deploy.ps1 b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/scripts/deploy.ps1 new file mode 100644 index 0000000000..0939293bbe --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/scripts/deploy.ps1 @@ -0,0 +1,157 @@ +#Requires -Version 6 + +Param( + [string] $name, + [string] $resourceGroup, + [string] $location, + [string] $appId, + [string] $appPassword, + [string] $luisAuthoringKey, + [string] $luisAuthoringRegion, + [string] $parametersFile, + [string] $outFolder = $(Join-Path $(Get-Location) src), + [string] $logFile = $(Join-Path $PSScriptRoot .. "deploy_log.txt") +) + +# Reset log file +if (Test-Path $logFile) { + Clear-Content $logFile -Force | Out-Null +} +else { + New-Item -Path $logFile | Out-Null +} + +# Get mandatory parameters +if (-not $name) { + $name = Read-Host "? Bot Name (used as default name for resource group and deployed resources)" +} + +if (-not $resourceGroup) { + $resourceGroup = $name +} + +if (-not $location) { + $location = Read-Host "? Azure resource group region" +} + +if (-not $appPassword) { + $appPassword = Read-Host "? Password for MSA app registration (must be at least 16 characters long, contain at least 1 special character, and contain at least 1 numeric character)" +} + +if (-not $luisAuthoringRegion) { + $luisAuthoringRegion = Read-Host "? LUIS Authoring Region (westus, westeurope, or australiaeast)" +} + +if (-not $luisAuthoringKey) { + Switch ($luisAuthoringRegion) { + "westus" { + $luisAuthoringKey = Read-Host "? LUIS Authoring Key (found at https://luis.ai/user/settings)" + Break + } + "westeurope" { + $luisAuthoringKey = Read-Host "? LUIS Authoring Key (found at https://eu.luis.ai/user/settings)" + Break + } + "australiaeast" { + $luisAuthoringKey = Read-Host "? LUIS Authoring Key (found at https://au.luis.ai/user/settings)" + Break + } + default { + Write-Host "! $($luisAuthoringRegion) is not a valid LUIS authoring region." -ForegroundColor DarkRed + Break + } + } + + if (-not $luisAuthoringKey) { + Break + } +} + +if (-not $appId) { + # Create app registration + $appId = (az ad app create ` + --display-name $name ` + --password $appPassword ` + --available-to-other-tenants ` + --reply-urls https://token.botframework.com/.auth/web/redirect) 2>> $logFile ` + | ConvertFrom-Json ` + | Select-Object -ExpandProperty appId + + if(-not $appId) { + Write-Host "! Could not provision Microsoft App Registration automatically. Review the log for more information." -ForegroundColor DarkRed + Write-Host "! Log: $($logFile)" -ForegroundColor DarkRed + Write-Host "+ Provision an app manually in the Azure Portal, then try again providing the -appId and -appPassword arguments." -ForegroundColor Magenta + Break + } +} + +# Get timestamp +$timestamp = Get-Date -f MMddyyyyHHmmss + +# Create resource group +Write-Host "> Creating resource group ..." +(az group create --name $name --location $location) 2>> $logFile | Out-Null + +# Deploy Azure services (deploys LUIS, QnA Maker, Content Moderator, CosmosDB) +Write-Host "> Deploying Azure services (this could take a while)..." -ForegroundColor Yellow +if ($parametersFile) { + (az group deployment create ` + --name $timestamp ` + --resource-group $resourceGroup ` + --template-file "$(Join-Path $PSScriptRoot '..' 'Resources' 'template.json')" ` + --parameters "@$($parametersFile)" ` + --parameters microsoftAppId=$appId microsoftAppPassword="`"$($appPassword)`"") 2>> $logFile | Out-Null +} +else { + (az group deployment create ` + --name $timestamp ` + --resource-group $resourceGroup ` + --template-file "$(Join-Path $PSScriptRoot '..' 'Resources' 'template.json')" ` + --parameters microsoftAppId=$appId microsoftAppPassword="`"$($appPassword)`"") 2>> $logFile | Out-Null +} + +# Check for failed deployments +$operations = az group deployment operation list -g $resourceGroup -n $timestamp | ConvertFrom-Json +$failedOperations = $operations | Where { $_.properties.statusmessage.error -ne $null } +if ($failedOperations) { + foreach ($operation in $failedOperations) { + switch ($operation.properties.statusmessage.error.code) { + "MissingRegistrationForLocation" { + Write-Host "! Deployment failed for resource of type $($operation.properties.targetResource.resourceType). This resource is not avaliable in the location provided." -ForegroundColor DarkRed + Write-Host "+ Update the .\Deployment\Resources\parameters.template.json file with a valid region for this resource and provide the file path in the -parametersFile parameter." -ForegroundColor Magenta + } + default { + Write-Host "! Deployment failed for resource of type $($operation.properties.targetResource.resourceType)." + Write-Host "! Code: $($operation.properties.statusMessage.error.code)." + Write-Host "! Message: $($operation.properties.statusMessage.error.message)." + } + } + } + + Write-Host "+ To delete this resource group, run 'az group delete -g $($resourceGroup) --no-wait'" -ForegroundColor Magenta + Break +} + +# Get deployment outputs +$outputs = (az group deployment show ` + --name $timestamp ` + --resource-group $resourceGroup ` + --query properties.outputs) 2>> $logFile | ConvertFrom-Json + +# Update appsettings.json +Write-Host "> Updating appsettings.json ..." +if (Test-Path $(Join-Path $outFolder appsettings.json)) { + $settings = Get-Content $(Join-Path $outFolder appsettings.json) | ConvertFrom-Json +} +else { + $settings = New-Object PSObject +} +$settings | Add-Member -Type NoteProperty -Force -Name 'microsoftAppId' -Value $appId +$settings | Add-Member -Type NoteProperty -Force -Name 'microsoftAppPassword' -Value $appPassword +$settings | Add-Member -Type NoteProperty -Force -Name 'appInsights' -Value $outputs.appInsights.value +$settings | Add-Member -Type NoteProperty -Force -Name 'blobStorage' -Value $outputs.storage.value +$settings | Add-Member -Type NoteProperty -Force -Name 'cosmosDb' -Value $outputs.cosmosDb.value +$settings | ConvertTo-Json -depth 100 | Out-File $(Join-Path $outFolder appsettings.json) + +# Deploy cognitive models +Invoke-Expression "$(Join-Path $PSScriptRoot 'deploy_cognitive_models.ps1') -name $($name) -luisAuthoringRegion $($luisAuthoringRegion) -luisAuthoringKey $($luisAuthoringKey) -outFolder $($outFolder)" \ No newline at end of file diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/scripts/deploy_cognitive_models.ps1 b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/scripts/deploy_cognitive_models.ps1 new file mode 100644 index 0000000000..4cdd0d34b6 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/scripts/deploy_cognitive_models.ps1 @@ -0,0 +1,103 @@ +#Requires -Version 6 + +Param( + [string] $name, + [string] $luisAuthoringRegion, + [string] $luisAuthoringKey, + [string] $languages = "en-us", + [string] $outFolder = $(Get-Location), + [string] $logFile = $(Join-Path $PSScriptRoot .. "deploy_cognitive_models_log.txt") +) + +. $PSScriptRoot\luis_functions.ps1 + + +# Reset log file +if (Test-Path $logFile) { + Clear-Content $logFile -Force | Out-Null +} +else { + New-Item -Path $logFile | Out-Null +} + +# Get mandatory parameters +if (-not $name) { + $name = Read-Host "? Base name for Cognitive Models" + $resourceGroup = $name +} + +if (-not $luisAuthoringRegion) { + $luisAuthoringRegion = Read-Host "? LUIS Authoring Region (westus, westeurope, or australiaeast)" +} + +if (-not $luisAuthoringKey) { + Switch ($luisAuthoringRegion) { + "westus" { + $luisAuthoringKey = Read-Host "? LUIS Authoring Key (found at https://luis.ai/user/settings)" + Break + } + "westeurope" { + $luisAuthoringKey = Read-Host "? LUIS Authoring Key (found at https://eu.luis.ai/user/settings)" + Break + } + "australiaeast" { + $luisAuthoringKey = Read-Host "? LUIS Authoring Key (found at https://au.luis.ai/user/settings)" + Break + } + default { + Write-Host "! $($luisAuthoringRegion) is not a valid LUIS authoring region." -ForegroundColor DarkRed + Break + } + } + + if (-not $luisAuthoringKey) { + Break + } +} + +# Initialize settings obj +$settings = @{ cognitiveModels = New-Object PSObject } + +# Deploy localized resources +Write-Host "Deploying cognitive models ..." +foreach ($language in $languages -split ",") +{ + $langCode = ($language -split "-")[0] + + $config = @{ + languageModels = @() + } + + # Deploy LUIS apps + $luisFiles = Get-ChildItem "$(Join-Path $PSScriptRoot .. 'Resources' 'LU' $langCode)" | Where {$_.extension -eq ".lu"} + foreach ($lu in $luisFiles) + { + # Deploy LUIS model + $luisApp = DeployLUIS -name $name -lu_file $lu -region $location -luisAuthoringKey $luisAuthoringKey -language $language -log $logFile + + if ($luisApp) { + # Add to config + $config.languageModels += @{ + id = $lu.BaseName + name = $luisApp.name + appId = $luisApp.id + authoringKey = $luisauthoringkey + subscriptionKey = $luisauthoringkey + version = $luisApp.activeVersion + region = $location + } + + RunLuisGen $lu "$($lu.BaseName)" $(Join-Path $outFolder Services) + } + else { + Write-Host "! Deployment failed for LUIS app: $($lu.BaseName)" -ForegroundColor Cyan + } + } + + # Add config to cognitivemodels dictionary + $settings.cognitiveModels | Add-Member -Type NoteProperty -Force -Name $langCode -Value $config +} +$settings | Add-Member -Type NoteProperty -Force -Name "defaultLocale" -Value "en" + +# Write out config to file +$settings | ConvertTo-Json -depth 100 | Out-File $(Join-Path $outFolder "cognitivemodels.json" ) \ No newline at end of file diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/scripts/luis_functions.ps1 b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/scripts/luis_functions.ps1 new file mode 100644 index 0000000000..04907c3754 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/scripts/luis_functions.ps1 @@ -0,0 +1,108 @@ +function DeployLUIS ($name, $lu_file, $region, $luisAuthoringKey, $language, $log) +{ + $id = $lu_file.BaseName + $outFile = "$($id).luis" + $outFolder = $lu_file.DirectoryName + $appName = "$($name)$($langCode)_$($id)" + + # Parse LU file + Write-Host "> Parsing $($id) LU file ..." + ludown parse toluis ` + --in $lu_file ` + --luis_culture $language ` + --out_folder $outFolder ` + --out $outFile + + # Create LUIS app + Write-Host "> Deploying $($id) LUIS app ..." + $luisApp = (luis import application ` + --appName $appName ` + --authoringKey $luisAuthoringKey ` + --subscriptionKey $luisAuthoringKey ` + --region $region ` + --in "$(Join-Path $outFolder $outFile)" ` + --wait) 2>> $log | ConvertFrom-Json + + if (-not $luisApp) { + Write-Host "! Could not deploy LUIS model. Review the log for more information." -ForegroundColor DarkRed + Write-Host "! Log: $($log)" -ForegroundColor DarkRed + Return $null + } + else { + # train and publish luis app + $(luis train version --appId $luisApp.id --authoringKey $luisAuthoringKey --versionId $luisApp.activeVersion --wait + & luis publish version --appId $luisApp.id --authoringKey $luisAuthoringKey --versionId $luisApp.activeVersion --wait) 2>> $log | Out-Null + + Return $luisApp + } +} + +function UpdateLUIS ($lu_file, $appId, $version, $authoringKey, $subscriptionKey, $log) +{ + $id = $lu_file.BaseName + $outFile = "$($id).luis" + $outFolder = $lu_file.DirectoryName + + $luisApp = luis get application --appId $appId --authoringKey $authoringKey | ConvertFrom-Json + + # Parse LU file + Write-Host "> Parsing $($id) LU file ..." + ludown parse toluis ` + --in $lu_file ` + --luis_culture $luisApp.culture ` + --out_folder $outFolder ` + --out $outFile + + Write-Host "? Getting current versions ..." + # Get list of current versions + $versions = luis list versions ` + --appId $appId ` + --authoringKey $authoringKey | ConvertFrom-Json + + # If the current version exists + if ($versions | Where { $_.version -eq $version }) + { + # delete any old backups + if ($versions | Where { $_.version -eq "backup" }) + { + Write-Host "> Deleting old backup version ..." + luis delete version ` + --appId $appId ` + --versionId "backup" ` + --authoringKey $authoringKey ` + --force --wait | Out-Null + } + + # rename the active version to backup + Write-Host "> Saving current version as backup ..." + luis rename version ` + --appId $appId ` + --versionId $version ` + --newVersionId backup ` + --authoringKey $authoringKey ` + --subscriptionKey $subscriptionKey ` + --wait | Out-Null + } + + # import the new 0.1 version from the .luis file + Write-Host "> Importing new version ..." + luis import version ` + --appId $appId ` + --versionId $version ` + --authoringKey $authoringKey ` + --subscriptionKey $subscriptionKey ` + --in "$(Join-Path $outFolder $outFile)" ` + --wait | ConvertFrom-Json + + # train and publish luis app + $(luis train version --appId $appId --authoringKey $authoringKey --versionId $version --wait + & luis publish version --appId $appId --authoringKey $authoringKey --versionId $version --wait) 2>&1 | Out-Null +} + +function RunLuisGen($lu_file, $outName, $outFolder) { + $id = $lu_file.BaseName + $luisFolder = $lu_file.DirectoryName + $luisFile = Join-Path $luisFolder "$($id).luis" + + luisgen $luisFile -cs "$($outName)Luis" -o $outFolder +} \ No newline at end of file diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/webConfigPrep.js b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/webConfigPrep.js new file mode 100644 index 0000000000..7285585653 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/deployment/webConfigPrep.js @@ -0,0 +1,23 @@ +/** + * Copyright(c) Microsoft Corporation.All rights reserved. + * Licensed under the MIT License. + */ + +// DO NOT MODIFY THIS CODE +// This script is run as part of the Post Deploy step when +// deploying the bot to Azure. It ensures the Azure Web App +// is configured correctly to host a TypeScript authored bot. +const fs = require("fs"); +const path = require("path"); +const replace = require("replace"); +const WEB_CONFIG_FILE = path.join(__dirname, "..", "web.config"); + +if (fs.existsSync(path.resolve(WEB_CONFIG_FILE))) { + replace({ + regex: 'url="index.js"', + replacement: 'url="lib/index.js"', + paths: [WEB_CONFIG_FILE], + recursive: false, + silent: true + }); +} diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/adapters/_customSkillAdapter.ts b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/adapters/_customSkillAdapter.ts new file mode 100644 index 0000000000..2c46997270 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/adapters/_customSkillAdapter.ts @@ -0,0 +1,56 @@ +/** + * Copyright(c) Microsoft Corporation.All rights reserved. + * Licensed under the MIT License. + */ + +import { TelemetryClient } from 'applicationinsights'; +import { + AutoSaveStateMiddleware, + BotFrameworkAdapter, + BotFrameworkAdapterSettings, + ConversationState, + ShowTypingMiddleware, + StatePropertyAccessor, + UserState } from 'botbuilder'; +import { DialogState } from 'botbuilder-dialogs'; +import { + SkillContext, + SkillHttpAdapter, + SkillHttpBotAdapter, + SkillMiddleware } from 'botbuilder-skills'; +import { + EventDebuggerMiddleware, + SetLocaleMiddleware, + TelemetryLoggerMiddleware} from 'botbuilder-solutions'; +import { IBotSettings } from '../services/botSettings'; + +export class CustomSkillAdapter extends SkillHttpBotAdapter { + + constructor( + settings: Partial, + userState: UserState, + conversationState: ConversationState, + telemetryClient: TelemetryClient, + skillContextAccessor: StatePropertyAccessor, + dialogStateAccesor: StatePropertyAccessor + ) { + super( + telemetryClient + ); + + this.use(new TelemetryLoggerMiddleware(telemetryClient, true)); + // Currently not working https://github.com/Microsoft/botbuilder-js/issues/853#issuecomment-481416004 + // this.use(new TranscriptLoggerMiddleware(this.transcriptStore)); + // Typing Middleware (automatically shows typing when the bot is responding/working) + this.use(new ShowTypingMiddleware()); + let defaultLocale: string = 'en-us'; + if (settings.defaultLocale !== undefined) { + defaultLocale = settings.defaultLocale; + } + this.use(new SetLocaleMiddleware(defaultLocale)); + this.use(new EventDebuggerMiddleware()); + // Use the AutoSaveStateMiddleware middleware to automatically read and write conversation and user state. + this.use(new AutoSaveStateMiddleware(conversationState, userState)); + this.use(new SkillMiddleware(conversationState, skillContextAccessor, dialogStateAccesor)); + } +} diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/adapters/defaultAdapter.ts b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/adapters/defaultAdapter.ts new file mode 100644 index 0000000000..3b9333b9dc --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/adapters/defaultAdapter.ts @@ -0,0 +1,47 @@ +/** + * Copyright(c) Microsoft Corporation.All rights reserved. + * Licensed under the MIT License. + */ + +import { TelemetryClient } from 'applicationinsights'; +import { + AutoSaveStateMiddleware, + BotFrameworkAdapter, + BotFrameworkAdapterSettings, + ConversationState, + ShowTypingMiddleware, + UserState } from 'botbuilder'; +import { ISkillManifest } from 'botbuilder-skills'; +import { + EventDebuggerMiddleware, + SetLocaleMiddleware, + TelemetryLoggerMiddleware} from 'botbuilder-solutions'; +import { IBotSettings } from '../services/botSettings.js'; + +export class DefaultAdapter extends BotFrameworkAdapter { + public readonly skills: ISkillManifest[] = []; + + constructor( + settings: Partial, + adapterSettings: Partial, + userState: UserState, + conversationState: ConversationState, + telemetryClient: TelemetryClient + ) { + super(adapterSettings); + + this.use(new TelemetryLoggerMiddleware(telemetryClient, true)); + // Currently not working https://github.com/Microsoft/botbuilder-js/issues/853#issuecomment-481416004 + // this.use(new TranscriptLoggerMiddleware(this.transcriptStore)); + // Typing Middleware (automatically shows typing when the bot is responding/working) + this.use(new ShowTypingMiddleware()); + let defaultLocale: string = 'en-us'; + if (settings.defaultLocale !== undefined) { + defaultLocale = settings.defaultLocale; + } + this.use(new SetLocaleMiddleware(defaultLocale)); + this.use(new EventDebuggerMiddleware()); + // Use the AutoSaveStateMiddleware middleware to automatically read and write conversation and user state. + this.use(new AutoSaveStateMiddleware(conversationState, userState)); + } +} diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/appsettings.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/appsettings.json new file mode 100644 index 0000000000..e5e3c67edf --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/appsettings.json @@ -0,0 +1,25 @@ +{ + "microsoftAppId": "", + "microsoftAppPassword": "", + "appInsights": { + "appId": "", + "instrumentationKey": "" + }, + "blobStorage": { + "connectionString": "", + "container": "" + }, + "cosmosDb": { + "authkey": "", + "collectionId": "", + "cosmosDBEndpoint": "", + "databaseId": "" + }, + "oauthConnections": [ + { + "name": "", + "provider": "" + } + ], + "properties": {} +} \ No newline at end of file diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/bots/_dialogBot.ts b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/bots/_dialogBot.ts new file mode 100644 index 0000000000..b05b18665f --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/bots/_dialogBot.ts @@ -0,0 +1,61 @@ +/** + * Copyright(c) Microsoft Corporation.All rights reserved. + * Licensed under the MIT License. + */ + +import { + ActivityHandler, + BotTelemetryClient, + ConversationState, + EndOfConversationCodes, + Severity, + TurnContext } from 'botbuilder'; +import { + Dialog, + DialogContext, + DialogSet, + DialogState, + DialogTurnResult } from 'botbuilder-dialogs'; + +export class DialogBot extends ActivityHandler { + private readonly telemetryClient: BotTelemetryClient; + private readonly solutionName: string = '<%=skillName%>'; + private readonly rootDialogId: string; + private dialogs: DialogSet; + + constructor( + conversationState: ConversationState, + telemetryClient: BotTelemetryClient, + dialog: T) { + super(); + + this.rootDialogId = dialog.id; + this.telemetryClient = telemetryClient; + this.dialogs = new DialogSet(conversationState.createProperty(this.solutionName)); + this.dialogs.add(dialog); + this.onTurn(this.turn.bind(this)); + } + + //tslint:disable-next-line: no-any + public async turn(turnContext: TurnContext, next: () => Promise): Promise { + // Client notifying this bot took to long to respond (timed out) + if (turnContext.activity.code === EndOfConversationCodes.BotTimedOut) { + this.telemetryClient.trackTrace({ + message: `Timeout in ${ turnContext.activity.channelId } channel: Bot took too long to respond`, + severityLevel: Severity.Information + }); + + return; + } + + const dc: DialogContext = await this.dialogs.createContext(turnContext); + + if (dc.activeDialog !== undefined) { + const result: DialogTurnResult = await dc.continueDialog(); + } else { + await dc.beginDialog(this.rootDialogId); + } + + await next(); + } +} diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/cognitivemodels.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/cognitivemodels.json new file mode 100644 index 0000000000..ef0775e592 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/cognitivemodels.json @@ -0,0 +1,27 @@ +{ + "defaultLocale": "en-us", + "cognitiveModels": { + "en": { + "languageModels": [ + { + "id": "general", + "name": "", + "appId": "", + "version": "0.1", + "region": "", + "authoringKey": "", + "subscriptionKey": "" + }, + { + "id": "skill", + "name": "", + "appId": "", + "version": "0.1", + "region": "", + "authoringKey": "", + "subscriptionKey": "" + } + ] + } + } +} diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/dialogs/_mainDialog.ts b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/dialogs/_mainDialog.ts new file mode 100644 index 0000000000..f26d3a3b5e --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/dialogs/_mainDialog.ts @@ -0,0 +1,267 @@ +/** + * Copyright(c) Microsoft Corporation.All rights reserved. + * Licensed under the MIT License. + */ + +import { + Activity, + ActivityTypes, + BotFrameworkAdapter, + BotTelemetryClient, + RecognizerResult, + StatePropertyAccessor, + TurnContext } from 'botbuilder'; +import { LuisRecognizer } from 'botbuilder-ai'; +import { + Dialog, + DialogContext, + DialogTurnResult, + DialogTurnStatus } from 'botbuilder-dialogs'; +import { SkillContext } from 'botbuilder-skills'; +import { + ActivityExtensions, + ICognitiveModelSet, + InterruptionAction, + ITelemetryLuisRecognizer, + ResponseManager, + RouterDialog } from 'botbuilder-solutions'; +// tslint:disable-next-line:no-implicit-dependencies no-submodule-imports +import { TokenStatus } from 'botframework-connector/lib/tokenApi/models'; +import i18next from 'i18next'; +import { SkillState } from '../models/skillState'; +import { MainResponses } from '../responses/main/mainResponses'; +import { SharedResponses } from '../responses/shared/sharedResponses'; +import { BotServices } from '../services/botServices'; +import { IBotSettings } from '../services/botSettings'; +import { SampleDialog } from './sampleDialog'; + +enum Events { + skillBeginEvent = 'skillBegin', + tokenResponseEvent = 'tokens/response' +} + +export class MainDialog extends RouterDialog { + + // Fields + private readonly solutionName: string = '<%=skillName%>'; + private readonly luisServiceGeneral: string = 'general'; + private readonly settings: Partial; + private readonly services: BotServices; + private readonly responseManager: ResponseManager; + private readonly stateAccessor: StatePropertyAccessor; + private readonly contextAccessor: StatePropertyAccessor; + + // Constructor + constructor( + settings: Partial, + services: BotServices, + responseManager: ResponseManager, + stateAccessor: StatePropertyAccessor, + contextAccessor: StatePropertyAccessor, + sampleDialog: SampleDialog, + telemetryClient: BotTelemetryClient + ) { + super(MainDialog.name, telemetryClient); + this.settings = settings; + this.services = services; + this.responseManager = responseManager; + this.telemetryClient = telemetryClient; + + // Initialize state accessor + this.stateAccessor = stateAccessor; + this.contextAccessor = contextAccessor; + + // Register dialogs + this.addDialog(sampleDialog); + } + + protected async onStart(dc: DialogContext): Promise { + const locale: string = i18next.language; + await dc.context.sendActivity(this.responseManager.getResponse(MainResponses.welcomeMessage)); + } + + protected async route(dc: DialogContext): Promise { + // get current activity locale + const locale: string = i18next.language; + const localeConfig: Partial | undefined = this.services.cognitiveModelSets.get(locale); + + // Populate state from SkillContext slots as required + await this.populateStateFromSkillContext(dc.context); + if (localeConfig === undefined) { + throw new Error('There is no cognitiveModels for the locale'); + } + // Get skill LUIS model from configuration + if (localeConfig.luisServices !== undefined) { + + const luisService: ITelemetryLuisRecognizer | undefined = localeConfig.luisServices.get(this.solutionName); + + if (luisService === undefined) { + throw new Error('The specified LUIS Model could not be found in your Bot Services configuration.'); + } else { + let turnResult: DialogTurnResult = Dialog.EndOfTurn; + const result: RecognizerResult = await luisService.recognize(dc.context); + const intent: string = LuisRecognizer.topIntent(result); + + switch (intent) { + case 'Sample': { + turnResult = await dc.beginDialog(SampleDialog.name); + break; + } + case 'None': { + // No intent was identified, send confused message + await dc.context.sendActivity(this.responseManager.getResponse(SharedResponses.didntUnderstandMessage)); + turnResult = { + status: DialogTurnStatus.complete + }; + break; + } + default: { + // intent was identified but not yet implemented + await dc.context.sendActivity(this.responseManager.getResponse(MainResponses.featureNotAvailable)); + turnResult = { + status: DialogTurnStatus.complete + }; + } + } + if (turnResult !== Dialog.EndOfTurn) { + await this.complete(dc); + } + } + } + } + + protected async complete(dc: DialogContext, result?: DialogTurnResult): Promise { + const response: Activity = ActivityExtensions.createReply(dc.context.activity); + response.type = ActivityTypes.EndOfConversation; + await dc.context.sendActivity(response); + await dc.endDialog(result); + } + + protected async onEvent(dc: DialogContext): Promise { + switch (dc.context.activity.name) { + case Events.skillBeginEvent: { + // tslint:disable-next-line: no-any + const state: any = await this.stateAccessor.get(dc.context); + const userData: Map = >dc.context.activity.value; + if (userData === undefined) { + throw new Error('userData is not an instance of Map'); + } + // Capture user data from event if needed + + break; + } + case Events.tokenResponseEvent: { + // Auth dialog completion + const result: DialogTurnResult = await dc.continueDialog(); + + // If the dialog completed when we sent the token, end the skill conversation + if (result.status !== DialogTurnStatus.waiting) { + const response: Activity = ActivityExtensions.createReply(dc.context.activity); + response.type = ActivityTypes.EndOfConversation; + + await dc.context.sendActivity(response); + } + + break; + } + default: + } + } + + protected async onInterruptDialog(dc: DialogContext): Promise { + let result: InterruptionAction = InterruptionAction.NoAction; + + if (dc.context.activity.type === ActivityTypes.Message) { + // get current activity locale + const locale: string = i18next.language; + const localeConfig: Partial | undefined = this.services.cognitiveModelSets.get(locale); + if (localeConfig === undefined) { + throw new Error('There is no cognitiveModels for the locale'); + } + // check general luis intent + if (localeConfig.luisServices !== undefined) { + const luisService: ITelemetryLuisRecognizer | undefined = localeConfig.luisServices.get(this.luisServiceGeneral); + + if (luisService === undefined) { + throw new Error('The specified LUIS Model could not be found in your Bot Services configuration.'); + } else { + const luisResult: RecognizerResult = await luisService.recognize(dc.context); + const topIntent: string = LuisRecognizer.topIntent(luisResult); + + if (luisResult.intents[topIntent].score > 0.5) { + switch (topIntent) { + case 'Cancel': { + result = await this.onCancel(dc); + break; + } + case 'Help': { + result = await this.onHelp(dc); + break; + } + case 'Logout': { + result = await this.onLogout(dc); + break; + } + default: + } + } + } + } + } + + return result; + } + + protected async onCancel(dc: DialogContext): Promise { + await dc.context.sendActivity(this.responseManager.getResponse(MainResponses.cancelMessage)); + await this.complete(dc); + await dc.cancelAllDialogs(); + + return InterruptionAction.StartedDialog; + } + + protected async onHelp(dc: DialogContext): Promise { + await dc.context.sendActivity(this.responseManager.getResponse(MainResponses.helpMessage)); + + return InterruptionAction.MessageSentToUser; + } + + protected async onLogout(dc: DialogContext): Promise { + const supported: boolean = dc.context.adapter instanceof BotFrameworkAdapter; + if (!supported) { + throw new Error('OAuthPrompt.SignOutUser(): not supported by the current adapter'); + } + + const adapter: BotFrameworkAdapter = dc.context.adapter; + await dc.cancelAllDialogs(); + + // Sign out user + // PENDING check adapter.getTokenStatusAsync + const tokens: TokenStatus[] = []; + tokens.forEach(async (token: TokenStatus) => { + if (token.connectionName !== undefined) { + await adapter.signOutUser(dc.context, token.connectionName); + } + }); + + await dc.context.sendActivity(this.responseManager.getResponse(MainResponses.logOut)); + + return InterruptionAction.StartedDialog; + } + + protected async populateStateFromSkillContext(context: TurnContext): Promise { + // If we have a SkillContext object populated from the SkillMiddleware we can retrieve requests slot (parameter) data + // and make available in local state as appropriate. + const skillContext: SkillContext | undefined = await this.contextAccessor.get(context); + + if (skillContext !== undefined) { + // Example of populating local state with data passed through Skill Context + //if (skillContext.ContainsKey("Location")) + //{ + // // Add to your local state + // var state = await _stateAccessor.GetAsync(context, () => new SkillState()); + // state.Location = skillContext["Location"]; + //} + } + } +} diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/_skillDialogBase.ts b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/dialogs/_skillDialogBase.ts similarity index 50% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/_skillDialogBase.ts rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/dialogs/_skillDialogBase.ts index b7d3fb3c47..12b05dbab3 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/_skillDialogBase.ts +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/dialogs/_skillDialogBase.ts @@ -1,15 +1,8 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License +/** + * Copyright(c) Microsoft Corporation.All rights reserved. + * Licensed under the MIT License. + */ -import { - ActivityExtensions, - CommonUtil, - IProviderTokenResponse, - ITelemetryLuisRecognizer, - LocaleConfiguration, - MultiProviderAuthDialog, - ResponseManager, - SkillConfigurationBase } from 'bot-solution'; import { Activity, ActivityTypes, @@ -23,41 +16,44 @@ import { DialogTurnStatus, PromptValidatorContext, WaterfallStepContext} from 'botbuilder-dialogs'; +import { + CommonUtil, + ICognitiveModelSet, + IProviderTokenResponse, + ITelemetryLuisRecognizer, + MultiProviderAuthDialog, + ResponseManager } from 'botbuilder-solutions'; import { TokenResponse } from 'botframework-schema'; import i18next from 'i18next'; -import { IServiceManager } from '../../serviceClients/IServiceManager'; -import { SkillTemplateDialogOptions } from './dialogOptions/skillTemplateDialogOptions'; -import { SharedResponses } from './sharedResponses'; +import { SkillState } from '../models/skillState'; +import { SharedResponses } from '../responses/shared/sharedResponses'; +import { BotServices} from '../services/botServices'; +import { IBotSettings } from '../services/botSettings'; -import { ISkillConversationState } from '../../skillConversationState'; - -import { <%=skillUserStateNameClass%> } from '../../<%=skillUserStateNameFile%>'; +enum DialogIds { + skillModeAuth = 'SkillAuth' +} -/** - * Here is the description of the SkillDialogBase's functionality - */ export class SkillDialogBase extends ComponentDialog { - protected services: SkillConfigurationBase; - protected conversationStateAccessor: StatePropertyAccessor; - protected userStateAccessor: StatePropertyAccessor<<%=skillUserStateNameClass%>>; - protected serviceManager: IServiceManager; + private readonly solutionName: string = '<%=skillName%>'; + protected settings: Partial; + protected services: BotServices; + protected stateAccessor: StatePropertyAccessor; protected responseManager: ResponseManager; - private projectName: string = '<%=skillProjectNameId%>'; + constructor( dialogId: string, - services: SkillConfigurationBase, + settings: Partial, + services: BotServices, responseManager: ResponseManager, - conversationStateAccessor: StatePropertyAccessor, - userStateAccessor: StatePropertyAccessor<<%=skillUserStateNameClass%>>, - serviceManager: IServiceManager, + stateAccessor: StatePropertyAccessor, telemetryClient: BotTelemetryClient) { super(dialogId); this.services = services; this.responseManager = responseManager; - this.conversationStateAccessor = conversationStateAccessor; - this.userStateAccessor = userStateAccessor; - this.serviceManager = serviceManager; + this.stateAccessor = stateAccessor; this.telemetryClient = telemetryClient; + this.settings = settings; // NOTE: Uncomment the following if your skill requires authentication // if (!services.authenticationConnections.any()) @@ -81,31 +77,11 @@ export class SkillDialogBase extends ComponentDialog { return super.onContinueDialog(dc); } - // Shared steps protected async getAuthToken(sc: WaterfallStepContext): Promise { try { - const skillOptions: SkillTemplateDialogOptions = sc.options; - - // If in Skill mode we ask the calling Bot for the token - if (skillOptions !== undefined && skillOptions.skillMode) { - // We trigger a Token Request from the Parent Bot - // by sending a "TokenRequest" event back and then waiting for a "TokenResponse" - const response: Activity = ActivityExtensions.createReply(sc.context.activity); - response.type = ActivityTypes.Event; - response.name = 'token/request'; - - // Send the token/request Event - await sc.context.sendActivity(response); - - // Wait for the tokens/response event - return await sc.prompt(DialogIds.skillModeAuth, {}); - } else { - return await sc.prompt(MultiProviderAuthDialog.name, { - retryPrompt: this.responseManager.getResponse(SharedResponses.noAuth) - }); - } + return await sc.prompt(MultiProviderAuthDialog.name, {}); } catch (err) { - await this.handleDialogExceptions(sc, err); + await this.handleDialogExceptions(sc, err); return { status: DialogTurnStatus.cancelled, @@ -118,26 +94,18 @@ export class SkillDialogBase extends ComponentDialog { try { // When the user authenticates interactively we pass on the tokens/Response event which surfaces as a JObject // When the token is cached we get a TokenResponse object. - const skillOptions: SkillTemplateDialogOptions = sc.options; - let providerTokenResponse: IProviderTokenResponse | undefined; - if (skillOptions !== undefined && skillOptions.skillMode) { - const resultType: string = sc.context.activity.valueType; - if (resultType === 'IProviderTokenResponse') { - providerTokenResponse = sc.context.activity.value; - } - } else { - providerTokenResponse = sc.result; - } + const providerTokenResponse: IProviderTokenResponse | undefined = sc.result; if (providerTokenResponse !== undefined) { // tslint:disable-next-line:no-any - const state: any = await this.conversationStateAccessor.get(sc.context); + const state: any = await this.stateAccessor.get(sc.context); + // tslint:disable-next-line: no-unsafe-any state.token = providerTokenResponse.tokenResponse.token; } return await sc.next(); } catch (err) { - await this.handleDialogExceptions(sc, err); + await this.handleDialogExceptions(sc, err); return { status: DialogTurnStatus.cancelled, @@ -145,9 +113,8 @@ export class SkillDialogBase extends ComponentDialog { }; } } - // Validators - protected tokenResponseValidator(pc: PromptValidatorContext): Promise { + protected async tokenResponseValidator(pc: PromptValidatorContext): Promise { const activity: Activity | undefined = pc.recognized.value; if (activity !== undefined && activity.type === ActivityTypes.Event) { return Promise.resolve(true); @@ -156,7 +123,7 @@ export class SkillDialogBase extends ComponentDialog { } } - protected authPromptValidator(promptContext: PromptValidatorContext): Promise { + protected async authPromptValidator(promptContext: PromptValidatorContext): Promise { const token: TokenResponse | undefined = promptContext.recognized.value; if (token !== undefined) { return Promise.resolve(true); @@ -168,24 +135,25 @@ export class SkillDialogBase extends ComponentDialog { // Helpers protected async getLuisResult(dc: DialogContext): Promise { if (dc.context.activity.type === ActivityTypes.Message) { - const state: ISkillConversationState = await this.conversationStateAccessor.get(dc.context, { - // tslint:disable-next-line:no-empty - clear: (): void => { }, - dialogStack: [] - }); + const state: SkillState = await this.stateAccessor.get(dc.context, new SkillState()); // Get luis service for current locale - const locale: string = i18next.language; - const localeConfig: LocaleConfiguration = (this.services.localeConfigurations.get(locale) || new LocaleConfiguration()); - const luisService: ITelemetryLuisRecognizer | undefined = localeConfig.luisServices.get(this.projectName); - - // Get intent and entities for activity - if (luisService === undefined) { - throw new Error('luisService is null'); + const locale: string = i18next.language; + const localeConfig: Partial | undefined = this.services.cognitiveModelSets.get(locale); + if (localeConfig === undefined) { + throw new Error('There is no cognitiveModels for the locale'); + } + if (localeConfig.luisServices !== undefined) { + const luisService: ITelemetryLuisRecognizer | undefined = localeConfig.luisServices.get(this.solutionName); + + if (luisService === undefined) { + throw new Error('The specified LUIS Model could not be found in your Bot Services configuration.'); + } else { + // Get intent and entities for activity + const result: RecognizerResult = await luisService.recognize(dc); + state.luisResult = result; + } } - const result: RecognizerResult = await luisService.recognize(dc, true); - - state.luisResult = result; } } @@ -208,11 +176,8 @@ export class SkillDialogBase extends ComponentDialog { // clear state // tslint:disable-next-line:no-any - const state: any = await this.conversationStateAccessor.get(sc.context); + const state: any = await this.stateAccessor.get(sc.context); + // tslint:disable-next-line: no-unsafe-any state.clear(); } } - -enum DialogIds { - skillModeAuth = 'SkillAuth' -} diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/dialogs/sampleDialog.ts b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/dialogs/sampleDialog.ts new file mode 100644 index 0000000000..aa69a965c5 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/dialogs/sampleDialog.ts @@ -0,0 +1,80 @@ +/** + * Copyright(c) Microsoft Corporation.All rights reserved. + * Licensed under the MIT License. + */ + +import { + Activity, + BotTelemetryClient, + StatePropertyAccessor} from 'botbuilder'; +import { + DialogTurnResult, + TextPrompt, + WaterfallDialog, + WaterfallStepContext } from 'botbuilder-dialogs'; +import { ResponseManager } from 'botbuilder-solutions'; +import { SkillState } from '../models/skillState'; +import { SampleResponses } from '../responses/sample/sampleResponses'; +import { BotServices } from '../services/botServices'; +import { IBotSettings } from '../services/botSettings'; +import { SkillDialogBase } from './skillDialogBase'; + +enum DialogIds { + namePrompt = 'namePrompt' +} + +export class SampleDialog extends SkillDialogBase { + + private readonly nameKey: string = 'name'; + // Constructor + constructor( + settings: Partial, + services: BotServices, + responseManager: ResponseManager, + stateAccessor: StatePropertyAccessor, + telemetryClient: BotTelemetryClient + ) { + super(SampleDialog.name, settings, services, responseManager, stateAccessor, telemetryClient); + + const sample: ((sc: WaterfallStepContext) => Promise)[] = [ + // NOTE: Uncomment these lines to include authentication steps to this dialog + // GetAuthToken, + // AfterGetAuthToken, + this.promptForName.bind(this), + this.greetUser.bind(this), + this.end.bind(this) + ]; + + this.addDialog(new WaterfallDialog(SampleDialog.name, sample)); + this.addDialog(new TextPrompt(DialogIds.namePrompt)); + + this.initialDialogId = SampleDialog.name; + } + + public async promptForName(sc: WaterfallStepContext): Promise { + // NOTE: Uncomment the following lines to access LUIS result for this turn. + // var state = await ConversationStateAccessor.GetAsync(stepContext.Context); + // var intent = state.LuisResult.TopIntent().intent; + // var entities = state.LuisResult.Entities; + + const prompt: Partial = this.responseManager.getResponse(SampleResponses.namePrompt); + + return sc.prompt(DialogIds.namePrompt, { prompt: prompt }); + } + + public async greetUser(sc: WaterfallStepContext): Promise { + const tokens: Map = new Map(); + tokens.set(this.nameKey, sc.result); + + //tslint:disable-next-line: no-any + const response: any = this.responseManager.getResponse(SampleResponses.haveNameMessage, tokens); + // tslint:disable-next-line: no-unsafe-any + await sc.context.sendActivity(response); + + return sc.next(); + } + + public async end(sc: WaterfallStepContext): Promise { + return sc.endDialog(); + } +} diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/index.ts b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/index.ts new file mode 100644 index 0000000000..38407b70ba --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/index.ts @@ -0,0 +1,187 @@ +/** + * Copyright(c) Microsoft Corporation.All rights reserved. + * Licensed under the MIT License. + */ + +import { TelemetryClient } from 'applicationinsights'; +import { + BotFrameworkAdapter, + BotFrameworkAdapterSettings, + ConversationState, + StatePropertyAccessor, + TurnContext, + UserState } from 'botbuilder'; +import { + CosmosDbStorage, + CosmosDbStorageSettings } from 'botbuilder-azure'; +import { + Dialog, + DialogState } from 'botbuilder-dialogs'; +import { + IAuthenticationConnection, + ISkillManifest, + SkillContext, + SkillHttpAdapter} from 'botbuilder-skills'; +import { + ICognitiveModelConfiguration, + IOAuthConnection, + Locales, + MultiProviderAuthDialog, + ResponseManager} from 'botbuilder-solutions'; +import i18next from 'i18next'; +import i18nextNodeFsBackend from 'i18next-node-fs-backend'; +import * as path from 'path'; +import * as restify from 'restify'; +import { CustomSkillAdapter } from './adapters/customSkillAdapter'; +import { DefaultAdapter } from './adapters/defaultAdapter'; +import * as appsettings from './appsettings.json'; +import { DialogBot } from './bots/dialogBot'; +import * as cognitiveModelsRaw from './cognitivemodels.json'; +import { MainDialog } from './dialogs/mainDialog'; +import { SampleDialog } from './dialogs/sampleDialog'; +import { SkillState } from './models/skillState'; +import { MainResponses } from './responses/main/mainResponses'; +import { SampleResponses } from './responses/sample/sampleResponses'; +import { SharedResponses } from './responses/shared/sharedResponses'; +import { BotServices } from './services/botServices'; +import { IBotSettings } from './services/botSettings'; + +// Configure internationalization and default locale +i18next.use(i18nextNodeFsBackend) +.init({ + fallbackLng: 'en', + preload: [ 'de', 'en', 'es', 'fr', 'it', 'zh' ] +}) +.then(async () => { + await Locales.addResourcesFromPath(i18next, 'common'); +}); + +const cognitiveModels: Map = new Map(); +const cognitiveModelDictionary: { [key: string]: Object } = cognitiveModelsRaw.cognitiveModels; +const cognitiveModelMap: Map = new Map(Object.entries(cognitiveModelDictionary)); +cognitiveModelMap.forEach((value: Object, key: string) => { + cognitiveModels.set(key, value); +}); + +const botSettings: Partial = { + appInsights: appsettings.appInsights, + blobStorage: appsettings.blobStorage, + cognitiveModels: cognitiveModels, + cosmosDb: appsettings.cosmosDb, + defaultLocale: cognitiveModelsRaw.defaultLocale, + microsoftAppId: appsettings.microsoftAppId, + microsoftAppPassword: appsettings.microsoftAppPassword +}; +if (botSettings.appInsights === undefined) { + throw new Error('There is no appInsights value in appsettings file'); +} + +let cosmosDbStorageSettings: CosmosDbStorageSettings; +if (botSettings.cosmosDb === undefined) { + throw new Error(); +} +cosmosDbStorageSettings = { + authKey: botSettings.cosmosDb.authkey, + collectionId: botSettings.cosmosDb.collectionId, + databaseId: botSettings.cosmosDb.databaseId, + serviceEndpoint: botSettings.cosmosDb.cosmosDBEndpoint +}; + +const storage: CosmosDbStorage = new CosmosDbStorage(cosmosDbStorageSettings); +const userState: UserState = new UserState(storage); +const conversationState: ConversationState = new ConversationState(storage); +const telemetryClient: TelemetryClient = new TelemetryClient(botSettings.appInsights.instrumentationKey); +const stateAccessor: StatePropertyAccessor = userState.createProperty(SkillState.name); +const skillContextAccessor: StatePropertyAccessor = userState.createProperty(SkillContext.name); +const dialogStateAccessor: StatePropertyAccessor = userState.createProperty('DialogState'); +const adapterSettings: Partial = { + appId: botSettings.microsoftAppId, + appPassword: botSettings.microsoftAppPassword +}; +// const adapter: DefaultAdapter = new DefaultAdapter( +// botSettings, +// adapterSettings, +// userState, +// conversationState, +// telemetryClient); + +const botAdapter: CustomSkillAdapter = new CustomSkillAdapter( + botSettings, + userState, + conversationState, + telemetryClient, + skillContextAccessor, + dialogStateAccessor); +const adapter: SkillHttpAdapter = new SkillHttpAdapter( + botAdapter +); + +let bot: DialogBot; +try { + + const responseManager: ResponseManager = new ResponseManager( + ['en', 'de', 'es', 'fr', 'it', 'zh'], + [SampleResponses, MainResponses, SharedResponses]); + const botServices: BotServices = new BotServices(botSettings); + const sampleDialog: SampleDialog = new SampleDialog( + botSettings, + botServices, + responseManager, + stateAccessor, + telemetryClient + ); + const mainDialog: MainDialog = new MainDialog( + botSettings, + botServices, + responseManager, + stateAccessor, + skillContextAccessor, + sampleDialog, + telemetryClient + ); + + bot = new DialogBot(conversationState, telemetryClient, mainDialog); +} catch (err) { + throw err; +} + +// Create server +const server: restify.Server = restify.createServer(); +server.listen(3979, (): void => { + // tslint:disable-next-line:no-console + console.log(`${server.name} listening to ${server.url}`); + // tslint:disable-next-line:no-console + console.log(`Get the Emulator: https://aka.ms/botframework-emulator`); + // tslint:disable-next-line:no-console + console.log(`To talk to your bot, open your '.bot' file in the Emulator`); +}); + +// Listen for incoming requests +server.post('/api/messages', (req: restify.Request, res: restify.Response) => { + // Route received a request to adapter for processing + adapter.processActivity(req, res, async (turnContext: TurnContext) => { + // route to bot activity handler. + await bot.run(turnContext); + }); +}); + +// This method creates a MultiProviderAuthDialog based on a skill manifest. +function buildAuthDialog(skill: ISkillManifest, settings: Partial): MultiProviderAuthDialog|undefined { + if (skill.authenticationConnections !== undefined && skill.authenticationConnections.length > 0) { + if (settings.oauthConnections !== undefined) { + const oauthConnections: IOAuthConnection[] | undefined = settings.oauthConnections.filter( + (oauthConnection: IOAuthConnection) => { + return skill.authenticationConnections.some((authenticationConnection: IAuthenticationConnection) => { + return authenticationConnection.serviceProviderId === oauthConnection.provider; + }); + }); + if (oauthConnections !== undefined) { + return new MultiProviderAuthDialog(oauthConnections); + } + } else { + throw new Error(`You must configure at least one supported OAuth connection to use this skill: ${skill.name}.`); + } + } + + return undefined; +} diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/models/skillState.ts b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/models/skillState.ts new file mode 100644 index 0000000000..1a76de53a3 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/models/skillState.ts @@ -0,0 +1,13 @@ + +/** + * Copyright(c) Microsoft Corporation.All rights reserved. + * Licensed under the MIT License. + */ +import { RecognizerResult } from 'botbuilder'; + +export class SkillState { + public readonly token: string = ''; + public luisResult: RecognizerResult | undefined; + // tslint:disable-next-line: no-empty + public clear(): void {} +} diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/mainResponses.ts b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/mainResponses.ts new file mode 100644 index 0000000000..0170823dfa --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/mainResponses.ts @@ -0,0 +1,23 @@ +/** + * Copyright(c) Microsoft Corporation.All rights reserved. + * Licensed under the MIT License. + */ + +import { IResponseIdCollection } from 'botbuilder-solutions'; +import { join } from 'path'; + +/** + * Contains bot responses. + */ +export class MainResponses implements IResponseIdCollection { + // Generated accessors + public name: string = MainResponses.name; + public static pathToResource?: string = join(__dirname, 'resources'); + public static readonly welcomeMessage: string = 'WelcomeMessage'; + public static readonly helpMessage: string = 'HelpMessage'; + public static readonly greetingMessage : string = 'GreetingMessage'; + public static readonly goodbyeMessage : string = 'GoodbyeMessage'; + public static readonly logOut : string = 'LogOut'; + public static readonly featureNotAvailable : string = 'FeatureNotAvailable'; + public static readonly cancelMessage: string = 'CancelMessage'; +} diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/resources/MainResponses.de.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/resources/MainResponses.de.json similarity index 99% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/resources/MainResponses.de.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/resources/MainResponses.de.json index d614342cd8..b0e2631feb 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/resources/MainResponses.de.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/resources/MainResponses.de.json @@ -80,5 +80,4 @@ ], "inputHint": "acceptingInput" } - } - \ No newline at end of file +} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/resources/MainResponses.es.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/resources/MainResponses.es.json similarity index 99% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/resources/MainResponses.es.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/resources/MainResponses.es.json index 9633d9de99..76970f22f5 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/resources/MainResponses.es.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/resources/MainResponses.es.json @@ -80,5 +80,4 @@ ], "inputHint": "acceptingInput" } - } - \ No newline at end of file +} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/resources/MainResponses.fr.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/resources/MainResponses.fr.json similarity index 99% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/resources/MainResponses.fr.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/resources/MainResponses.fr.json index 8c5ce80039..ec24d9d5a0 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/resources/MainResponses.fr.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/resources/MainResponses.fr.json @@ -80,5 +80,4 @@ ], "inputHint": "acceptingInput" } - } - \ No newline at end of file +} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/resources/MainResponses.it.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/resources/MainResponses.it.json similarity index 99% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/resources/MainResponses.it.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/resources/MainResponses.it.json index 11e3da5c03..aa42c1cc42 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/resources/MainResponses.it.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/resources/MainResponses.it.json @@ -80,5 +80,4 @@ ], "inputHint": "acceptingInput" } - } - \ No newline at end of file +} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/resources/MainResponses.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/resources/MainResponses.json similarity index 99% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/resources/MainResponses.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/resources/MainResponses.json index 0d43e4417c..6a234ed157 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/resources/MainResponses.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/resources/MainResponses.json @@ -80,5 +80,4 @@ ], "inputHint": "acceptingInput" } - } - \ No newline at end of file +} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/resources/MainResponses.zh.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/resources/MainResponses.zh.json similarity index 99% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/resources/MainResponses.zh.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/resources/MainResponses.zh.json index 522b2243f0..23c28964fc 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/main/resources/MainResponses.zh.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/main/resources/MainResponses.zh.json @@ -79,5 +79,4 @@ ], "inputHint": "acceptingInput" } - } - \ No newline at end of file +} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/resources/SampleResponses.de.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/resources/SampleResponses.de.json similarity index 63% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/resources/SampleResponses.de.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/resources/SampleResponses.de.json index 5ccda38779..d2ed9f39e7 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/resources/SampleResponses.de.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/resources/SampleResponses.de.json @@ -11,14 +11,14 @@ "HaveNamePrompt": { "replies": [ { - "text": "Hallo, {name}!", - "speak": "Hallo, {name}!" + "text": "Hallo, {Name}!", + "speak": "Hallo, {Name}!" }, { - "text": "Schön, dich zu treffen, {name}!", - "speak": "Schön, dich zu treffen, {name}!" + "text": "Schön, dich zu treffen, {Name}!", + "speak": "Schön, dich zu treffen, {Name}!" } ], "inputHint": "acceptingInput" } - } \ No newline at end of file +} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/resources/SampleResponses.es.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/resources/SampleResponses.es.json similarity index 64% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/resources/SampleResponses.es.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/resources/SampleResponses.es.json index 6257b143a5..48d9ada000 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/resources/SampleResponses.es.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/resources/SampleResponses.es.json @@ -11,14 +11,14 @@ "HaveNameMessage": { "replies": [ { - "text": "¡Hola, {name}!", - "speak": "¡Hola, {name}!" + "text": "¡Hola, {Name}!", + "speak": "¡Hola, {Name}!" }, { - "text": "Encantado de conocerte, {name}!", - "speak": "Encantado de conocerte, {name}!" + "text": "Encantado de conocerte, {Name}!", + "speak": "Encantado de conocerte, {Name}!" } ], "inputHint": "acceptingInput" } - } \ No newline at end of file +} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/resources/SampleResponses.fr.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/resources/SampleResponses.fr.json similarity index 68% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/resources/SampleResponses.fr.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/resources/SampleResponses.fr.json index 8242311738..26066f2d93 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/resources/SampleResponses.fr.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/resources/SampleResponses.fr.json @@ -11,14 +11,14 @@ "HaveNameMessage": { "replies": [ { - "text": "Bonjour, {name}!", - "speak": "Bonjour, {name}!" + "text": "Bonjour, {Name}!", + "speak": "Bonjour, {Name}!" }, { - "text": "Enchanté, {name}!", - "speak": "Enchanté, {name}!" + "text": "Enchanté, {Name}!", + "speak": "Enchanté, {Name}!" } ], "inputHint": "acceptingInput" } - } \ No newline at end of file +} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/resources/SampleResponses.it.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/resources/SampleResponses.it.json similarity index 64% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/resources/SampleResponses.it.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/resources/SampleResponses.it.json index 5e49658602..9a998fb1d9 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/resources/SampleResponses.it.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/resources/SampleResponses.it.json @@ -11,14 +11,14 @@ "HaveNameMessage": { "replies": [ { - "text": "Ciao, {name}!", - "speak": "Ciao, {name}!" + "text": "Ciao, {Name}!", + "speak": "Ciao, {Name}!" }, { - "text": "Piacere di conoscerti, {name}!", - "speak": "Piacere di conoscerti, {name}!" + "text": "Piacere di conoscerti, {Name}!", + "speak": "Piacere di conoscerti, {Name}!" } ], "inputHint": "acceptingInput" } - } \ No newline at end of file +} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/resources/SampleResponses.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/resources/SampleResponses.json similarity index 66% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/resources/SampleResponses.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/resources/SampleResponses.json index 360eb4564a..d64b55b5a5 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/resources/SampleResponses.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/resources/SampleResponses.json @@ -11,15 +11,14 @@ "HaveNameMessage": { "replies": [ { - "text": "Hi, {name}!", - "speak": "Hi, {name}!" + "text": "Hi, {Name}!", + "speak": "Hi, {Name}!" }, { - "text": "Nice to meet you, {name}!", - "speak": "Nice to meet you, {name}!" + "text": "Nice to meet you, {Name}!", + "speak": "Nice to meet you, {Name}!" } ], "inputHint": "acceptingInput" } - } - \ No newline at end of file +} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/resources/SampleResponses.zh.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/resources/SampleResponses.zh.json similarity index 66% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/resources/SampleResponses.zh.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/resources/SampleResponses.zh.json index d9aecad5cf..7f42f81475 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/sample/resources/SampleResponses.zh.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/resources/SampleResponses.zh.json @@ -11,14 +11,14 @@ "HaveNameMessage": { "replies": [ { - "text": "嗨, {name}!", - "speak": "嗨, {name}!" + "text": "嗨, {Name}!", + "speak": "嗨, {Name}!" }, { - "text": "很高兴见到你, {name}!", - "speak": "很高兴见到你, {name}!" + "text": "很高兴见到你, {Name}!", + "speak": "很高兴见到你, {Name}!" } ], "inputHint": "acceptingInput" } - } \ No newline at end of file +} \ No newline at end of file diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/sampleResponses.ts b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/sampleResponses.ts new file mode 100644 index 0000000000..8cf8a3a179 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/sample/sampleResponses.ts @@ -0,0 +1,18 @@ +/** + * Copyright(c) Microsoft Corporation.All rights reserved. + * Licensed under the MIT License. + */ + +import { IResponseIdCollection } from 'botbuilder-solutions'; +import { join } from 'path'; + +/** + * Contains bot responses. + */ +export class SampleResponses implements IResponseIdCollection { + // Generated accessors + public name: string = SampleResponses.name; + public static pathToResource?: string = join(__dirname, 'resources'); + public static readonly namePrompt : string = 'NamePrompt'; + public static readonly haveNameMessage : string = 'HaveNameMessage'; +} diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/resources/SharedResponses.de.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/resources/SharedResponses.de.json similarity index 99% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/resources/SharedResponses.de.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/resources/SharedResponses.de.json index 8a06fa0e28..f59ee28113 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/resources/SharedResponses.de.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/resources/SharedResponses.de.json @@ -145,5 +145,4 @@ ], "inputHint": "acceptingInput" } - } - \ No newline at end of file +} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/resources/SharedResponses.es.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/resources/SharedResponses.es.json similarity index 99% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/resources/SharedResponses.es.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/resources/SharedResponses.es.json index 069f5b5834..ff904e5472 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/resources/SharedResponses.es.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/resources/SharedResponses.es.json @@ -145,5 +145,4 @@ ], "inputHint": "acceptingInput" } - } - \ No newline at end of file +} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/resources/SharedResponses.fr.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/resources/SharedResponses.fr.json similarity index 99% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/resources/SharedResponses.fr.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/resources/SharedResponses.fr.json index b20ac4f544..749402300f 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/resources/SharedResponses.fr.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/resources/SharedResponses.fr.json @@ -145,5 +145,4 @@ ], "inputHint": "acceptingInput" } - } - \ No newline at end of file +} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/resources/SharedResponses.it.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/resources/SharedResponses.it.json similarity index 99% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/resources/SharedResponses.it.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/resources/SharedResponses.it.json index be7eb37cc8..e0eb59b364 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/resources/SharedResponses.it.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/resources/SharedResponses.it.json @@ -145,5 +145,4 @@ ], "inputHint": "acceptingInput" } - } - \ No newline at end of file +} \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/resources/SharedResponses.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/resources/SharedResponses.json similarity index 99% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/resources/SharedResponses.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/resources/SharedResponses.json index 9b158968dd..7eee9b9c2e 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/resources/SharedResponses.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/resources/SharedResponses.json @@ -145,5 +145,4 @@ ], "inputHint": "acceptingInput" } - } - \ No newline at end of file + } \ No newline at end of file diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/resources/SharedResponses.zh.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/resources/SharedResponses.zh.json similarity index 99% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/resources/SharedResponses.zh.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/resources/SharedResponses.zh.json index ef8a800e2c..ecc0c5e6fe 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/src/dialogs/shared/resources/SharedResponses.zh.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/resources/SharedResponses.zh.json @@ -97,5 +97,4 @@ ], "inputHint": "acceptingInput" } - } - \ No newline at end of file +} \ No newline at end of file diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/sharedResponses.ts b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/sharedResponses.ts new file mode 100644 index 0000000000..3c2732a0d2 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/responses/shared/sharedResponses.ts @@ -0,0 +1,22 @@ +/** + * Copyright(c) Microsoft Corporation.All rights reserved. + * Licensed under the MIT License. + */ + +import { IResponseIdCollection } from 'botbuilder-solutions'; +import { join } from 'path'; + +/** + * Contains bot responses. + */ +export class SharedResponses implements IResponseIdCollection { + // Generated accessors + public name: string = SharedResponses.name; + public static pathToResource?: string = join(__dirname, 'resources'); + public static readonly didntUnderstandMessage : string = 'DidntUnderstandMessage'; + public static readonly cancellingMessage : string = 'CancellingMessage'; + public static readonly noAuth : string = 'NoAuth'; + public static readonly authFailed : string = 'AuthFailed'; + public static readonly actionEnded : string = 'ActionEnded'; + public static readonly errorMessage : string = 'ErrorMessage'; +} diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/services/botServices.ts b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/services/botServices.ts new file mode 100644 index 0000000000..e19ca88be2 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/services/botServices.ts @@ -0,0 +1,48 @@ +/** + * Copyright(c) Microsoft Corporation.All rights reserved. + * Licensed under the MIT License. + */ + +import { LuisApplication } from 'botbuilder-ai'; +import { + ICognitiveModelConfiguration, + ICognitiveModelSet, + TelemetryLuisRecognizer } from 'botbuilder-solutions'; +import { LuisService } from 'botframework-config'; +import { IBotSettings } from './botSettings'; + +export class BotServices { + + public cognitiveModelSets: Map> = new Map(); + + constructor(settings: Partial) { + try { + if (settings.cognitiveModels !== undefined) { + + settings.cognitiveModels.forEach((value: ICognitiveModelConfiguration, key: string) => { + const language: string = key; + const config: ICognitiveModelConfiguration = value; + const cognitiveModelSet: Partial = { + luisServices: new Map() + }; + + config.languageModels.forEach((model: LuisService) => { + const luisService: LuisService = new LuisService(model); + const luisApp: LuisApplication = { + applicationId: luisService.appId, + endpointKey: luisService.subscriptionKey, + endpoint: luisService.getEndpoint() + }; + if (cognitiveModelSet.luisServices !== undefined) { + cognitiveModelSet.luisServices.set(luisService.id, new TelemetryLuisRecognizer(luisApp)); + } + }); + + this.cognitiveModelSets.set(language, cognitiveModelSet); + }); + } + } catch (err) { + throw new Error(err); + } + } +} diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/services/botSettings.ts b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/services/botSettings.ts new file mode 100644 index 0000000000..5f951f6bf7 --- /dev/null +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/src/services/botSettings.ts @@ -0,0 +1,10 @@ +/** + * Copyright(c) Microsoft Corporation.All rights reserved. + * Licensed under the MIT License. + */ +import { IBotSettingsBase } from 'botbuilder-solutions'; + +// tslint:disable-next-line: no-empty-interface +export interface IBotSettings extends IBotSettingsBase { + +} diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/tsconfig.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/tsconfig.json similarity index 98% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/tsconfig.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/tsconfig.json index e349762cc7..f133e0320a 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/tsconfig.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/tsconfig.json @@ -44,7 +44,7 @@ // "types": [], /* Type declaration files to be included in compilation. */ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ "resolveJsonModule": true, /* Include modules imported with .json extension. */ - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ /* Source Map Options */ diff --git a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/tslint.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/tslint.json similarity index 71% rename from templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/tslint.json rename to templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/tslint.json index 0b718d3d26..a177ef07ec 100644 --- a/templates/Skill-Template/typescript/generator-botbuilder-skill/generators/app/templates/customSkill/tslint.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/generators/skill/templates/customSkill/tslint.json @@ -4,10 +4,10 @@ "tslint:recommended", "tslint-microsoft-contrib" ], - "linterOptions": { - "exclude": [ - "src/**/resources/*" - ] + "linterOptions":{ + "exclude": [ + "src/dialogs/shared/resources/*" + ] }, "rules": { "function-name": [ true, @@ -17,7 +17,8 @@ ], "linebreak-style": [false], "member-ordering": [false], - "no-relative-imports": [false] + "no-relative-imports": [false], + "completed-docs": [false] }, "rulesDirectory": [ "node_modules/tslint-microsoft-contrib" diff --git a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/package.json b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/package.json index ac0911e432..9d740be69e 100644 --- a/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/package.json +++ b/templates/Virtual-Assistant-Template/typescript/generator-botbuilder-assistant/package.json @@ -9,6 +9,7 @@ "files": [ "generators", "app", + "skill", ".gitignore", ".npmignore" ], @@ -17,6 +18,7 @@ "botbuilder", "VA", "bots", + "skills", "bot framework", "Microsoft AI", "yeoman-generator",