diff --git a/README.md b/README.md index 6bb02df..40242a0 100755 --- a/README.md +++ b/README.md @@ -35,7 +35,8 @@ Rasa UI can run on your Rasa instance, or on a separate machine. Technically Ras ``` git clone https://github.com/paschmann/rasa-ui.git -cd rasaui && npm install +cd rasaui +npm install ``` ## Running diff --git a/package-lock.json b/package-lock.json index 7ef1832..2a184cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,37 @@ { "name": "RasaUI", - "version": "3.0.0", + "version": "3.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/chai": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.2.tgz", + "integrity": "sha512-8V2aCcPM3WLuJvJpF6N60uUvdZb7NHjpjQlLk1QmZbTP4XZET/FX0c3TJ3K7qt4L98FS1Pifa8BVofTVuJFWVA==", + "dev": true + }, + "@types/cookiejar": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.1.tgz", + "integrity": "sha512-aRnpPa7ysx3aNW60hTiCtLHlQaIFsXFCgQlpakNgDNVFzbtusSY8PwjAQgRWfSk0ekNoBjO51eQRB6upA9uuyw==", + "dev": true + }, + "@types/node": { + "version": "12.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.5.tgz", + "integrity": "sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w==", + "dev": true + }, + "@types/superagent": { + "version": "3.8.7", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.7.tgz", + "integrity": "sha512-9KhCkyXv268A2nZ1Wvu7rQWM+BmdYUVkycFeNnYrUL5Zwu7o8wPQ3wBfW59dDP+wuoxw0ww8YKgTNv8j/cgscA==", + "dev": true, + "requires": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -84,11 +112,37 @@ "resolved": "https://registry.npmjs.org/angular-utils-pagination/-/angular-utils-pagination-0.11.1.tgz", "integrity": "sha1-7618iHm+swrT13cH+T49DvUfLGY=" }, + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + } + } + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -127,6 +181,15 @@ } } }, + "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", @@ -165,6 +228,12 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -311,6 +380,12 @@ } } }, + "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-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -337,11 +412,68 @@ "unset-value": "^1.0.0" } }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, + "chai-http": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.3.0.tgz", + "integrity": "sha512-zFTxlN7HLMv+7+SPXZdkd5wUlK+KxH6Q7bIEMiEx0FK3zuuMqL7cwICAQ0V1+yYRozBburYuxN1qZstgHpFZQg==", + "dev": true, + "requires": { + "@types/chai": "4", + "@types/superagent": "^3.8.3", + "cookiejar": "^2.1.1", + "is-ip": "^2.0.0", + "methods": "^1.1.2", + "qs": "^6.5.1", + "superagent": "^3.7.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "chart.js": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.7.3.tgz", @@ -368,6 +500,12 @@ "color-name": "^1.0.0" } }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, "chownr": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", @@ -394,6 +532,50 @@ } } }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "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=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "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" + } + } + } + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -508,6 +690,12 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -527,6 +715,19 @@ "vary": "^1" } }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -550,16 +751,40 @@ } } }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, "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=" }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.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==" }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -632,6 +857,12 @@ "kuler": "1.0.x" } }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -654,6 +885,12 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "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 + }, "enabled": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", @@ -667,16 +904,66 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, "env-variable": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz", "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==" }, + "es-abstract": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz", + "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.0.0", + "string.prototype.trimright": "^2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, + "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=", + "dev": true + }, + "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 + }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -687,6 +974,21 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -913,6 +1215,32 @@ } } }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "dev": true + } + } + }, "follow-redirects": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", @@ -956,6 +1284,12 @@ "mime-types": "^2.1.12" } }, + "formidable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", + "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==", + "dev": true + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -987,6 +1321,12 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -1002,6 +1342,27 @@ "wide-align": "^1.1.0" } }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -1028,6 +1389,12 @@ "path-is-absolute": "^1.0.0" } }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -1042,6 +1409,27 @@ "har-schema": "^2.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -1076,6 +1464,12 @@ } } }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -1127,9 +1521,9 @@ } }, "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.2.tgz", + "integrity": "sha512-EXyErtpHbn75ZTsOADsfx6J/FPo6/5cjev46PXrcTpd8z3BoRkXgYu9/JVqrI7tusjmwCZutGeRJeU0Wo1e4Cw==", "requires": { "minimatch": "^3.0.4" } @@ -1153,6 +1547,18 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, "ipaddr.js": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", @@ -1186,6 +1592,12 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -1204,6 +1616,12 @@ } } }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -1247,6 +1665,15 @@ "is-extglob": "^2.1.1" } }, + "is-ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", + "integrity": "sha1-aO6gfooKCpTC0IDdZ0xzGrKkYas=", + "dev": true, + "requires": { + "ip-regex": "^2.0.0" + } + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -1273,11 +1700,29 @@ "isobject": "^3.0.1" } }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -1293,6 +1738,12 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", @@ -1308,6 +1759,16 @@ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.0.tgz", "integrity": "sha512-ggRCXln9zEqv6OqAGXFEcshF5dSBvCkzj6Gm2gzuR5fWawaX8t7cxKVkkygKODrDAzKdoYw3l/e3pm3vlT4IbQ==" }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -1400,6 +1861,25 @@ "colornames": "^1.1.1" } }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.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==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", @@ -1440,6 +1920,15 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, "logform": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", @@ -1459,6 +1948,15 @@ } } }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -1477,6 +1975,17 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -1525,6 +2034,12 @@ "mime-db": "~1.33.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -1539,18 +2054,18 @@ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.4.0.tgz", - "integrity": "sha512-6PmOuSP4NnZXzs2z6rbwzLJu/c5gdzYg1mRI/WIYdx45iiX7T+a4esOzavD6V/KmBzAaopFSTZPZcUx73bqKWA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.6.0.tgz", + "integrity": "sha512-OuNZ0OHrrI+jswzmgivYBZ+fAAGHZA4293d5q0z631/I9QSw3yumKB92njxHIHiB1eAdGRsE+3CcOPkoEyV5FQ==", "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.2.tgz", + "integrity": "sha512-hR3At21uSrsjjDTWrbu0IMLTpnkpv8IIMFDFaoz43Tmu4LkmAXfH44vNNzpTnf+OAQQCHrb91y/wc2J4x5XgSQ==", "requires": { "minipass": "^2.2.1" } @@ -1582,6 +2097,68 @@ "minimist": "0.0.8" } }, + "mocha": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.0.tgz", + "integrity": "sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "ms": "2.1.1", + "node-environment-flags": "1.0.5", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.2.2", + "yargs-parser": "13.0.0", + "yargs-unparser": "1.5.0" + }, + "dependencies": { + "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" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "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.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, "moment": { "version": "2.21.0", "resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz", @@ -1660,6 +2237,22 @@ "resolved": "https://registry.npmjs.org/ngstorage/-/ngstorage-0.3.11.tgz", "integrity": "sha1-FjfEW4ctkJ2cx+GLN0iY1QsuhE8=" }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-environment-flags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, "node-pre-gyp": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", @@ -1700,6 +2293,15 @@ "npm-bundled": "^1.0.1" } }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -1754,6 +2356,18 @@ } } }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -1762,6 +2376,28 @@ "isobject": "^3.0.0" } }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -1796,6 +2432,17 @@ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -1810,6 +2457,48 @@ "os-tmpdir": "^1.0.0" } }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "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==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", @@ -1820,16 +2509,34 @@ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, "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-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -1864,6 +2571,16 @@ "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -1979,6 +2696,18 @@ } } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -2099,6 +2828,21 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "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=", + "dev": true + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -2244,6 +2988,12 @@ "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 + }, "sqlite3": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.1.0.tgz", @@ -2309,6 +3059,26 @@ "strip-ansi": "^3.0.0" } }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, "string_decoder": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", @@ -2325,11 +3095,85 @@ "ansi-regex": "^2.0.0" } }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, "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=" }, + "superagent": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "dev": true, + "requires": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "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==", + "dev": true, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, "tar": { "version": "4.4.10", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", @@ -2421,6 +3265,12 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "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 + }, "type-is": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", @@ -2530,6 +3380,21 @@ "extsprintf": "^1.2.0" } }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", @@ -2597,15 +3462,180 @@ } } }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, "yallist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + }, + "yargs": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", + "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "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=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", + "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.11", + "yargs": "^12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "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=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "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" + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } } } } diff --git a/package.json b/package.json index 1cfdc5c..5003097 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "RasaUI", - "version": "3.0.0", + "version": "3.0.1", "description": "Rasa UI is a web application built on top of, and for, Rasa.", "dependencies": { "angular": "1.7.2", @@ -39,7 +39,7 @@ "db_autoupdate": "true" }, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", + "test:server": "mocha server/test/test.js --delay true --exit", "start": "node server/server.js", "dev": "nodemon server/server.js --ignore 'server/data/'" }, @@ -50,5 +50,10 @@ "repository": { "type": "git", "url": "https://github.com/paschmann/rasa-ui.git" + }, + "devDependencies": { + "chai": "^4.2.0", + "chai-http": "^4.3.0", + "mocha": "^6.2.0" } } diff --git a/server/db/actions.js b/server/db/actions.js index 086df65..41e76a3 100755 --- a/server/db/actions.js +++ b/server/db/actions.js @@ -1,14 +1,6 @@ const db = require('./db'); const logger = require('../util/logger'); -/* -if (!String.prototype.splice) { //Needed? - String.prototype.splice = function(start, delCount, newSubStr) { - return this.slice(0, start) + newSubStr + this.slice(start + Math.abs(delCount)); - }; -} -*/ - function getBotActionsAndResponses(req, res, next) { logger.winston.info('actions.getBotActionsAndResponses'); db.all('select * from actions where bot_id = ? order by action_id desc', req.query.bot_id, function(err, actions) { @@ -47,7 +39,7 @@ function createAction(req, res, next) { function removeAction(req, res, next) { - logger.winston.info('actions..removeAction'); + logger.winston.info('actions.removeAction'); db.run('delete from actions where action_id = ?', req.query.action_id, function(err) { if (err) { logger.winston.error("Error removing the record"); diff --git a/server/db/db.js b/server/db/db.js index 78576e6..a512ad4 100755 --- a/server/db/db.js +++ b/server/db/db.js @@ -1,7 +1,21 @@ const sqlite3 = require('sqlite3').verbose(); const logger = require('../util/logger'); -let db = new sqlite3.Database("server/data/db.sqlite3", (err) => { +var db_file_path = ""; + +if (process.env.npm_lifecycle_event == 'test:server') { + db_file_path = "server/test/db/test_db.sqlite3"; + try { + fs.unlinkSync(db_file_path); + //file removed + } catch(err) { + //console.error(err) + } +} else { + db_file_path = "server/data/db.sqlite3"; +} + +let db = new sqlite3.Database(db_file_path, (err) => { if (err) { logger.winston.error('Error when connecting to the Database.', err) } else { @@ -34,32 +48,34 @@ function checkDBSchema() { }); } -function createDBSchema() { +async function createDBSchema() { try { logger.winston.info("------------------------- Starting to create/update DB schema -------------------------"); - db.run("CREATE TABLE bots (bot_id INTEGER PRIMARY KEY AUTOINCREMENT, bot_name TEXT, bot_config TEXT, output_folder TEXT)", function(error) { sqlOutput(error, "bots"); }); - db.run("CREATE TABLE intents (intent_id INTEGER PRIMARY KEY AUTOINCREMENT, intent_name TEXT, bot_id INTEGER)", function(error) { sqlOutput(error, "intents"); }); - db.run("CREATE TABLE synonyms (synonym_id INTEGER PRIMARY KEY AUTOINCREMENT, synonym_reference TEXT, regex_pattern TEXT, bot_id INTEGER)", function(error) { sqlOutput(error, "synonyms"); }); - db.run("CREATE TABLE entities (entity_id INTEGER PRIMARY KEY AUTOINCREMENT, entity_name TEXT, slot_data_type TEXT, bot_id INTEGER)", function(error) { sqlOutput(error, "entities"); }); - db.run("CREATE TABLE expressions (expression_id INTEGER PRIMARY KEY AUTOINCREMENT, expression_text TEXT, intent_id INTEGER)", function(error) { sqlOutput(error, "expressions"); }); - db.run("CREATE TABLE expression_parameters (parameter_id INTEGER PRIMARY KEY AUTOINCREMENT, parameter_start INTEGER, parameter_end INTEGER, parameter_value TEXT, expression_id INTEGER, intent_id INTEGER, entity_id INTEGER)", function(error) { sqlOutput(error, "expression_parameters"); }); - db.run("CREATE TABLE regex (regex_id INTEGER PRIMARY KEY AUTOINCREMENT, regex_name TEXT, regex_pattern TEXT, bot_id INTEGER)", function(error) { sqlOutput(error, "regex"); }); - db.run("CREATE TABLE responses (response_id INTEGER PRIMARY KEY AUTOINCREMENT, response_text TEXT, response_type TEXT, action_id INTEGER)", function(error) { sqlOutput(error, "responses"); }); - db.run("CREATE TABLE synonym_variants (synonym_variant_id INTEGER PRIMARY KEY AUTOINCREMENT, synonym_value TEXT, synonym_id INTEGER)", function(error) { sqlOutput(error, "synonym_variants"); }); - db.run("CREATE TABLE nlu_log (log_id INTEGER PRIMARY KEY AUTOINCREMENT, ip_address TEXT, query TEXT, event_type TEXT, event_data TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)", function(error) { sqlOutput(error, "nlu_log"); }); - db.run("CREATE TABLE models (model_id INTEGER PRIMARY KEY AUTOINCREMENT, model_name TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, comment TEXT, bot_id INTEGER, local_path TEXT, server_path TEXT, server_response TEXT)", function(error) { sqlOutput(error, "models"); }); - db.run("CREATE TABLE actions (action_id INTEGER PRIMARY KEY AUTOINCREMENT, action_name TEXT, bot_id INTEGER)", function(error) { sqlOutput(error, "actions"); }); - db.run("CREATE TABLE stories (story_id INTEGER PRIMARY KEY AUTOINCREMENT, story_name TEXT, story TEXT, bot_id INTEGER, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)", function(error) { sqlOutput(error, "stories"); }); - - db.run("CREATE TABLE settings (setting_name TEXT, setting_value TEXT)", function(error) { - sqlOutput(error, "settings"); - db.run("INSERT into settings (setting_name, setting_value) values ('refresh_time', '60000')"); - }); + await Promise.all([ + db.run("CREATE TABLE bots (bot_id INTEGER PRIMARY KEY AUTOINCREMENT, bot_name TEXT, bot_config TEXT, output_folder TEXT)", function(error) { sqlOutput(error, "bots"); }), + db.run("CREATE TABLE intents (intent_id INTEGER PRIMARY KEY AUTOINCREMENT, intent_name TEXT, bot_id INTEGER)", function(error) { sqlOutput(error, "intents"); }), + db.run("CREATE TABLE synonyms (synonym_id INTEGER PRIMARY KEY AUTOINCREMENT, synonym_reference TEXT, regex_pattern TEXT, bot_id INTEGER)", function(error) { sqlOutput(error, "synonyms"); }), + db.run("CREATE TABLE entities (entity_id INTEGER PRIMARY KEY AUTOINCREMENT, entity_name TEXT, slot_data_type TEXT, bot_id INTEGER)", function(error) { sqlOutput(error, "entities"); }), + db.run("CREATE TABLE expressions (expression_id INTEGER PRIMARY KEY AUTOINCREMENT, expression_text TEXT, intent_id INTEGER)", function(error) { sqlOutput(error, "expressions"); }), + db.run("CREATE TABLE expression_parameters (parameter_id INTEGER PRIMARY KEY AUTOINCREMENT, parameter_start INTEGER, parameter_end INTEGER, parameter_value TEXT, expression_id INTEGER, intent_id INTEGER, entity_id INTEGER)", function(error) { sqlOutput(error, "expression_parameters"); }), + db.run("CREATE TABLE regex (regex_id INTEGER PRIMARY KEY AUTOINCREMENT, regex_name TEXT, regex_pattern TEXT, bot_id INTEGER)", function(error) { sqlOutput(error, "regex"); }), + db.run("CREATE TABLE responses (response_id INTEGER PRIMARY KEY AUTOINCREMENT, response_text TEXT, response_type TEXT, action_id INTEGER)", function(error) { sqlOutput(error, "responses"); }), + db.run("CREATE TABLE synonym_variants (synonym_variant_id INTEGER PRIMARY KEY AUTOINCREMENT, synonym_value TEXT, synonym_id INTEGER)", function(error) { sqlOutput(error, "synonym_variants"); }), + db.run("CREATE TABLE nlu_log (log_id INTEGER PRIMARY KEY AUTOINCREMENT, ip_address TEXT, query TEXT, event_type TEXT, event_data TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)", function(error) { sqlOutput(error, "nlu_log"); }), + db.run("CREATE TABLE models (model_id INTEGER PRIMARY KEY AUTOINCREMENT, model_name TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, comment TEXT, bot_id INTEGER, local_path TEXT, server_path TEXT, server_response TEXT)", function(error) { sqlOutput(error, "models"); }), + db.run("CREATE TABLE actions (action_id INTEGER PRIMARY KEY AUTOINCREMENT, action_name TEXT, bot_id INTEGER)", function(error) { sqlOutput(error, "actions"); }), + db.run("CREATE TABLE stories (story_id INTEGER PRIMARY KEY AUTOINCREMENT, story_name TEXT, story TEXT, bot_id INTEGER, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)", function(error) { sqlOutput(error, "stories"); }), + + db.run("CREATE TABLE settings (setting_name TEXT, setting_value TEXT)", function(error) { + sqlOutput(error, "settings"); + db.run("INSERT into settings (setting_name, setting_value) values ('refresh_time', '60000')"); + }), - //New table part of Version 3.0.1 - db.run("CREATE TABLE conversations (conversation_id INTEGER PRIMARY KEY AUTOINCREMENT, ip_address TEXT, conversation TEXT, story TEXT, bot_id INTEGER, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)", function(error) { sqlOutput(error, "conversations"); }); + //New table part of Version 3.0.1 + db.run("CREATE TABLE conversations (conversation_id INTEGER PRIMARY KEY AUTOINCREMENT, ip_address TEXT, conversation TEXT, story TEXT, bot_id INTEGER, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)", function(error) { sqlOutput(error, "conversations"); }), - db.run("CREATE TABLE version(version)", function(error) { setDBSchemaVersion(error); }); + db.run("CREATE TABLE version(version)", function(error) { setDBSchemaVersion(error); }) + ]); } catch (err) { logger.winston.error(err); } @@ -67,7 +83,7 @@ function createDBSchema() { function sqlOutput(error, table_name) { if (!error) { - logger.winston.error("Table: " + table_name + " created"); + logger.winston.info("Table: " + table_name + " created"); } } diff --git a/server/db/models.js b/server/db/models.js index 113c3c2..6603d90 100644 --- a/server/db/models.js +++ b/server/db/models.js @@ -14,7 +14,7 @@ function getBotModels(req, res, next) { } function createModel(req, res, next) { - logger.winston.info('Bot.createBot'); + logger.winston.info('Bot.createModel'); db.run('insert into models(model_name, comment, bot_id, server_path, local_path)' + 'values (?,?,?,?,?)', [req.body.file_name, req.body.comment, req.body.bot_id, req.body.server_path, 'Manually added'], function (err) { if (err) { logger.winston.error("Error inserting a new record: " + err); diff --git a/server/db/parameters.js b/server/db/parameters.js index 8ce53e4..6f66f2b 100755 --- a/server/db/parameters.js +++ b/server/db/parameters.js @@ -1,31 +1,6 @@ const db = require('./db'); const logger = require('../util/logger'); -/* -function getSingleParameter(req, res, next) { - logger.winston.info('parameters.getSingleParameter'); - const parameterID = req.params.parameter_id; - - const data = db.get('parameters') - .filter({ parameter_id: parameterID }) - .value() - res.status(200).json(data); -} - -function removeParameter(req, res, next) { - const parameterID = req.params.parameter_id; - - db.get('parameters') - .remove({ parameter_id: parameterID }) - .write() - - res.status(200).json({ - status: 'success', - message: 'Removed' - }); -} -*/ - function getExpressionParametersQuery(req, res, next) { logger.winston.info('parameters.getExpressionParametersQuery'); const expressionIds = req.query.expression_ids; @@ -96,12 +71,10 @@ function removeExpressionParameter(req, res, next) { } module.exports = { - //getSingleParameter, getExpressionParameters, getIntentParameters, createExpressionParameter, removeExpressionParameter, - //removeParameter, updateParameter, getExpressionParametersQuery }; diff --git a/server/db/settings.js b/server/db/settings.js index 84902b5..2e3139c 100755 --- a/server/db/settings.js +++ b/server/db/settings.js @@ -5,7 +5,7 @@ function getSingleSetting(req, res, next) { logger.winston.info('settings.getSingleSetting'); const settingName = req.params.setting_name; - db.get('select * from settings where setting_name = ?', req.params.bot_id, function(err, data) { + db.get('select * from settings where setting_name = ?', settingName, function(err, data) { if (err) { logger.winston.error(err); } else { diff --git a/server/db/variants.js b/server/db/variants.js index 4d80dc6..33425c0 100755 --- a/server/db/variants.js +++ b/server/db/variants.js @@ -36,17 +36,6 @@ function getSynonymsVariants(req, res, next) { }); } -function getAllSynonymVariants(req, res, next) { - logger.winston.info('variants.getAllSynonymVariants'); - db.all("select synonym_reference as value, '[' || string_agg('\'' || synonym_value || '\'', ', ') || ']' as synonyms from entity_synonym_variants group by 1", function(err, data) { - if (err) { - logger.winston.error(err); - } else { - res.status(200).json(data); - } - }); -} - function createVariant(req, res, next) { logger.winston.info('variants.createVariant'); db.run('insert into synonym_variants (synonym_id, synonym_value)' + 'values (?, ?)', [req.body.synonym_id, req.body.synonym_value], function(err) { @@ -92,5 +81,5 @@ module.exports = { createVariant, removeVariant, removeSynonymVariants, - getSynonymsVariants, - getAllSynonymVariants}; + getSynonymsVariants +}; diff --git a/server/routes/index.js b/server/routes/index.js index 9e6956a..8a19474 100755 --- a/server/routes/index.js +++ b/server/routes/index.js @@ -32,13 +32,14 @@ router.post('/bots', bots.createBot); router.put('/bots/:bot_id', bots.updateBot); router.delete('/bots/:bot_id', bots.removeBot); router.post('/bots/upload', bots.uploadBotFromFile); + //routes intents router.get('/bots/:bot_id/intents', intents.getBotIntents); router.get('/intents/:intent_id', intents.getSingleIntent); router.put('/intents/:intent_id', intents.updateIntent); -router.post('/bots/:bot_id/intents', intents.createBotIntent); router.post('/intents', intents.createBotIntent); router.delete('/intents/:intent_id', intents.removeIntent); + //routes expression router.get('/intent_expressions', expressions.getIntentExpressionQuery); //Used for training router.get('/intents/:intent_id/expressions', expressions.getIntentExpressions); @@ -46,51 +47,54 @@ router.get('/expressions/:expression_id', expressions.getSingleExpression); router.put('/expressions/:expression_id', expressions.updateExpression); router.post('/expressions', expressions.createIntentExpression); router.delete('/expressions/:expression_id', expressions.removeExpression); + //routes parameters router.get('/expression_parameters', parameters.getExpressionParametersQuery); //Used for training router.get('/expresions/:expression_id/parameters', parameters.getExpressionParameters); -//router.get('/parameters/:parameter_id', parameters.getSingleParameter); router.get('/intent/:intent_id/parameters', parameters.getIntentParameters); router.post('/parameters', parameters.createExpressionParameter); router.put('/parameters/:parameter_id', parameters.updateParameter); router.delete('/parameters/:parameter_id', parameters.removeExpressionParameter); + //routes entities -router.get('/entities', entities.getAllEntities); +//router.get('/entities', entities.getAllEntities); //NeededTODO: Needed? router.get('/entities/bot/:bot_id', entities.getAllEntitiesForBot); router.get('/entities/:entity_id', entities.getSingleEntity); router.post('/entities', entities.createEntity); router.put('/entities/:entity_id', entities.updateEntity); router.delete('/entities/:entity_id', entities.removeEntity); + //routes regex router.get('/bot/:bot_id/regex', regex.getBotRegex); router.get('/regex/:regex_id', regex.getSingleRegex); router.post('/regex', regex.createRegex); router.put('/regex/:regex_id', regex.updateRegex); router.delete('/regex/:regex_id', regex.removeRegex); + //routes synonymes router.get('/bot/:bot_id/synonyms', synonyms.getBotSynonyms); router.get('/synonyms/:synonym_id', synonyms.getSingleSynonym); router.post('/synonyms', synonyms.createBotSynonym); router.delete('/synonyms/:synonym_id', synonyms.removeSynonym); + //routes variants router.get('/synonyms_variants/:synonyms_id', variants.getSynonymsVariants); //Used for training router.get('/synonyms/:synonym_id/variants', variants.getSynonymVariants); router.get('/variants/:synonym_variant_id', variants.getSingleVariant); -router.get('/synonymvariants', variants.getAllSynonymVariants); router.post('/variants', variants.createVariant); router.delete('/variants/:synonym_variant_id', variants.removeVariant); router.delete('/synonyms/:synonym_id/variants', variants.removeSynonymVariants); + //routes settings router.get('/settings', settings.getSettings); router.get('/settings/:setting_name', settings.getSingleSetting); router.put('/settings/:setting_name', settings.updateSetting); -//routes for core functions ////////////////////////////// +//routes for stories router.get('/stories/:bot_id', stories.getAllBotStories); router.post('/stories', stories.createStory); router.put('/stories', stories.updateStory); router.delete('/stories', stories.removeStory); -router.get('/stories/:bot_id', stories.getAllBotStories); router.get('/stories/:bot_id/search', stories.searchStoryAttributes); //routes responses @@ -103,8 +107,6 @@ router.get('/actions', actions.getBotActionsAndResponses); router.post('/actions', actions.createAction); router.delete('/actions', actions.removeAction); - - //routes logs router.get('/nlu_log/:query', logs.getLogs); router.get('/intent_usage_by_day', logs.getIntentUsageByDay); diff --git a/server/routes/rasa_router.js b/server/routes/rasa_router.js index 241b0a0..7d8892a 100755 --- a/server/routes/rasa_router.js +++ b/server/routes/rasa_router.js @@ -209,20 +209,20 @@ function getConversationStory(req, res, next) { try { logger.winston.info("Routing to Model Rasa Story Request -> " + global.rasa_endpoint + "/conversations/" + req.query.conversation_id + "/story"); request({ method: 'GET', uri: global.rasa_endpoint + "/conversations/" + req.query.conversation_id + "/story" }, function (err, response, body) { - try { - logger.winston.verbose('Rasa Response: ' + body.substring(1, 200) + ' ... '); - logs.logRequest(req, 'parse', - { - server_response: body, - query: req.body.q - }); - updateStory(req.query.conversation_id, body); - sendOutput(200, res, body, { 'Content-Type': 'plain/text' }, ''); - } catch (err) { - logger.winston.error(err); - sendOutput(500, res, '{"error" : ' + err + "}"); - } - }); + try { + logger.winston.verbose('Rasa Response: ' + body.substring(1, 200) + ' ... '); + logs.logRequest(req, 'parse', + { + server_response: body, + query: req.body.q + }); + updateStory(req.query.conversation_id, body); + sendOutput(200, res, body, { 'Content-Type': 'plain/text' }, ''); + } catch (err) { + logger.winston.error(err); + sendOutput(500, res, '{"error" : ' + err + "}"); + } + }); } catch (err) { logger.winston.error(err); } diff --git a/server/server.js b/server/server.js index 9fdaa2c..78583e5 100755 --- a/server/server.js +++ b/server/server.js @@ -81,3 +81,5 @@ function checkRasa() { } }); } + +module.exports = server \ No newline at end of file diff --git a/server/test/common.js b/server/test/common.js new file mode 100644 index 0000000..069d157 --- /dev/null +++ b/server/test/common.js @@ -0,0 +1,18 @@ +// Import the dependencies for testing +const app = require('../server'); +const db = require('../db/db'); +const logger = require('../util/logger'); +logger.winston.level = "info"; + +const chai = require('chai'); +const chaiHttp = require('chai-http'); + +// Configure chai +chai.use(chaiHttp); +chai.should(); + +module.exports = { + chai, + app, + db +} \ No newline at end of file diff --git a/server/test/db/test_db.sqlite3 b/server/test/db/test_db.sqlite3 new file mode 100644 index 0000000..c353808 Binary files /dev/null and b/server/test/db/test_db.sqlite3 differ diff --git a/server/test/test.js b/server/test/test.js new file mode 100644 index 0000000..6a52cc8 --- /dev/null +++ b/server/test/test.js @@ -0,0 +1,31 @@ +var common = require("./common"); +const fs = require('fs'); + +function importTest(name, path) { + describe(name, function () { + require(path); + }); +} + +setTimeout(function () { + db_file_path = "server/test/db/test_db.sqlite3"; + + //Wait for test data to be inserted into DB + describe("Rasa UI Server Tests", function () { + importTest("Bots", './tests/bots.test'); + importTest("Intents", './tests/intents.test'); + importTest("Entity", './tests/entities.test'); + importTest("Regex", './tests/regex.test'); + importTest("Actions", './tests/actions.test'); + importTest("Conversations", './tests/conversations.test'); + importTest("Expressions", './tests/expressions.test'); + importTest("Models", './tests/models.test'); + importTest("Parameters", './tests/parameters.test'); + importTest("Responses", './tests/responses.test'); + importTest("Settings", './tests/settings.test'); + importTest("Stories", './tests/stories.test'); + importTest("Synonyms", './tests/synonyms.test'); + importTest("Variants", './tests/variants.test'); + }); + run(); +}, 1000); \ No newline at end of file diff --git a/server/test/tests/actions.test.js b/server/test/tests/actions.test.js new file mode 100644 index 0000000..145b724 --- /dev/null +++ b/server/test/tests/actions.test.js @@ -0,0 +1,49 @@ +var common = require("../common"); +var chai = common.chai; +var app = common.app; +var db = common.db; + +describe("actions.test", () => { + describe("GET /api/v2/actions/", () => { + before(function () { + db.run("INSERT into actions values (1, 'Action 1', 1)"); + }); + + it("createAction: should create a new record", (done) => { + let data = { + bot_id: 1, + action_name: "Action 2" + } + chai.request(app) + .post('/api/v2/actions') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("getBotActionsAndResponses: should get all records", (done) => { + chai.request(app) + .get('/api/v2/actions?bot_id=1') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('array'); + done(); + }); + }); + + it("removeAction: should delete a record", (done) => { + chai.request(app) + .delete('/api/v2/actions?action_id=2') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/server/test/tests/bots.test.js b/server/test/tests/bots.test.js new file mode 100644 index 0000000..365c246 --- /dev/null +++ b/server/test/tests/bots.test.js @@ -0,0 +1,78 @@ +var common = require("../common"); +var chai = common.chai; +var app = common.app; +var db = common.db; + +describe("bots.test", () => { + describe("GET /api/v2/bots/", () => { + before(function () { + db.run("INSERT into bots values (1, 'Test Bot 1', '{}', '/models')"); + }); + + it("createBot: should create a new record", (done) => { + let bot = { + bot_name: "Test Bot 2", + bot_config: "{}", + bot_output_folder: "/models" + } + chai.request(app) + .post('/api/v2/bots') + .send(bot) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("getAllBots: should get all bots records", (done) => { + chai.request(app) + .get('/api/v2/bots/') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('array'); + done(); + }); + }); + + it("getSingleBot: should get a single bot record", (done) => { + chai.request(app) + .get('/api/v2/bots/2') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('bot_id').eql(2); + done(); + }); + }); + + it("updateBot: should update a record", (done) => { + let bot = { + bot_name: "Test Bot 2 Updated", + bot_config: "{}", + bot_output_folder: "/models" + } + chai.request(app) + .put('/api/v2/bots/2') + .send(bot) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("removeBot: should delete a single bot record", (done) => { + chai.request(app) + .delete('/api/v2/bots/3') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/server/test/tests/conversations.test.js b/server/test/tests/conversations.test.js new file mode 100644 index 0000000..716fde9 --- /dev/null +++ b/server/test/tests/conversations.test.js @@ -0,0 +1,48 @@ +var common = require("../common"); +var chai = common.chai; +var app = common.app; +var db = common.db; + +describe("conversations.test", () => { + describe("GET /api/v2/conversations/", () => { + before(function () { + db.run("INSERT into conversations (bot_id) values (1)"); + }); + + it("createConversation: should create a new record", (done) => { + let data = { + bot_id: 1 + } + chai.request(app) + .post('/api/v2/conversations') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("getConversation: should get all records", (done) => { + chai.request(app) + .get('/api/v2/conversations/1') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('array'); + done(); + }); + }); + + it("removeConversation: should delete a record", (done) => { + chai.request(app) + .delete('/api/v2/conversations?conversation_id=2') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/server/test/tests/entities.test.js b/server/test/tests/entities.test.js new file mode 100644 index 0000000..1efa54d --- /dev/null +++ b/server/test/tests/entities.test.js @@ -0,0 +1,76 @@ +var common = require("../common"); +var chai = common.chai; +var app = common.app; +var db = common.db; + +describe("entities.test", () => { + describe("GET /api/v2/entities/", () => { + before(function () { + db.run("INSERT into entities values (1, 'Entity 1', 'TEXT', 1)"); + }); + + it("createEntity: should create a new record", (done) => { + let data = { + bot_id: 1, + entity_name: "Entity 2", + slot_data_type: "TEXT" + } + chai.request(app) + .post('/api/v2/entities') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("getAllEntities: should get all records", (done) => { + chai.request(app) + .get('/api/v2/entities/bot/1') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('array'); + done(); + }); + }); + + it("getSingleEntity: should get a single record", (done) => { + chai.request(app) + .get('/api/v2/entities/1') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('entity_id').eql(1); + done(); + }); + }); + + it("updateEntity: should update a record", (done) => { + let data = { + entity_name: "Entity 2 Updated" + } + chai.request(app) + .put('/api/v2/entities/2') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("removeIntent: should delete a record", (done) => { + chai.request(app) + .delete('/api/v2/entities/2') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/server/test/tests/expressions.test.js b/server/test/tests/expressions.test.js new file mode 100644 index 0000000..e6a8e07 --- /dev/null +++ b/server/test/tests/expressions.test.js @@ -0,0 +1,85 @@ +var common = require("../common"); +var chai = common.chai; +var app = common.app; +var db = common.db; + +describe("expressions.test", () => { + describe("GET /api/v2/expressions/", () => { + before(function () { + db.run("INSERT into expressions values (1, 1, 'Expression 1')"); + }); + + it("createExpression: should create a new record", (done) => { + let data = { + intent_id: 1, + expression_name: "Expression 2" + } + chai.request(app) + .post('/api/v2/expressions') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("getIntentExpressions: should get all records", (done) => { + chai.request(app) + .get('/api/v2/intents/1/expressions') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('array'); + done(); + }); + }); + + it("getIntentExpressionQuery: should get all records", (done) => { + chai.request(app) + .get('/api/v2/intent_expressions?intent_ids=1,2,3') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('array'); + done(); + }); + }); + + it("getSingleExpression: should get a single record", (done) => { + chai.request(app) + .get('/api/v2/expressions/1') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('expression_id').eql(1); + done(); + }); + }); + + it("updateExpression: should update a record", (done) => { + let data = { + expression_text: "Expression 2 Updated" + } + chai.request(app) + .put('/api/v2/expressions/2') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("removeExpression: should delete a record", (done) => { + chai.request(app) + .delete('/api/v2/expressions/2') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/server/test/tests/intents.test.js b/server/test/tests/intents.test.js new file mode 100644 index 0000000..a1bade4 --- /dev/null +++ b/server/test/tests/intents.test.js @@ -0,0 +1,75 @@ +var common = require("../common"); +var chai = common.chai; +var app = common.app; +var db = common.db; + +describe("intents.test", () => { + describe("GET /api/v2/intents/", () => { + before(function () { + db.run("INSERT into intents values (1, 'Intent 1', 1)"); + }); + + it("createBotIntent: should create a new record", (done) => { + let data = { + bot_id: 1, + intent_name: "Intent 2" + } + chai.request(app) + .post('/api/v2/intents') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("getBotIntents: should get all records", (done) => { + chai.request(app) + .get('/api/v2/bots/1/intents') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('array'); + done(); + }); + }); + + it("getSingleIntent: should get a single record", (done) => { + chai.request(app) + .get('/api/v2/intents/1') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('intent_id').eql(1); + done(); + }); + }); + + it("updateIntent: should update a record", (done) => { + let data = { + intent_name: "Intent 2 Updated" + } + chai.request(app) + .put('/api/v2/intents/2') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("removeIntent: should delete a record", (done) => { + chai.request(app) + .delete('/api/v2/intents/2') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/server/test/tests/models.test.js b/server/test/tests/models.test.js new file mode 100644 index 0000000..3c33da3 --- /dev/null +++ b/server/test/tests/models.test.js @@ -0,0 +1,53 @@ +var common = require("../common"); +var chai = common.chai; +var app = common.app; +var db = common.db; + +describe("models.test", () => { + describe("GET /api/v2/models/", () => { + before(function () { + //model_name, comment, bot_id, server_path, local_path + db.run("INSERT into models (model_id, model_name, comment, bot_id, server_path, local_path) values (1, 'Model 1', 'comment', 1, '/server/path', '/local/path')"); + }); + + it("createModel: should create a new record", (done) => { + let data = { + bot_id: 1, + model_name: "Model 2", + comment: "Comment", + server_path: "/server/path", + file_name: "filename" + } + chai.request(app) + .post('/api/v2/models') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("getBotModels: should get all records", (done) => { + chai.request(app) + .get('/api/v2/models/1') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('array'); + done(); + }); + }); + + it("removeAction: should delete a record", (done) => { + chai.request(app) + .delete('/api/v2/models?model_id=2') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/server/test/tests/parameters.test.js b/server/test/tests/parameters.test.js new file mode 100644 index 0000000..04b39da --- /dev/null +++ b/server/test/tests/parameters.test.js @@ -0,0 +1,88 @@ +var common = require("../common"); +var chai = common.chai; +var app = common.app; +var db = common.db; + +describe("parameters.test", () => { + describe("GET /api/v2/parameters/", () => { + before(function () { + db.run("insert into expression_parameters(expression_id, parameter_start, parameter_end, parameter_value, intent_id) values (1, 2, 3, 'test', 1)"); + }); + + it("createParameter: should create a new record", (done) => { + let data = { + expression_id: 1, + parameter_start: 3, + parameter_end: 5, + parameter_value: "Values", + intent_id: 1 + } + chai.request(app) + .post('/api/v2/parameters') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("getIntentParameters: should get all records", (done) => { + chai.request(app) + .get('/api/v2/intent/1/parameters') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('array'); + done(); + }); + }); + + it("getExpressionParametersQuery: should get all records", (done) => { + chai.request(app) + .get('/api/v2/expression_parameters?expression_ids=1,2') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('array'); + done(); + }); + }); + + it("getExpressionParameters: should get all records", (done) => { + chai.request(app) + .get('/api/v2/expresions/1/parameters') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('array'); + done(); + }); + }); + + it("updateParameter: should update a record", (done) => { + let data = { + entity_id: 1, + parameter_id: 1 + } + chai.request(app) + .put('/api/v2/parameters/1') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("removeExpressionParameter: should delete a record", (done) => { + chai.request(app) + .delete('/api/v2/parameters/2') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/server/test/tests/regex.test.js b/server/test/tests/regex.test.js new file mode 100644 index 0000000..1917c03 --- /dev/null +++ b/server/test/tests/regex.test.js @@ -0,0 +1,76 @@ +var common = require("../common"); +var chai = common.chai; +var app = common.app; +var db = common.db; + +describe("regex.test", () => { + describe("GET /api/v2/regex/", () => { + before(function () { + db.run("INSERT into regex values (1, 'Regex 1', '*.*', 1)"); + }); + + it("createRegex: should create a new record", (done) => { + let data = { + bot_id: 1, + regex_name: "Regex 2", + regex_pattern: "*.?*" + } + chai.request(app) + .post('/api/v2/regex') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("getBotRegex: should get all records", (done) => { + chai.request(app) + .get('/api/v2/bot/1/regex') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('array'); + done(); + }); + }); + + it("getSingleRegex: should get a single record", (done) => { + chai.request(app) + .get('/api/v2/regex/1') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('regex_id').eql(1); + done(); + }); + }); + + it("updateRegex: should update a record", (done) => { + let data = { + regex_name: "Regex 2 Updated" + } + chai.request(app) + .put('/api/v2/regex/2') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("removeIntent: should delete a record", (done) => { + chai.request(app) + .delete('/api/v2/regex/2') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/server/test/tests/responses.test.js b/server/test/tests/responses.test.js new file mode 100644 index 0000000..03a745c --- /dev/null +++ b/server/test/tests/responses.test.js @@ -0,0 +1,58 @@ +var common = require("../common"); +var chai = common.chai; +var app = common.app; +var db = common.db; + +describe("responses.test", () => { + describe("GET /api/v2/responses/", () => { + before(function () { + db.run("INSERT into responses values (1, 'Response 1', 1, 'TEXT')"); + }); + + it("createResponse: should create a new record", (done) => { + let data = { + action_id: 1, + response_text: "Response 2", + response_type: "TEXT" + } + chai.request(app) + .post('/api/v2/response') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("updateResponse: should update a record", (done) => { + let data = { + response_id: 2, + response_name: "Response 2 Updated", + response_type: "TEXT" + } + chai.request(app) + .put('/api/v2/response') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + + it("removeResponse: should delete a record", (done) => { + chai.request(app) + .delete('/api/v2/response') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/server/test/tests/settings.test.js b/server/test/tests/settings.test.js new file mode 100644 index 0000000..0c4fe95 --- /dev/null +++ b/server/test/tests/settings.test.js @@ -0,0 +1,46 @@ +var common = require("../common"); +var chai = common.chai; +var app = common.app; +var db = common.db; + +describe("settings.test", () => { + describe("GET /api/v2/settings/", () => { + + it("getSettings: should get all records", (done) => { + chai.request(app) + .get('/api/v2/settings') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('array'); + done(); + }); + }); + + it("getSetting: should get one records", (done) => { + chai.request(app) + .get('/api/v2/settings/refresh_time') + .end((err, res) => { + console.log("body: " + res.body); + res.should.have.status(200); + res.body.should.be.a('object'); + done(); + }); + }); + + it("updateSetting: should update a record", (done) => { + let data = { + setting_value: "60000", + setting_name: "refresh_time" + } + chai.request(app) + .put('/api/v2/settings/refresh_time') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/server/test/tests/stories.test.js b/server/test/tests/stories.test.js new file mode 100644 index 0000000..61ef605 --- /dev/null +++ b/server/test/tests/stories.test.js @@ -0,0 +1,76 @@ +var common = require("../common"); +var chai = common.chai; +var app = common.app; +var db = common.db; + +describe("stories.test", () => { + describe("GET /api/v2/stories/", () => { + before(function () { + db.run("INSERT into stories (story_id, story_name, story, bot_id) values (1, 'Story 1', 'story text', 1)"); + }); + + it("createStory: should create a new record", (done) => { + let data = { + story_name: "Story 2", + story: "story", + bot_id: 1 + } + chai.request(app) + .post('/api/v2/stories') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("searchStoryAttributes: search all records", (done) => { + chai.request(app) + .get('/api/v2/stories/1/search?search_text=story') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('array'); + done(); + }); + }); + + it("getAllBotStories: should get all records", (done) => { + chai.request(app) + .get('/api/v2/stories/1') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('array'); + done(); + }); + }); + + it("updateStory: should update a record", (done) => { + let data = { + story: "Story 2 Updated", + story_id: 2 + } + chai.request(app) + .put('/api/v2/stories') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("removSeStory: should delete a record", (done) => { + chai.request(app) + .delete('/api/v2/stories?story_id=2') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/server/test/tests/synonyms.test.js b/server/test/tests/synonyms.test.js new file mode 100644 index 0000000..06c9846 --- /dev/null +++ b/server/test/tests/synonyms.test.js @@ -0,0 +1,61 @@ +var common = require("../common"); +var chai = common.chai; +var app = common.app; +var db = common.db; + +describe("synonyms.test", () => { + describe("GET /api/v2/synonyms/", () => { + before(function () { + db.run("INSERT into synonyms (bot_id, synonym_reference, regex_pattern) values (1, 'NYC', '*.*')"); + }); + //req.body.bot_id, req.body.synonym_reference, req.body.regex_pattern + it("createBotSynonym: should create a new record", (done) => { + let bot = { + bot_id: 1, + synonym_reference: "NYC", + regex_pattern: "*.?" + } + chai.request(app) + .post('/api/v2/synonyms') + .send(bot) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("getBotSynonyms: should get all bot records", (done) => { + chai.request(app) + .get('/api/v2/bot/1/synonyms') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('array'); + done(); + }); + }); + + it("getSingleSynonym: should get a record", (done) => { + chai.request(app) + .get('/api/v2/synonyms/1') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('synonym_id').eql(1); + done(); + }); + }); + + it("removeSynonym: should delete a record", (done) => { + chai.request(app) + .delete('/api/v2/synonyms/2') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + }); +}); \ No newline at end of file diff --git a/server/test/tests/variants.test.js b/server/test/tests/variants.test.js new file mode 100644 index 0000000..573635d --- /dev/null +++ b/server/test/tests/variants.test.js @@ -0,0 +1,83 @@ +var common = require("../common"); +var chai = common.chai; +var app = common.app; +var db = common.db; + +describe("variants.test", () => { + describe("GET /api/v2/variants/", () => { + before(function () { + db.run("INSERT into synonym_variants values (1, 'Big Apple', 1)"); + }); + + it("createVariant: should create a new record", (done) => { + let data = { + synonym_id: 1, + synonym_value: "New York City" + } + chai.request(app) + .post('/api/v2/variants') + .send(data) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("getSingleVariant: should get a single record", (done) => { + chai.request(app) + .get('/api/v2/variants/1') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('synonym_variant_id').eql(1); + done(); + }); + }); + + it("getSynonymsVariants: should get all records", (done) => { + chai.request(app) + .get('/api/v2/synonyms_variants/1,2') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('array'); + done(); + }); + }); + + it("getSynonymVariants: should get all records", (done) => { + chai.request(app) + .get('/api/v2/synonyms/1/variants') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('array'); + done(); + }); + }); + + it("removeVariant: should delete a record", (done) => { + chai.request(app) + .delete('/api/v2/variants/2') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + it("removeSynonymVariants: should delete a record", (done) => { + chai.request(app) + .delete('/api/v2//synonyms/2/variants') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('status').eql('success'); + done(); + }); + }); + + + }); +}); \ No newline at end of file diff --git a/web/src/app/components/chat/chat.html b/web/src/app/components/chat/chat.html index 5084069..c3cbcfa 100755 --- a/web/src/app/components/chat/chat.html +++ b/web/src/app/components/chat/chat.html @@ -122,7 +122,7 @@
- +
diff --git a/web/src/app/components/chat/chat.js b/web/src/app/components/chat/chat.js index d45eac3..28267e6 100755 --- a/web/src/app/components/chat/chat.js +++ b/web/src/app/components/chat/chat.js @@ -91,7 +91,7 @@ function ChatController($scope, $rootScope, $interval, $http, Rasa_Version, Sett $('.write_msg').focus(); $http.post(appConfig.api_endpoint_v2 + '/rasa/conversations/messages', JSON.stringify(reqMessage)).then(function (response) { if (response.data && response.data.tracker) { - $scope.selected_conversation.conversation = response.data; + $scope.selected_conversation.conversation = JSON.stringify(response.data); $scope.transactions = response.data.tracker.events; checkForActions(response.data); $scope.loadConversationStory($scope.selected_conversation.conversation_id); @@ -110,7 +110,7 @@ function ChatController($scope, $rootScope, $interval, $http, Rasa_Version, Sett var body = {'conversation_id': $scope.selected_conversation.conversation_id, action : {'name': messages_response.scores[0].action }}; $http.post(appConfig.api_endpoint_v2 + '/rasa/conversations/execute', JSON.stringify(body)).then(function (response) { if (response.data && response.data.tracker) { - $scope.selected_conversation.conversation = response.data; + $scope.selected_conversation.conversation = JSON.stringify(response.data); $scope.transactions = response.data.tracker.events; $scope.loadConversationStory($scope.selected_conversation.conversation_id); scrollToMessage();