diff --git a/package.json b/package.json index 838fa508..d1bd047c 100644 --- a/package.json +++ b/package.json @@ -10,4 +10,4 @@ "build": "lerna run build", "viewTestResults": "node packages\\ui\\src\\testResultReporting\\TestResultAnalyzer.js" } -} \ No newline at end of file +} diff --git a/packages/samples/cards/prompt.json b/packages/samples/cards/prompt.json deleted file mode 100644 index 6b6c4361..00000000 --- a/packages/samples/cards/prompt.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", - "type": "AdaptiveCard", - "version": "1.0", - "speak": "{{speak}}", - "body": [ - { - "type": "TextBlock", - "text": "{{question}}", - "size": "large", - "weight": "bolder" - } - ], - "actions": [ - { - "type": "Action.Submit", - "title": "{{button1}}", - "data": "{{button1}}" - }, - { - "type": "Action.Submit", - "title": "{{button2}}", - "data": "{{button2}}" - } - ] - } \ No newline at end of file diff --git a/packages/samples/cards/promptWithPicture.json b/packages/samples/cards/promptWithPicture.json deleted file mode 100644 index 43104778..00000000 --- a/packages/samples/cards/promptWithPicture.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", - "type": "AdaptiveCard", - "version": "1.0", - "speak": "See the card below for choices.", - "body": [ - { - "type": "TextBlock", - "text": "{{title}}", - "size": "large", - "weight": "bolder" - }, - { - "type": "ColumnSet", - "columns": [ - { - "type": "Column", - "width": "auto", - "items": [ - { - "type": "Image", - "url": "{{image}}", - "size": "medium" - } - ] - }, - { - "type": "Column", - "width": "stretch", - "items": [ - { - "type": "TextBlock", - "text": "{{line1}}", - "size": "medium", - "spacing": "none" - }, - { - "type": "TextBlock", - "isSubtle": true, - "text": "{{line2}}", - "spacing": "none" - }, - { - "type": "TextBlock", - "isSubtle": true, - "text": "{{line3}}", - "spacing": "none" - } - ] - } - ] - } - ], - "actions": [ - { - "type": "Action.Submit", - "title": "{{button1}}", - "data": "{{button1}}" - }, - { - "type": "Action.Submit", - "title": "{{button2}}", - "data": "{{button2}}" - } - ] - } \ No newline at end of file diff --git a/packages/samples/lg/prompt.lg b/packages/samples/lg/prompt.lg new file mode 100644 index 00000000..8a96ba48 --- /dev/null +++ b/packages/samples/lg/prompt.lg @@ -0,0 +1,5 @@ +# prompt +[HeroCard + text = @{question} + buttons = @{button1} | @{button2} +] diff --git a/packages/samples/lg/promptWithPicture.lg b/packages/samples/lg/promptWithPicture.lg new file mode 100644 index 00000000..a4496959 --- /dev/null +++ b/packages/samples/lg/promptWithPicture.lg @@ -0,0 +1,8 @@ +# prompt +[ThumbnailCard + title = @{title} + subtitle = @{line1} + text = @{line2} | @{line3} + images = @{image} + buttons = @{button1} | @{button2} +] diff --git a/packages/samples/package-lock.json b/packages/samples/package-lock.json index 2ed53e1e..90f6d282 100644 --- a/packages/samples/package-lock.json +++ b/packages/samples/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@azure/cosmos": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@azure/cosmos/-/cosmos-3.5.2.tgz", - "integrity": "sha512-RFVydMRoPsR2xn4DgBXeCTcqDQNK7hZS4qLDDXM6PdkAQ+avtcz2AkPAoTsJzqmuvUm7/AwFEV3ysy7isqFckQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@azure/cosmos/-/cosmos-3.5.3.tgz", + "integrity": "sha512-lMXzL/KmCjhjD3wXucr8TZwHO3dJht2AL4fts4DppNrk0uFPl9PesAFNHmvaAibi76M5eScUBvSQfOQ+pR/OLw==", "requires": { "@types/debug": "^4.1.4", "debug": "^4.1.1", @@ -17,7 +17,7 @@ "os-name": "^3.1.0", "priorityqueuejs": "^1.0.0", "semaphore": "^1.0.5", - "tslib": "^1.9.3", + "tslib": "^1.10.0", "uuid": "^3.3.2" }, "dependencies": { @@ -78,18 +78,18 @@ } }, "@conversationlearner/models": { - "version": "0.501.0", - "resolved": "https://registry.npmjs.org/@conversationlearner/models/-/models-0.501.0.tgz", - "integrity": "sha512-vu8U76EINHfww4eYZ2lXHttzlO1RWBbta7cW5+0c1n1Quq3jDu4yGSgy7I5ztRTFT8L18Yw0alfnpbagiHbKnQ==" + "version": "0.501.2", + "resolved": "https://registry.npmjs.org/@conversationlearner/models/-/models-0.501.2.tgz", + "integrity": "sha512-zyENpy3aprNzDfcyM0ylPSJ/MKSBxiDEUUa36rDisAxbeIN1ayU4c2PKYOTqTKomfC/PNMSgB2XnKz2E5b6lEw==" }, "@conversationlearner/sdk": { - "version": "0.501.0", - "resolved": "https://registry.npmjs.org/@conversationlearner/sdk/-/sdk-0.501.0.tgz", - "integrity": "sha512-Q6a7CkE1mTepTPRM7x7VAAiGp1EZGmUPSIxVqUdgQ6yMdn/gaCRJ7v5tZpeWzKErxLFgKgZ/gmQlYtdxxn1Bug==", + "version": "0.501.15", + "resolved": "https://registry.npmjs.org/@conversationlearner/sdk/-/sdk-0.501.15.tgz", + "integrity": "sha512-c1Sy7+XaGKuNcWgpK79dC0Uf9TQgeOjXAJSR+zQESEfOkBGFBAFKJhsSF77CYiQwL+HtP5H7BpoZtpoQcL7fNQ==", "requires": { "@azure/cosmos": "^3.3.6", - "@conversationlearner/models": "^0.501.0", - "@conversationlearner/ui": "^0.501.0", + "@conversationlearner/models": "^0.501.2", + "@conversationlearner/ui": "^0.501.15", "@types/supertest": "2.0.4", "async-file": "^2.0.2", "body-parser": "1.18.3", @@ -168,9 +168,9 @@ } }, "@conversationlearner/ui": { - "version": "0.501.0", - "resolved": "https://registry.npmjs.org/@conversationlearner/ui/-/ui-0.501.0.tgz", - "integrity": "sha512-vzSuNCWBr5nCjCYSB5g2H6YmB358CGL5E52HBSc9QlAK8Jr6VwiGFRsvzpTDvo/nRgddmsN/HKefQpBaD6U9sg==" + "version": "0.501.15", + "resolved": "https://registry.npmjs.org/@conversationlearner/ui/-/ui-0.501.15.tgz", + "integrity": "sha512-aS1F6dM5P7f6p+l9rCZcdRIk7UsYorZZfq7yA517OSBuPjsfe2vqppLj4FBunIt2t5k6SjCU65PXJQu2XVHw5Q==" }, "@kyleshockey/object-assign-deep": { "version": "0.4.2", @@ -2737,7 +2737,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -2758,12 +2759,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2778,17 +2781,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -2905,7 +2911,8 @@ "inherits": { "version": "2.0.4", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2917,6 +2924,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2931,6 +2939,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2938,12 +2947,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.9.0", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -2962,6 +2973,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -3051,7 +3063,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -3063,6 +3076,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -3148,7 +3162,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -3184,6 +3199,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -3203,6 +3219,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -3246,12 +3263,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -5131,9 +5150,9 @@ } }, "marked": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", - "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==" + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.0.tgz", + "integrity": "sha512-MyUe+T/Pw4TZufHkzAfDj6HarCBWia2y27/bhuYkTaiUnfDYFnCP3KUN+9oM7Wi6JA2rymtVYbQu3spE0GCmxQ==" }, "math-random": { "version": "1.0.4", @@ -7902,20 +7921,20 @@ } }, "typedoc": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.15.5.tgz", - "integrity": "sha512-AKXLtOUCLRlSTyfXQHYp3LFPy6RiFLnxnKS5z1jwQsYXmCPbHWuhmfgS264Es2hPMZjzvHqk/ZQDzCBpb49u6w==", + "version": "0.15.6", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.15.6.tgz", + "integrity": "sha512-TC3j7HXFfyq0/NyUL9oLgEXhgO4U8Kd7iyRgagkG3XxehgTjn6w20uJ/Hif1KPB/65VQZ8uMYYyxFXNj9um5Ow==", "requires": { "@types/minimatch": "3.0.3", "fs-extra": "^8.1.0", "handlebars": "^4.5.3", "highlight.js": "^9.17.1", "lodash": "^4.17.15", - "marked": "^0.7.0", + "marked": "^0.8.0", "minimatch": "^3.0.0", "progress": "^2.0.3", "shelljs": "^0.8.3", - "typedoc-default-themes": "^0.6.2", + "typedoc-default-themes": "^0.6.3", "typescript": "3.7.x" }, "dependencies": { @@ -7932,9 +7951,9 @@ } }, "typedoc-default-themes": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.6.2.tgz", - "integrity": "sha512-+O+1aHjVIpDLsbkIDkZSNu+kutqmg7WdzahT+4KwBC/95mUgAb0xkbwdPpEJEpRX0ov1UJoCmvEPb1/VHxnTuw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.6.3.tgz", + "integrity": "sha512-rouf0TcIA4M2nOQFfC7Zp4NEwoYiEX4vX/ZtudJWU9IHA29MPC+PPgSXYLPESkUo7FuB//GxigO3mk9Qe1xp3Q==", "requires": { "backbone": "^1.4.0", "jquery": "^3.4.1", diff --git a/packages/sdk/package-lock.json b/packages/sdk/package-lock.json index d350f413..0402711b 100644 --- a/packages/sdk/package-lock.json +++ b/packages/sdk/package-lock.json @@ -536,14 +536,14 @@ } }, "@conversationlearner/models": { - "version": "0.501.0", - "resolved": "https://registry.npmjs.org/@conversationlearner/models/-/models-0.501.0.tgz", - "integrity": "sha512-vu8U76EINHfww4eYZ2lXHttzlO1RWBbta7cW5+0c1n1Quq3jDu4yGSgy7I5ztRTFT8L18Yw0alfnpbagiHbKnQ==" + "version": "0.501.2", + "resolved": "https://registry.npmjs.org/@conversationlearner/models/-/models-0.501.2.tgz", + "integrity": "sha512-zyENpy3aprNzDfcyM0ylPSJ/MKSBxiDEUUa36rDisAxbeIN1ayU4c2PKYOTqTKomfC/PNMSgB2XnKz2E5b6lEw==" }, "@conversationlearner/ui": { - "version": "0.501.0", - "resolved": "https://registry.npmjs.org/@conversationlearner/ui/-/ui-0.501.0.tgz", - "integrity": "sha512-vzSuNCWBr5nCjCYSB5g2H6YmB358CGL5E52HBSc9QlAK8Jr6VwiGFRsvzpTDvo/nRgddmsN/HKefQpBaD6U9sg==" + "version": "0.501.15", + "resolved": "https://registry.npmjs.org/@conversationlearner/ui/-/ui-0.501.15.tgz", + "integrity": "sha512-aS1F6dM5P7f6p+l9rCZcdRIk7UsYorZZfq7yA517OSBuPjsfe2vqppLj4FBunIt2t5k6SjCU65PXJQu2XVHw5Q==" }, "@jest/console": { "version": "24.3.0", @@ -1354,6 +1354,11 @@ "rimraf": "^2.5.2" } }, + "@microsoft/recognizers-text-data-types-timex-expression": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@microsoft/recognizers-text-data-types-timex-expression/-/recognizers-text-data-types-timex-expression-1.1.4.tgz", + "integrity": "sha512-2vICaEJfV9EpaDKs5P1PLAEs+WpNqrtpkl7CLsmc5gKmxgpQtsojG4tk6km5JRKg1mYuLV5ZzJ/65oOEeyTMvQ==" + }, "@types/babel__core": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.0.tgz", @@ -1548,6 +1553,11 @@ "@types/node": "*" } }, + "@types/lru-cache": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.0.tgz", + "integrity": "sha512-RaE0B+14ToE4l6UqdarKPnXwVDuigfFv+5j9Dze/Nqr23yyuqdNvzcZi3xB+3Agvi5R4EOgAksfv3lXX4vBt9w==" + }, "@types/mime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", @@ -1559,6 +1569,14 @@ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, + "@types/moment-timezone": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/@types/moment-timezone/-/moment-timezone-0.5.12.tgz", + "integrity": "sha512-hnHH2+Efg2vExr/dSz+IX860nSiyk9Sk4pJF2EmS11lRpMcNXeB4KBW5xcgw2QPsb9amTXdsVNEe5IoJXiT0uw==", + "requires": { + "moment": ">=2.14.0" + } + }, "@types/node": { "version": "12.12.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.6.tgz", @@ -1648,8 +1666,7 @@ "@types/xmldom": { "version": "0.1.29", "resolved": "https://registry.npmjs.org/@types/xmldom/-/xmldom-0.1.29.tgz", - "integrity": "sha1-xEKLDKhtO4gUdXJv2UmAs4onw4E=", - "dev": true + "integrity": "sha1-xEKLDKhtO4gUdXJv2UmAs4onw4E=" }, "@types/yargs": { "version": "12.0.10", @@ -1792,6 +1809,11 @@ "color-convert": "^1.9.0" } }, + "antlr4ts": { + "version": "0.5.0-alpha.1", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.1.tgz", + "integrity": "sha512-LU5FLWq2fUwg2cTL/DeIL16ucUm5jv6SNVFoMjbYLviXAp6p5g1ZzkTAnWiOKX/muEEy0PY78perPj6WUBSQCw==" + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -2524,6 +2546,13 @@ "qs": "6.5.2", "raw-body": "2.3.3", "type-is": "~1.6.16" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + } } }, "botbuilder": { @@ -2565,6 +2594,39 @@ "botframework-schema": "^4.4.0" } }, + "botbuilder-lg": { + "version": "4.7.0-preview", + "resolved": "https://registry.npmjs.org/botbuilder-lg/-/botbuilder-lg-4.7.0-preview.tgz", + "integrity": "sha512-36gjejivxsYHcKdM2a3HuhHcXYK6AD274tNtvewIpXghAFZ4z8fJO/U7Kz55xk3EGTwhViSjgwBdI7UHBLMKkQ==", + "requires": { + "antlr4ts": "0.5.0-alpha.1", + "botbuilder-core": "4.7.0", + "botframework-expressions": "4.7.0-preview", + "lodash": "^4.17.11", + "uuid": "^3.3.3" + }, + "dependencies": { + "botbuilder-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/botbuilder-core/-/botbuilder-core-4.7.0.tgz", + "integrity": "sha512-Wukm9Ui5hLWQpjgZQUnGruN0yx+aC9HjIpCEDdcmsLOZ3hXN9YW9NqLbvzfjP43h8BywqFWQt+q3qSI/1aP86Q==", + "requires": { + "assert": "^1.4.1", + "botframework-schema": "4.7.0" + } + }, + "botframework-schema": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/botframework-schema/-/botframework-schema-4.7.0.tgz", + "integrity": "sha512-xtmp9Jg3BO2G5THpiPAiFV9oNct/E44BE+J+/SViivNYaM9fLv9QiwNSIxCf1Dn/2X6mQEX5UyBk7Yr+uTq9yA==" + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + } + } + }, "botframework-connector": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/botframework-connector/-/botframework-connector-4.4.0.tgz", @@ -2604,6 +2666,37 @@ } } }, + "botframework-expressions": { + "version": "4.7.0-preview", + "resolved": "https://registry.npmjs.org/botframework-expressions/-/botframework-expressions-4.7.0-preview.tgz", + "integrity": "sha512-313i0tze1qbq466o2YbwWXS9z14+j2d97IlFxJpBVQZd3nCavkAzBb4qYZyqJyWyTaifuZnQ3JLRm2XcjubUBA==", + "requires": { + "@microsoft/recognizers-text-data-types-timex-expression": "^1.1.4", + "@types/moment-timezone": "^0.5.12", + "@types/xmldom": "^0.1.29", + "antlr4ts": "0.5.0-alpha.1", + "jspath": "^0.4.0", + "lodash": "^4.17.15", + "lru-cache": "^5.1.1", + "moment": "2.24.0", + "moment-timezone": "^0.5.25" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, "botframework-schema": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/botframework-schema/-/botframework-schema-4.4.0.tgz", @@ -4529,7 +4622,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -4550,12 +4644,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4570,17 +4666,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -4697,7 +4796,8 @@ "inherits": { "version": "2.0.4", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -4709,6 +4809,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4723,6 +4824,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4730,12 +4832,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.9.0", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -4754,6 +4858,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -4843,7 +4948,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -4855,6 +4961,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -4940,7 +5047,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -4976,6 +5084,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -4995,6 +5104,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5038,12 +5148,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -8184,6 +8296,11 @@ "xtend": "^4.0.1" } }, + "jspath": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/jspath/-/jspath-0.4.0.tgz", + "integrity": "sha512-2/R8wkot8NCXrppBT/onp+4mcAUAZqtPxsW6aSJU3hrFAVqKqtFYcat2XJZ7inN4RtATUxfv0UQSYOmvJKiIGA==" + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -8705,6 +8822,19 @@ "minimist": "0.0.8" } }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "moment-timezone": { + "version": "0.5.27", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.27.tgz", + "integrity": "sha512-EIKQs7h5sAsjhPCqN6ggx6cEbs94GK050254TIJySD1bzoM5JTYDwAU1IoVOeTOL6Gm27kYJ51/uuvq1kIlrbw==", + "requires": { + "moment": ">= 2.9.0" + } + }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -9548,9 +9678,9 @@ "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz", + "integrity": "sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==" }, "querystring": { "version": "0.2.0", @@ -9780,6 +9910,11 @@ "uuid": "^3.1.0" }, "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, "tough-cookie": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 49ec352e..255bd1af 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -41,10 +41,12 @@ "@azure/cosmos": "^3.3.6", "@conversationlearner/models": "^0.501.2", "@conversationlearner/ui": "^0.501.15", + "@types/lru-cache": "^5.1.0", "@types/supertest": "2.0.4", "async-file": "^2.0.2", "body-parser": "1.18.3", "botbuilder": "4.4.0", + "botbuilder-lg": "^4.7.0-preview", "cors": "2.8.4", "express": "4.16.3", "filenamify": "^2.0.0", @@ -115,4 +117,4 @@ "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" } } -} +} \ No newline at end of file diff --git a/packages/sdk/src/CLRunner.ts b/packages/sdk/src/CLRunner.ts index 055d23d5..a57d2507 100644 --- a/packages/sdk/src/CLRunner.ts +++ b/packages/sdk/src/CLRunner.ts @@ -1618,15 +1618,12 @@ export class CLRunner { return `ERROR: Missing Entity value(s) for ${missingEntities.map(me => me.parameter).join(', ')}` } - const form = await TemplateProvider.RenderTemplate(cardAction.templateName, renderedArguments) + const activity = await TemplateProvider.RenderTemplate(cardAction.templateName, renderedArguments, entityDisplayValues) - if (form == null) { + if (activity == null) { return CLDebug.Error(`Missing Template: ${cardAction.templateName}`) } - const attachment = BB.CardFactory.adaptiveCard(form) - const message = BB.MessageFactory.attachment(attachment) - message.text = undefined - return message + return activity } catch (error) { let msg = CLDebug.Error(error, 'Card Template or arguments are invalid. Unable to render template') return msg diff --git a/packages/sdk/src/TemplateProvider.ts b/packages/sdk/src/TemplateProvider.ts index 2d301249..436fe0f0 100644 --- a/packages/sdk/src/TemplateProvider.ts +++ b/packages/sdk/src/TemplateProvider.ts @@ -6,51 +6,91 @@ import * as fs from 'fs' import * as path from 'path' import { Template, TemplateVariable, RenderedActionArgument } from '@conversationlearner/models' import { CLDebug } from './CLDebug' +import { TemplateEngine, ActivityFactory } from 'botbuilder-lg' /** - * Provider for rendering templates + * Provider for rendering LG templates. */ export class TemplateProvider { + private static hasSubmitError = false + public static LGTemplateDirectory(): string | null { + const cwd = process.cwd() + const lgDirectoryName = "lg" + // TODO - make this configurable. + let templateDirectory = path.join(cwd, `./${lgDirectoryName}`) + if (fs.existsSync(templateDirectory)) { + return templateDirectory + } + // Try up a directory or two as could be in /lib or /dist folder depending on deployment + templateDirectory = path.join(cwd, `../${lgDirectoryName}`) + if (fs.existsSync(templateDirectory)) { + return templateDirectory + } + templateDirectory = path.join(cwd, `../../${lgDirectoryName}`) + if (fs.existsSync(templateDirectory)) { + return templateDirectory + } + return null + } + // TODO: Decouple template renderer from types from Action classes // E.g. use generic key,value object instead of RenderedActionArgument - public static async RenderTemplate(templateName: string, templateArguments: RenderedActionArgument[]): Promise { - let template = this.GetTemplate(templateName) - if (template === null) { + public static async RenderTemplate(templateName: string, templateArguments: RenderedActionArgument[], entityDisplayValues: Map): Promise { + const templateDirectory = this.LGTemplateDirectory() + if (templateDirectory === null) { return null } - let templateString = JSON.stringify(template) - let argumentNames = this.GetArgumentNames(templateString) - - // Substitute argument values - for (let argumentName of argumentNames) { - let renderedActionArgument = templateArguments.find(a => a.parameter == argumentName) - if (renderedActionArgument) { - templateString = templateString.replace(new RegExp(`{{${argumentName}}}`, 'g'), renderedActionArgument.value ?? '') - } + const renderingParameters = {} + // Copy parameters defined in the action to our rendering parameters. + for (const templateArgument of templateArguments) { + renderingParameters[templateArgument.parameter] = templateArgument.value } - templateString = this.RemoveEmptyArguments(templateString) - return JSON.parse(templateString) + // Copy entities in memory to our rendering parameters. + entityDisplayValues.forEach((value: string, key: string) => { renderingParameters[key] = value }) + + // Load the template. Currently, we assume that each lg file only has one template. + const lgFilename = path.join(templateDirectory, templateName + ".lg") + const engine = new TemplateEngine().addFile(lgFilename) + const output = engine.evaluateTemplate(engine.templates[0].name, renderingParameters) + return ActivityFactory.createActivity(output) } public static GetTemplates(): Template[] { - let templates: Template[] = [] - let files = this.GetTemplatesNames() - for (let file of files) { - let fileContent = this.GetTemplate(file) - - // Clear submit check (will the set by extracting template variables) - this.hasSubmitError = false - let tvs = this.UniqueTemplateVariables(fileContent) + const files = this.GetTemplatesNames() + if (files.length === 0) { + return [] + } + const templateDirectory = this.LGTemplateDirectory() + if (templateDirectory === null) { + throw new Error("Could not find valid template directory") + } + const templates: Template[] = [] + for (const file of files) { + const fileName = path.join(templateDirectory, `${file}.lg`) + const engine = new TemplateEngine().addFile(fileName) + let templateBody = '' + if (file.includes('AdaptiveCard')) { + templateBody = engine.templates[1].body + templateBody = templateBody.replace("- ```\r\n", "").replace("```", "") + for (const symbol of engine.templates[1].parameters) { + const sourceText = '@{' + symbol + '}' + const replaceText = '{{' + symbol + '}}' + templateBody = templateBody.replace(sourceText, replaceText) + } + } - // Make sure template has submit item - let validationError = this.hasSubmitError + const validationError = this.hasSubmitError ? `Template "${file}" has an "Action.Submit" item but no data. Submit item must be of the form: "type": "Action.Submit", "data": string` : null - let templateBody = JSON.stringify(fileContent) - let template: Template = { + const tvs: TemplateVariable[] = [] + for (let par of engine.templates[0].parameters) { + tvs.push({ key: par, type: 'lg' }) + } + + const template: Template = { name: file, variables: tvs, body: templateBody, @@ -62,132 +102,18 @@ export class TemplateProvider { return templates } - private static UniqueTemplateVariables(template: any): TemplateVariable[] { - // Get all template variables - let templateVariables = this.GetTemplateVariables(template) - - // Make entries unique, and use verion with existing type - let unique = [] - for (let tv of templateVariables) { - let existing = unique.find(i => i.key == tv.key) - if (existing) { - if (existing.type != null && tv.type != null && existing.type != tv.type) { - CLDebug.Error( - `Template variable "${tv.key}" used for two diffent types - "${tv.type}" and "${existing.type}". Ignoring.` - ) - } else { - existing.type = existing.type || tv.type - } - } else { - unique.push(tv) - } - } - return unique - } - - public static RemoveEmptyArguments(formString: string) { - return formString.replace(/{{\s*[\w\.]+\s*}}/g, '') - } - - public static GetArgumentNames(formString: string) { - // Get set of unique entities - let mustaches = formString.match(/{{\s*[\w\.]+\s*}}/g) - if (mustaches) { - let entities = [...new Set(mustaches.map(x => x.match(/[\w\.]+/)![0]))] - return entities - } - return [] - } - - public static TemplateDirectory(): string { - //TODO - make this configurable - let templateDirectory = path.join(process.cwd(), './cards') - - // Try up a directory or two as could be in /lib or /dist folder depending on deployment - if (!fs.existsSync(templateDirectory)) { - templateDirectory = path.join(process.cwd(), '../cards') - } - if (!fs.existsSync(templateDirectory)) { - templateDirectory = path.join(process.cwd(), '../../cards') - } - return templateDirectory - } - - public static GetTemplate(templateName: string): any { - - const filename = path.join(this.TemplateDirectory(), `${templateName}.json`) - - try { - const templateString = fs.readFileSync(filename, 'utf-8') - - try { - const template = JSON.parse(templateString) - return template - } catch { - CLDebug.Error(`Invalid JSON: Failed to Parse template named "${templateName}"`) - return null - } - - } catch { - CLDebug.Error(`Can't find template named: "${filename}"`) - } - } - public static GetTemplatesNames(): string[] { - try { - let fileNames: string[] = fs.readdirSync(this.TemplateDirectory()) - fileNames = fileNames.filter(fn => fn.endsWith('.json')) - let templates = fileNames.map(f => f.slice(0, f.lastIndexOf('.'))) - return templates - } catch { - CLDebug.Log("No Card directory found") + const templateDirectory = this.LGTemplateDirectory() + if (templateDirectory === null) { return [] } - } - - private static GetVarNames(template: any): string[] { - let mustaches: string[] = [] - for (let i in template) { - if (typeof template[i] != 'object') { - let searchStr = JSON.stringify(template[i]) - let results = searchStr.match(/{{\s*[\w\.]+\s*}}/g) - if (results) { - mustaches = mustaches.concat(results.map(x => x.match(/[\w\.]+/)![0])) - } - } - } - return mustaches - } - - private static GetTemplateVariables(template: any): TemplateVariable[] { - let tvs: TemplateVariable[] = [] - if (template?.type === "Action.Submit" && (typeof template.data !== 'string')) { - this.hasSubmitError = true - } - - // Get variable names - let vars = this.GetVarNames(template) - if (vars.length > 0) { - for (let key of vars) { - let tv: TemplateVariable = { key: key, type: template['type'] } - tvs.push(tv) - } - } - - // Iterate through keys - for (let i in template) { - if (!template.hasOwnProperty(i)) { - continue - } - if (template[i] instanceof Array) { - for (let item of template[i]) { - tvs = tvs.concat(this.GetTemplateVariables(item)) - } - } else if (typeof template[i] == 'object') { - tvs = tvs.concat(this.GetTemplateVariables(template[i])) - } + try { + let fileNames: string[] = fs.readdirSync(templateDirectory) + fileNames = fileNames.filter(fn => fn.endsWith('.lg')) + return fileNames.map(f => f.slice(0, f.lastIndexOf('.'))) + } catch (e) { + CLDebug.Log("No valid LG directory found") + return [] } - - return tvs } } diff --git a/packages/ui/package-lock.json b/packages/ui/package-lock.json index ec93f6ff..f0f9b65d 100644 --- a/packages/ui/package-lock.json +++ b/packages/ui/package-lock.json @@ -102,13 +102,15 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true + "dev": true, + "optional": true }, "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, + "optional": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -127,6 +129,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, + "optional": true, "requires": { "is-extendable": "^0.1.0" } @@ -310,6 +313,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, + "optional": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -322,6 +326,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, + "optional": true, "requires": { "is-extendable": "^0.1.0" } @@ -387,7 +392,8 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "dev": true, + "optional": true }, "is-glob": { "version": "4.0.0", @@ -404,6 +410,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" }, @@ -413,6 +420,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, + "optional": true, "requires": { "is-buffer": "^1.1.5" } @@ -423,7 +431,8 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "dev": true, + "optional": true }, "micromatch": { "version": "3.1.10", @@ -1772,36 +1781,6 @@ "find-up": "^2.1.0" } }, - "@conversationlearner/models": { - "version": "0.501.0", - "resolved": "https://registry.npmjs.org/@conversationlearner/models/-/models-0.501.0.tgz", - "integrity": "sha512-vu8U76EINHfww4eYZ2lXHttzlO1RWBbta7cW5+0c1n1Quq3jDu4yGSgy7I5ztRTFT8L18Yw0alfnpbagiHbKnQ==" - }, - "@conversationlearner/webchat": { - "version": "0.501.0", - "resolved": "https://registry.npmjs.org/@conversationlearner/webchat/-/webchat-0.501.0.tgz", - "integrity": "sha512-2aMLxDVI6bSVXIh90csBYw/fcxgY2QVMMkq0i+WyLdY1WoBSNktc9dVNk/2pzRZCo9wTG4J7Rqosph+ORgz72Q==", - "requires": { - "adaptivecards": "1.2.0", - "botframework-directlinejs": "0.9.17", - "core-js": "^2.5.1", - "markdown-it": "^8.4.0", - "react": "16.8.6", - "react-dom": "16.8.6", - "react-redux": "^5.1.0", - "redux": "^3.7.2", - "redux-observable": "^0.17.0", - "rxjs": "^5.5.12", - "tslib": "^1.10.0" - }, - "dependencies": { - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" - } - } - }, "@cypress/listr-verbose-renderer": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", @@ -7719,7 +7698,8 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "bundled": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -8092,7 +8072,8 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true + "bundled": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -8140,6 +8121,7 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -8178,11 +8160,13 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "bundled": true, + "optional": true }, "yallist": { "version": "3.1.1", - "bundled": true + "bundled": true, + "optional": true } } }, diff --git a/packages/webchat/package-lock.json b/packages/webchat/package-lock.json index 5c00f44a..811e859a 100644 --- a/packages/webchat/package-lock.json +++ b/packages/webchat/package-lock.json @@ -2541,7 +2541,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -2956,7 +2957,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -3012,6 +3014,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -3055,12 +3058,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -5237,7 +5242,8 @@ "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -5354,7 +5360,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -5396,6 +5403,7 @@ "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -5414,6 +5422,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -5507,6 +5516,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -5592,7 +5602,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -5628,6 +5639,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5691,12 +5703,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } },