From ea978f7d654ace93cb6789dfdc50cd72795b1fc6 Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (pragmatismo.io)" Date: Mon, 12 Nov 2018 12:20:44 -0200 Subject: [PATCH] fix(config): TSLint parsed on all files. new(config): Several CI integrations. --- .npmignore | 2 +- .travis.yml | 12 +- package-lock.json | 9654 ++++++++++++++++- package.json | 50 +- packages/admin.gbapp/dialogs/AdminDialog.ts | 90 +- packages/admin.gbapp/models/AdminModel.ts | 22 +- .../admin.gbapp/services/GBAdminService.ts | 184 +- packages/admin.gbapp/strings.ts | 20 +- packages/analytics.gblib/index.ts | 36 +- packages/analytics.gblib/models/index.ts | 78 +- .../services/AnalyticsService.ts | 34 +- .../dialogs/BotFarmDialog.ts | 4 +- .../services/AzureDeployerService.ts | 691 +- packages/azuredeployer.gbapp/strings.ts | 8 +- packages/console.gblib/index.ts | 26 +- .../services/ConsoleDirectLine.ts | 153 +- packages/core.gbapp/dialogs/WelcomeDialog.ts | 32 +- packages/core.gbapp/dialogs/WhoAmIDialog.ts | 22 +- packages/core.gbapp/index.ts | 46 +- packages/core.gbapp/models/GBModel.ts | 173 +- .../core.gbapp/services/GBConfigService.ts | 56 +- .../services/GBConversationalService.ts | 77 +- packages/core.gbapp/services/GBCoreService.ts | 24 +- packages/core.gbapp/services/GBDeployer.ts | 180 +- packages/core.gbapp/services/GBImporter.ts | 53 +- packages/core.gbapp/services/GBMinService.ts | 298 +- packages/core.gbapp/strings.ts | 24 +- packages/core.gbapp/tests/core.test.ts | 10 +- .../dialogs/FeedbackDialog.ts | 36 +- .../dialogs/QualityDialog.ts | 26 +- packages/customer-satisfaction.gbapp/index.ts | 38 +- .../models/index.ts | 42 +- .../services/CSService.ts | 18 +- .../customer-satisfaction.gbapp/strings.ts | 36 +- packages/kb.gbapp/dialogs/AskDialog.ts | 70 +- packages/kb.gbapp/dialogs/FaqDialog.ts | 36 +- packages/kb.gbapp/dialogs/MenuDialog.ts | 2 +- packages/kb.gbapp/index.ts | 54 +- packages/kb.gbapp/services/KBService.ts | 379 +- packages/kb.gbapp/strings.ts | 44 +- packages/security.gblib/index.ts | 27 +- packages/security.gblib/models/index.ts | 70 +- .../security.gblib/services/SecService.ts | 78 +- packages/whatsapp.gblib/index.ts | 32 +- .../services/WhatsappDirectLine.ts | 189 +- src/app.ts | 100 +- src/logger.ts | 12 +- 47 files changed, 11509 insertions(+), 1839 deletions(-) diff --git a/.npmignore b/.npmignore index 8003ae98..871ae43b 100644 --- a/.npmignore +++ b/.npmignore @@ -6,4 +6,4 @@ tmp .env .coveralls.yml coverage -{YOUR_LIB}-*.tgz +BotServer-*.tgz diff --git a/.travis.yml b/.travis.yml index d997d96c..c16d5f38 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ notifications: email: false before_install: -- npm install --global nyc mocha typescript rimraf shx +- npm install --global nyc mocha typescript shx install: - npm install @@ -17,7 +17,6 @@ before_script: script: #- npm run build-docs -#- npm run tslint #- npm run coveralls branches: @@ -29,10 +28,17 @@ after_success: - npm pack deploy: + - provider: pages + skip_cleanup: true + local_dir: docs/reference + github_token: $GITHUB_TOKEN + on: + tags: false + - provider: releases api_key: $GITHUB_TOKEN file_glob: true - file: "{YOURLIB}-*.tgz" + file: "BotServer-*.tgz" skip_cleanup: true on: tags: false diff --git a/package-lock.json b/package-lock.json index 390f6f95..e25b4ea9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,39 @@ "@babel/highlight": "^7.0.0" } }, + "@babel/core": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.1.5.tgz", + "integrity": "sha512-vOyH020C56tQvte++i+rX2yokZcRfbv/kKcw+/BCRw/cK6dvsr47aCzm8oC1XHwMSEWbqrZKzZRLzLnq6SFMsg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.1.5", + "@babel/helpers": "^7.1.5", + "@babel/parser": "^7.1.5", + "@babel/template": "^7.1.2", + "@babel/traverse": "^7.1.5", + "@babel/types": "^7.1.5", + "convert-source-map": "^1.1.0", + "debug": "^3.1.0", + "json5": "^0.5.0", + "lodash": "^4.17.10", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.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" + } + } + } + }, "@babel/generator": { "version": "7.1.5", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.5.tgz", @@ -31,6 +64,57 @@ } } }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz", + "integrity": "sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.0.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-define-map": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz", + "integrity": "sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.0.0", + "lodash": "^4.17.10" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, "@babel/helper-function-name": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", @@ -49,6 +133,106 @@ "@babel/types": "^7.0.0" } }, + "@babel/helper-hoist-variables": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz", + "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", + "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz", + "integrity": "sha512-0JZRd2yhawo79Rcm4w0LwSMILFmFXjugG3yqf+P/UsKsRS1mJCmMwwlHDlMg7Avr9LrvSpp4ZSULO9r8jpCzcw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0", + "lodash": "^4.17.10" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0.tgz", + "integrity": "sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz", + "integrity": "sha512-BvcDWYZRWVuDeXTYZWxekQNO5D4kO55aArwZOTFXw6rlLQA8ZaDicJR1sO47h+HrnCiDFiww0fSPV0d713KBGQ==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "dev": true, + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, "@babel/helper-split-export-declaration": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", @@ -57,6 +241,29 @@ "@babel/types": "^7.0.0" } }, + "@babel/helper-wrap-function": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.1.0.tgz", + "integrity": "sha512-R6HU3dete+rwsdAfrOzTlE9Mcpk4RjU3aX3gi9grtmugQY0u79X7eogUvfXA5sI81Mfq1cn6AgxihfN33STjJA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helpers": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.1.5.tgz", + "integrity": "sha512-2jkcdL02ywNBry1YNFAH/fViq4fXG0vdckHqeJk+75fpQ2OH+Az6076tX/M0835zA45E0Cqa6pV5Kiv9YOqjEg==", + "dev": true, + "requires": { + "@babel/template": "^7.1.2", + "@babel/traverse": "^7.1.5", + "@babel/types": "^7.1.5" + } + }, "@babel/highlight": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", @@ -79,6 +286,549 @@ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.5.tgz", "integrity": "sha512-WXKf5K5HT6X0kKiCOezJZFljsfxKV1FpU8Tf1A7ZpGvyd/Q4hlrJm2EwoH2onaUq3O4tLDp+4gk0hHPsMyxmOg==" }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.1.0.tgz", + "integrity": "sha512-Fq803F3Jcxo20MXUSDdmZZXrPe6BWyGcWBPPNB/M7WaUYESKDeKMOGIxEzQOjGSmW/NWb6UaPZrtTB2ekhB/ew==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.0.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz", + "integrity": "sha512-kfVdUkIAGJIVmHmtS/40i/fg/AGnw/rsZBCaapY5yjeO5RA9m165Xbw9KMOu2nqXP5dTFjEjHdfNdoVcHv133Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.0.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz", + "integrity": "sha512-14fhfoPcNu7itSen7Py1iGN0gEm87hX/B+8nZPqkdmANyyYWYMY2pjA3r8WXbWVKMzfnSNS0xY8GVS0IjXi/iw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz", + "integrity": "sha512-JPqAvLG1s13B/AuoBjdBYvn38RqW6n1TzrQO839/sIpqLpbnXKacsAgpZHzLD83Sm8SDXMkkrAvEnJ25+0yIpw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.0.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0.tgz", + "integrity": "sha512-tM3icA6GhC3ch2SkmSxv7J/hCWKISzwycub6eGsDrFDgukD4dZ/I+x81XgW0YslS6mzNuQ1Cbzh5osjIMgepPQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.2.0" + }, + "dependencies": { + "regexpu-core": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.2.0.tgz", + "integrity": "sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^7.0.0", + "regjsgen": "^0.4.0", + "regjsparser": "^0.3.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.0.2" + } + }, + "regjsgen": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz", + "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==", + "dev": true + }, + "regjsparser": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz", + "integrity": "sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0.tgz", + "integrity": "sha512-im7ged00ddGKAjcZgewXmp1vxSZQQywuQXe2B1A7kajjZmDeY/ekMPmWr9zJgveSaQH0k7BcGrojQhcK06l0zA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.0.0.tgz", + "integrity": "sha512-UlSfNydC+XLj4bw7ijpldc1uZ/HB84vw+U6BTuqMdIEmz/LDe63w/GHtpQMdXWdqQZFeAI9PjnHe/vDhwirhKA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz", + "integrity": "sha512-5A0n4p6bIiVe5OvQPxBnesezsgFJdHhSs3uFSvaPdMqtsovajLZ+G2vZyvNe10EzJBWWo3AcHGKhAFUxqwp2dw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz", + "integrity": "sha512-Wc+HVvwjcq5qBg1w5RG9o9RVzmCaAg/Vp0erHCKpAYV8La6I94o4GQAmFYNmkzoMO6gzoOSulpKeSSz6mPEoZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz", + "integrity": "sha512-2EZDBl1WIO/q4DIkIp4s86sdp4ZifL51MoIviLY/gG/mLSuOIEg7J8o6mhbxOTvUJkaN50n+8u41FVsr5KLy/w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.1.0.tgz", + "integrity": "sha512-rNmcmoQ78IrvNCIt/R9U+cixUHeYAzgusTFgIAv+wQb9HJU4szhpDD6e5GCACmj/JP5KxuCwM96bX3L9v4ZN/g==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz", + "integrity": "sha512-AOBiyUp7vYTqz2Jibe1UaAWL0Hl9JUXEgjFvvvcSc9MVDItv46ViXFw2F7SVt1B5k+KWjl44eeXOAk3UDEaJjQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.1.5.tgz", + "integrity": "sha512-jlYcDrz+5ayWC7mxgpn1Wj8zj0mmjCT2w0mPIMSwO926eXBRxpEgoN/uQVRBfjtr8ayjcmS+xk2G1jaP8JjMJQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.10" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz", + "integrity": "sha512-rNaqoD+4OCBZjM7VaskladgqnZ1LO6o2UxuWSDzljzW21pN1KXkB7BstAVweZdxQkHAujps5QMNOTWesBciKFg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.1.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", + "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "dev": true + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz", + "integrity": "sha512-ubouZdChNAv4AAWAgU7QKbB93NU5sHwInEWfp+/OzJKA02E6Woh9RVoX4sZrbRwtybky/d7baTUqwFx+HgbvMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.1.3.tgz", + "integrity": "sha512-Mb9M4DGIOspH1ExHOUnn2UUXFOyVTiX84fXCd+6B5iWrQg/QMeeRmSwpZ9lnjYLSXtZwiw80ytVMr3zue0ucYw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0.tgz", + "integrity": "sha512-00THs8eJxOJUFVx1w8i1MBF4XH4PsAjKjQ1eqN/uCH3YKwP21GCKfrn6YZFZswbOk9+0cw1zGQPHVc1KBlSxig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.1.3" + }, + "dependencies": { + "regexpu-core": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.2.0.tgz", + "integrity": "sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^7.0.0", + "regjsgen": "^0.4.0", + "regjsparser": "^0.3.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.0.2" + } + }, + "regjsgen": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz", + "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==", + "dev": true + }, + "regjsparser": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz", + "integrity": "sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz", + "integrity": "sha512-w2vfPkMqRkdxx+C71ATLJG30PpwtTpW7DDdLqYt2acXU7YjztzeWW2Jk1T6hKqCLYCcEA5UQM/+xTAm+QCSnuQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.1.0.tgz", + "integrity": "sha512-uZt9kD1Pp/JubkukOGQml9tqAeI8NkE98oZnHZ2qHRElmeKCodbTZgOEUtujSCSLhHSBWbzNiFSDIMC4/RBTLQ==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz", + "integrity": "sha512-TlxKecN20X2tt2UEr2LNE6aqA0oPeMT1Y3cgz8k4Dn1j5ObT8M3nl9aA37LLklx0PBZKETC9ZAf9n/6SujTuXA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.1.0.tgz", + "integrity": "sha512-VxOa1TMlFMtqPW2IDYZQaHsFrq/dDoIjgN098NowhexhZcz3UGlvPgZXuE1jEvNygyWyxRacqDpCZt+par1FNg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz", + "integrity": "sha512-1NTDBWkeNXgpUcyoVFxbr9hS57EpZYXpje92zv0SUzjdu3enaRwF/l3cmyRnXLtIdyJASyiS6PtybK+CgKf7jA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.1.0.tgz", + "integrity": "sha512-wt8P+xQ85rrnGNr2x1iV3DW32W8zrB6ctuBkYBbf5/ZzJY99Ob4MFgsZDFgczNU76iy9PWsy4EuxOliDjdKw6A==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.1.0.tgz", + "integrity": "sha512-wtNwtMjn1XGwM0AXPspQgvmE6msSJP15CX2RVfpTSTNPLhKhaOjaIfBaVfj4iUZ/VrFSodcFedwtPg/NxwQlPA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.1.3.tgz", + "integrity": "sha512-PvTxgjxQAq4pvVUZF3mD5gEtVDuId8NtWkJsZLEJZMZAW3TvgQl1pmydLLN1bM8huHFVVU43lf0uvjQj9FRkKw==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.1.0.tgz", + "integrity": "sha512-enrRtn5TfRhMmbRwm7F8qOj0qEYByqUvTttPEGimcBH4CJHphjyK1Vg7sdU7JjeEmgSpM890IT/efS2nMHwYig==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz", + "integrity": "sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.1.0.tgz", + "integrity": "sha512-/O02Je1CRTSk2SSJaq0xjwQ8hG4zhZGNjE8psTsSNPXyLRCODv7/PBozqT5AmQMzp7MI3ndvMhGdqp9c96tTEw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.1.0.tgz", + "integrity": "sha512-vHV7oxkEJ8IHxTfRr3hNGzV446GAb+0hgbA7o/0Jd76s+YzccdWuTU296FOCOl/xweU4t/Ya4g41yWz80RFCRw==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.1.0", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz", + "integrity": "sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.13.3" + }, + "dependencies": { + "regenerator-transform": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz", + "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz", + "integrity": "sha512-g/99LI4vm5iOf5r1Gdxq5Xmu91zvjhEG5+yZDJW268AZELAu4J1EiFLnkSG3yuUsZyOipVOVUKoGPYwfsTymhw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz", + "integrity": "sha512-L702YFy2EvirrR4shTj0g2xQp7aNwZoWNCkNu2mcoU0uyzMl0XRwDSwzB/xp6DSUFiBmEXuyAyEN16LsgVqGGQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz", + "integrity": "sha512-LFUToxiyS/WD+XEWpkx/XJBrUXKewSZpzX68s+yEOtIbdnsRjpryDw9U06gYc6klYEij/+KQVRnD3nz3AoKmjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz", + "integrity": "sha512-vA6rkTCabRZu7Nbl9DfLZE1imj4tzdWcg5vtdQGvj+OH9itNNB6hxuRMHuIY8SGnEt1T9g5foqs9LnrHzsqEFg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz", + "integrity": "sha512-1r1X5DO78WnaAIvs5uC48t41LLckxsYklJrZjNKcevyz83sF2l4RHbw29qrCPr/6ksFsdfRpT/ZgxNWHXRnffg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz", + "integrity": "sha512-uJBrJhBOEa3D033P95nPHu3nbFwFE9ZgXsfEitzoIXIwqAZWk7uXcg06yFKXz9FSxBH5ucgU/cYdX0IV8ldHKw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.1.3" + }, + "dependencies": { + "regexpu-core": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.2.0.tgz", + "integrity": "sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^7.0.0", + "regjsgen": "^0.4.0", + "regjsparser": "^0.3.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.0.2" + } + }, + "regjsgen": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz", + "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==", + "dev": true + }, + "regjsparser": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz", + "integrity": "sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/polyfill": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.0.0.tgz", + "integrity": "sha512-dnrMRkyyr74CRelJwvgnnSUDh2ge2NCTyHVwpOdvRMHtJUyxLtMAfhBN3s64pY41zdw0kgiLPh6S20eb1NcX6Q==", + "dev": true, + "requires": { + "core-js": "^2.5.7", + "regenerator-runtime": "^0.11.1" + } + }, + "@babel/preset-env": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.1.5.tgz", + "integrity": "sha512-pQ+2o0YyCp98XG0ODOHJd9z4GsSoV5jicSedRwCrU8uiqcJahwQiOq0asSZEb/m/lwyu6X5INvH/DSiwnQKncw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.1.0", + "@babel/plugin-proposal-json-strings": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.0.0", + "@babel/plugin-syntax-async-generators": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.1.0", + "@babel/plugin-transform-block-scoped-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.1.5", + "@babel/plugin-transform-classes": "^7.1.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-dotall-regex": "^7.0.0", + "@babel/plugin-transform-duplicate-keys": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.1.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.1.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-amd": "^7.1.0", + "@babel/plugin-transform-modules-commonjs": "^7.1.0", + "@babel/plugin-transform-modules-systemjs": "^7.0.0", + "@babel/plugin-transform-modules-umd": "^7.1.0", + "@babel/plugin-transform-new-target": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.1.0", + "@babel/plugin-transform-parameters": "^7.1.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typeof-symbol": "^7.0.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "browserslist": "^4.1.0", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.3.0" + } + }, + "@babel/register": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.0.0.tgz", + "integrity": "sha512-f/+CRmaCe7rVEvcvPvxeA8j5aJhHC3aJie7YuqcMDhUOuyWLA7J/aNrTaHIzoWPEhpHA54mec4Mm8fv8KBlv3g==", + "dev": true, + "requires": { + "core-js": "^2.5.7", + "find-cache-dir": "^1.0.0", + "home-or-tmp": "^3.0.0", + "lodash": "^4.17.10", + "mkdirp": "^0.5.1", + "pirates": "^4.0.0", + "source-map-support": "^0.5.9" + } + }, "@babel/template": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", @@ -293,11 +1043,274 @@ } } }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@octokit/rest": { + "version": "15.17.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-15.17.0.tgz", + "integrity": "sha512-tN16FJOGBPxt9QtPfl8yVbbuik3bQ7EI66zcX2XDh05Wcs8t+7mVEE3SWtCeK/Qm0RTLCeFQgGzuvkbD2J6cEg==", + "dev": true, + "requires": { + "before-after-hook": "^1.1.0", + "btoa-lite": "^1.0.0", + "debug": "^3.1.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.0", + "lodash": "^4.17.4", + "node-fetch": "^2.1.1", + "universal-user-agent": "^2.0.0", + "url-template": "^2.0.8" + }, + "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" + } + }, + "node-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.2.1.tgz", + "integrity": "sha512-ObXBpNCD3A/vYQiQtEWl7DuqjAXjfptYFuGHLdPl5U19/6kJuZV+8uMHLrkj3wJrJoyfg4nhgyFixZdaZoAiEQ==", + "dev": true + } + } + }, + "@semantic-release/commit-analyzer": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-6.1.0.tgz", + "integrity": "sha512-2lb+t6muGenI86mYGpZYOgITx9L3oZYF697tJoqXeQEk0uw0fm+OkkOuDTBA3Oax9ftoNIrCKv9bwgYvxrbM6w==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.0.0", + "debug": "^4.0.0", + "import-from": "^2.1.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@semantic-release/error": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz", + "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==", + "dev": true + }, + "@semantic-release/github": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-5.2.1.tgz", + "integrity": "sha512-EVh5MCMOSl5WfOIum+k7fb7ZaDBcZAepPvtMrJOn8HKa9MERK6PgT76OKro+tReWjT1PnGiaKjofjyRC4BhN6Q==", + "dev": true, + "requires": { + "@octokit/rest": "^15.13.1", + "@semantic-release/error": "^2.2.0", + "aggregate-error": "^1.0.0", + "bottleneck": "^2.0.1", + "debug": "^4.0.0", + "dir-glob": "^2.0.0", + "fs-extra": "^7.0.0", + "globby": "^8.0.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "issue-parser": "^3.0.0", + "lodash": "^4.17.4", + "mime": "^2.0.3", + "p-filter": "^1.0.0", + "p-retry": "^2.0.0", + "parse-github-url": "^1.0.1", + "url-join": "^4.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + } + } + }, + "@semantic-release/npm": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-5.1.1.tgz", + "integrity": "sha512-5OnV0od1HKp2QjToXxQufvHNG8n+IQlp7h3FjqmZYH7DAHzAGx4NCf/R4p3RhyX5YJEfQl4ZflX9219JVNsuJg==", + "dev": true, + "requires": { + "@semantic-release/error": "^2.2.0", + "aggregate-error": "^1.0.0", + "execa": "^1.0.0", + "fs-extra": "^7.0.0", + "lodash": "^4.17.4", + "nerf-dart": "^1.0.0", + "normalize-url": "^4.0.0", + "npm": "^6.3.0", + "rc": "^1.2.8", + "read-pkg": "^4.0.0", + "registry-auth-token": "^3.3.1" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "normalize-url": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.0.0.tgz", + "integrity": "sha512-OrtNzJOeI9+UaF8KfvPoqh8ZVjLiun+fggtLzrpPsmdOU01eIp3vYXDfeFv4KwqJxcmmrW/ubNCN+9iIQRVtfw==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "dev": true, + "requires": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + } + } + } + }, + "@semantic-release/release-notes-generator": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-7.1.4.tgz", + "integrity": "sha512-pWPouZujddgb6t61t9iA9G3yIfp3TeQ7bPbV1ixYSeP6L7gI1+Du82fY/OHfEwyifpymLUQW0XnIKgKct5IMMw==", + "dev": true, + "requires": { + "conventional-changelog-angular": "^5.0.0", + "conventional-changelog-writer": "^4.0.0", + "conventional-commits-filter": "^2.0.0", + "conventional-commits-parser": "^3.0.0", + "debug": "^4.0.0", + "get-stream": "^4.0.0", + "import-from": "^2.1.0", + "into-stream": "^4.0.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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" + } + }, + "into-stream": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-4.0.0.tgz", + "integrity": "sha512-i29KNyE5r0Y/UQzcQ0IbZO1MYJ53Jn0EcFRZPj5FzWKYH17kDFEOwuA+3jroymOI06SW1dEDnly9A1CAreC5dg==", + "dev": true, + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^2.0.0" + } + }, + "p-is-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", + "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", + "dev": true + } + } + }, + "@sheerun/eslint-config-standard": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@sheerun/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz", + "integrity": "sha512-aalIRUtcR6nPf50kEwnYvepSJIdpulrbMeeNMwiOmFgBg4MgScCmlI7SqOmsGJNqaH65+benoqt0H4N0RR2Okg==", + "dev": true + }, "@sindresorhus/is": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", "integrity": "sha1-mgb08TfuhNffBGDB/bETX/psUP0=" }, + "@szmarczak/http-timer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.1.tgz", + "integrity": "sha512-WljfOGkmSJe8SUkl+4TPvN2ec0dpUGVyfTBQLoXJUiILs+wBSc4Kvp2N3aAWE4VwwDSLGdmD3/bufS5BgZpVSQ==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, "@types/async": { "version": "2.0.50", "resolved": "https://registry.npmjs.org/@types/async/-/async-2.0.50.tgz", @@ -570,6 +1583,16 @@ "winston": "*" } }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "abab": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", @@ -580,6 +1603,15 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" }, + "abs": { + "version": "1.3.12", + "resolved": "https://registry.npmjs.org/abs/-/abs-1.3.12.tgz", + "integrity": "sha512-3gGc4URRHTUhdTOzRpnTKSoK+Bo9CcYTMKw7QYEFGzasu9on72GKjXMjZZNYKlAGqbPZfPqCRFRB3zGrX6260A==", + "dev": true, + "requires": { + "ul": "^5.0.0" + } + }, "accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", @@ -594,6 +1626,12 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "dev": true + }, "acorn-globals": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", @@ -610,6 +1648,43 @@ } } }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "acorn-node": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.6.2.tgz", + "integrity": "sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg==", + "dev": true, + "requires": { + "acorn": "^6.0.2", + "acorn-dynamic-import": "^4.0.0", + "acorn-walk": "^6.1.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", + "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", + "dev": true + } + } + }, "acorn-walk": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.0.tgz", @@ -638,6 +1713,31 @@ } } }, + "add-subtract-date": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/add-subtract-date/-/add-subtract-date-1.0.13.tgz", + "integrity": "sha512-vbAsWMVidKHi9Ji8wcpk4ftJBNaascKCxLiV3STxWwPVXkj+oaOUA81RN0lvDhEm0ynUl6C7UUhKGiruWIp7ZQ==", + "dev": true + }, + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "aggregate-error": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-1.0.0.tgz", + "integrity": "sha1-iINE2tAiCnLjr1CQYRf0h3GSX6w=", + "dev": true, + "requires": { + "clean-stack": "^1.0.0", + "indent-string": "^3.0.0" + } + }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", @@ -649,6 +1749,78 @@ "json-schema-traverse": "^0.3.0" } }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "always-error": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/always-error/-/always-error-1.0.0.tgz", + "integrity": "sha1-lchAQs+obzjIbKbCzELAoBA0QbI=", + "dev": true + }, + "am-i-a-dependency": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/am-i-a-dependency/-/am-i-a-dependency-1.1.2.tgz", + "integrity": "sha1-+dNCIwTW9kL4IeTEB1ZQNfYWfx8=", + "dev": true + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "^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" + } + } + } + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-parser": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/ansi-parser/-/ansi-parser-3.2.8.tgz", + "integrity": "sha1-rYCmNRrF5YzH6Kdhq8A3tVBQQdA=", + "dev": true + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -662,6 +1834,41 @@ "color-convert": "^1.9.0" } }, + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", + "dev": true + }, + "ansy": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/ansy/-/ansy-1.0.13.tgz", + "integrity": "sha512-zO9+N/z1cEDQOjJSaqeUQTorTfl1sTfjx7qlQ/IMIE//UgDfmVqrRy9Aop+m0gFZe2+1VpqXw5PZXSbS/LQRVA==", + "dev": true, + "requires": { + "ansi-styles": "^3.0.0", + "custom-return": "^1.0.0", + "supports-color": "^3.1.2", + "ul": "^5.2.1" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -700,6 +1907,12 @@ } } }, + "argv-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", + "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=", + "dev": true + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -720,11 +1933,48 @@ "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -1000,6 +2250,20 @@ } } }, + "babel-eslint": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.1.tgz", + "integrity": "sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "^1.0.0" + } + }, "babel-helper-call-delegate": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", @@ -1418,6 +2682,45 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, + "ban-sensitive-files": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/ban-sensitive-files/-/ban-sensitive-files-1.9.2.tgz", + "integrity": "sha512-8dlYLybLhAKvd2fGoDd2zskdbO8pm/FKxTwy+iA5mqq4bKovZNM4xNAzYWbttW9yjbxTz1O3SN+cyUx3LEG5CQ==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "check-more-types": "2.24.0", + "debug": "3.1.0", + "ggit": "2.4.2", + "lazy-ass": "1.6.0", + "pluralize": "7.0.0", + "ramda": "0.25.0", + "update-notifier": "2.3.0" + }, + "dependencies": { + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", @@ -1487,6 +2790,12 @@ "tweetnacl": "^0.14.3" } }, + "before-after-hook": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.2.0.tgz", + "integrity": "sha512-wI3QtdLppHNkmM1VgRVLCrlWCKk/YexlPicYbXPs4eYdd1InrUCTFsx5bX1iUQzzMsoRXXPpM1r+p7JEJJydag==", + "dev": true + }, "big-integer": { "version": "1.6.36", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", @@ -2289,6 +3598,66 @@ } } }, + "bottleneck": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.13.0.tgz", + "integrity": "sha512-9YmZ0aiKta2OAxTujKCS/INjGWCIGWK4Ff1nQpgHnR4CTjlk9jcnpaHOjPnMZPtqRXkqwKdtxZgvJ9udsXylaw==", + "dev": true + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^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 + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "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" + } + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2340,11 +3709,28 @@ "resolved": "https://registry.npmjs.org/browserify-mime/-/browserify-mime-1.2.9.tgz", "integrity": "sha1-rrGvKN5sDXpqLOQK22j/GEIq8x8=" }, + "browserslist": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.4.tgz", + "integrity": "sha512-u5iz+ijIMUlmV8blX82VGFrB9ecnUg5qEt55CMZ/YJEhha+d8qpBfOFuutJ6F/VKRXjZoD33b6uvarpPxcl3RA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000899", + "electron-to-chromium": "^1.3.82", + "node-releases": "^1.0.1" + } + }, "btoa": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.1.2.tgz", "integrity": "sha1-PkC4FmP4HS3WWWpMtxSo3BbPq+A=" }, + "btoa-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", + "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", + "dev": true + }, "buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", @@ -2388,12 +3774,48 @@ "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" }, + "bug-killer": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/bug-killer/-/bug-killer-4.4.4.tgz", + "integrity": "sha1-luAyK5Q3orBnLXiqzR7SvvEflFo=", + "dev": true, + "requires": { + "ansi-parser": "^3.2.5", + "couleurs": "^6.0.6", + "daty": "^1.0.7", + "deffy": "^2.2.2", + "typpy": "^2.3.6" + }, + "dependencies": { + "couleurs": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/couleurs/-/couleurs-6.0.9.tgz", + "integrity": "sha1-srKj7jfa5Rh1ye/SQ+x+eJSvvJ4=", + "dev": true, + "requires": { + "ansy": "^1.0.0", + "color-convert": "^1.0.0", + "iterate-object": "^1.3.1", + "typpy": "^2.3.1" + } + } + } + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, + "builtins": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-2.0.0.tgz", + "integrity": "sha512-8srrxpDx3a950BHYcbse+xMjupHHECvQYnShkoPz2ZLhTBrk/HQO6nWMh4o4ui8YYp2ourGVYXlGqFm+UYQwmA==", + "dev": true, + "requires": { + "semver": "^5.4.1" + } + }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -2436,11 +3858,90 @@ } } }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, "camelcase": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", "integrity": "sha1-AylVJ9WL081Kp1Nj81sujZe+L0I=" }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "caniuse-lite": { + "version": "1.0.30000907", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000907.tgz", + "integrity": "sha512-No5sQ/OB2Nmka8MNOOM6nJx+Hxt6MQ6h7t7kgJFu9oTuwjykyKRSBP/+i/QAyFHxeHB+ddE0Da1CG5ihx9oehQ==", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, + "cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", + "dev": true, + "requires": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -2477,11 +3978,52 @@ "supports-color": "^5.3.0" } }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "chdir-promise": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/chdir-promise/-/chdir-promise-0.6.2.tgz", + "integrity": "sha512-EG5MutQt4qTxoQPfBtPCfU1A/MqborgaO66xrPSD/dRTB40OLN0wy+YAo5ZAw7DawhtCPdZHAdQ206fyWkhoiw==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "check-more-types": "2.24.0", + "debug": "3.1.0", + "lazy-ass": "1.6.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" }, + "check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", + "dev": true + }, "child_process": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", @@ -2520,6 +4062,23 @@ "moment": "^2.10.3" } }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "class-methods": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/class-methods/-/class-methods-1.0.10.tgz", + "integrity": "sha512-mwuvFIuh0aPMAlgCa6PcYls4+uEm8RMapUw5MgMZWAzdpdC+KvxdsPF/AZJgYTO6cBbdsVzJmOI2yhqs2ONUpA==", + "dev": true, + "requires": { + "exclude-arr": "^1.0.0", + "static-methods": "^1.0.0", + "ul": "^5.2.1" + } + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -2541,11 +4100,117 @@ } } }, + "clean-stack": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", + "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=", + "dev": true + }, + "cli-box": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-box/-/cli-box-5.0.0.tgz", + "integrity": "sha1-hw6oqnfnwlF5QWzsz+XtBpCARgI=", + "dev": true, + "requires": { + "ansi-parser": "3.0.0", + "ul": "5.0.0" + }, + "dependencies": { + "ansi-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-parser/-/ansi-parser-3.0.0.tgz", + "integrity": "sha1-lFwOcjLK9WdSFzdbPriJIAjBRik=", + "dev": true + }, + "deffy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.0.0.tgz", + "integrity": "sha1-+C4I7qUYxKCjCx8D7FBNJIryiTI=", + "dev": true, + "requires": { + "typpy": "^2.0.0" + } + }, + "typpy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.0.0.tgz", + "integrity": "sha1-re87rMEv9Hr/kg+rA6j/MnnXN9Y=", + "dev": true + }, + "ul": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ul/-/ul-5.0.0.tgz", + "integrity": "sha1-yoDXkwJfP9Xcm/g0aYGNMQp8mmI=", + "dev": true, + "requires": { + "deffy": "2.0.0", + "typpy": "2.0.0" + } + } + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, "cli-spinner": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/cli-spinner/-/cli-spinner-0.2.8.tgz", "integrity": "sha1-gWnZ/66HBnZEXm7kOX6Vp6Fb2AU=" }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + } + } + }, + "cli-table2": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/cli-table2/-/cli-table2-0.2.0.tgz", + "integrity": "sha1-LR738hig54biFFQFYtS9F3/jLZc=", + "dev": true, + "requires": { + "colors": "^1.1.2", + "lodash": "^3.10.1", + "string-width": "^1.0.1" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + } + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", @@ -2593,6 +4258,61 @@ "mimic-response": "^1.0.0" } }, + "clp": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/clp/-/clp-3.2.1.tgz", + "integrity": "sha1-rx7WbbiVpcnOm20y6cM97gKz7fI=", + "dev": true, + "requires": { + "ansi-parser": "2.0.0", + "le-table": "4.0.0", + "ul": "5.0.0" + }, + "dependencies": { + "ansi-parser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-parser/-/ansi-parser-2.0.0.tgz", + "integrity": "sha1-QzSYrzL+6MKh3yxOR5QbwCm89Ac=", + "dev": true + }, + "deffy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.0.0.tgz", + "integrity": "sha1-+C4I7qUYxKCjCx8D7FBNJIryiTI=", + "dev": true, + "requires": { + "typpy": "^2.0.0" + } + }, + "le-table": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/le-table/-/le-table-4.0.0.tgz", + "integrity": "sha1-O/63LSTL/Dd1LwFTn5AG1xHZvpM=", + "dev": true, + "requires": { + "cli-box": "5.0.0", + "overlap": "2.0.0", + "ul": "5.0.0" + } + }, + "typpy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.0.0.tgz", + "integrity": "sha1-re87rMEv9Hr/kg+rA6j/MnnXN9Y=", + "dev": true + }, + "ul": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ul/-/ul-5.0.0.tgz", + "integrity": "sha1-yoDXkwJfP9Xcm/g0aYGNMQp8mmI=", + "dev": true, + "requires": { + "deffy": "2.0.0", + "typpy": "2.0.0" + } + } + } + }, "cls-bluebird": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz", @@ -2684,6 +4404,39 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-func": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", + "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^3.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + } + } + }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", @@ -2694,11 +4447,43 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -2709,6 +4494,115 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" }, + "conventional-changelog-angular": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.2.tgz", + "integrity": "sha512-yx7m7lVrXmt4nKWQgWZqxSALEiAKZhOAcbxdUaU9575mB0CzXVbgrgpfSnSP7OqWDUTYGD0YVJ0MSRdyOPgAwA==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "q": "^1.5.1" + } + }, + "conventional-changelog-writer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.2.tgz", + "integrity": "sha512-d8/FQY/fix2xXEBUhOo8u3DCbyEw3UOQgYHxLsPDw+wHUDma/GQGAGsGtoH876WyNs32fViHmTOUrgRKVLvBug==", + "dev": true, + "requires": { + "compare-func": "^1.3.1", + "conventional-commits-filter": "^2.0.1", + "dateformat": "^3.0.0", + "handlebars": "^4.0.2", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.2.1", + "meow": "^4.0.0", + "semver": "^5.5.0", + "split": "^1.0.0", + "through2": "^2.0.0" + } + }, + "conventional-commit-message": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/conventional-commit-message/-/conventional-commit-message-1.1.0.tgz", + "integrity": "sha1-7OjGYaFo6YNpLh1aFIday1lRD2o=", + "dev": true, + "requires": { + "check-more-types": "2.3.0", + "cz-conventional-changelog": "1.1.5", + "lazy-ass": "1.3.0", + "word-wrap": "1.1.0" + }, + "dependencies": { + "check-more-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.3.0.tgz", + "integrity": "sha1-uDl8adySo+ZF8YkywEWwnHRBnsQ=", + "dev": true + }, + "cz-conventional-changelog": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-1.1.5.tgz", + "integrity": "sha1-Ck0VUMTi+2o67Y9s2FjCF2DhGbg=", + "dev": true, + "requires": { + "word-wrap": "^1.0.3" + } + }, + "lazy-ass": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.3.0.tgz", + "integrity": "sha1-fQ0U7vPslwLG8wxg6oHxqNP5APs=", + "dev": true + }, + "word-wrap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.1.0.tgz", + "integrity": "sha1-NWFT1h0QYQ1gB4XF1wEojgrnZKY=", + "dev": true + } + } + }, + "conventional-commit-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-2.2.0.tgz", + "integrity": "sha1-XblXOdbCEqy+e29lahG5QLqmiUY=", + "dev": true + }, + "conventional-commits-filter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.1.tgz", + "integrity": "sha512-92OU8pz/977udhBjgPEbg3sbYzIxMDFTlQT97w7KdhR9igNqdJvy8smmedAAgn4tPiqseFloKkrVfbXCVd+E7A==", + "dev": true, + "requires": { + "is-subset": "^0.1.1", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.1.tgz", + "integrity": "sha512-P6U5UOvDeidUJ8ebHVDIoXzI7gMlQ1OF/id6oUvp8cnZvOXMt1n8nYl74Ey9YMn0uVQtxmCtjPQawpsssBWtGg==", + "dev": true, + "requires": { + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.0", + "lodash": "^4.2.1", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0", + "trim-off-newlines": "^1.0.0" + } + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", @@ -2734,6 +4628,49 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cosmiconfig": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz", + "integrity": "sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "couleurs": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/couleurs/-/couleurs-5.2.1.tgz", + "integrity": "sha1-U5n596FZhS7BQkT4Qb2FjwTcUqM=", + "dev": true, + "requires": { + "flat-colors": "3.0.0", + "typpy": "2.0.0", + "x256": "0.0.2" + }, + "dependencies": { + "typpy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.0.0.tgz", + "integrity": "sha1-re87rMEv9Hr/kg+rA6j/MnnXN9Y=", + "dev": true + } + } + }, "coveralls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.2.tgz", @@ -2766,6 +4703,15 @@ } } }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, "cross-fetch": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-0.0.8.tgz", @@ -2812,6 +4758,12 @@ } } }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, "cssom": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", @@ -2851,6 +4803,49 @@ } } }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "custom-return": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/custom-return/-/custom-return-1.0.10.tgz", + "integrity": "sha512-WF07K2QwOIb6+mHYmiFP7oAlbVL+fkNgCGvjMMFuiVn5HExz75HWOyXslk+GgzEF72JiDlih8MyD1WJB8SYw7w==", + "dev": true, + "requires": { + "noop6": "^1.0.0" + } + }, + "cvss": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cvss/-/cvss-1.0.4.tgz", + "integrity": "sha512-NvyksySgKXK/98Cdc0IqP7UU/LKFy0O//hoCSQdahcP5w1oSZvOhAeb7PmTmIAkELfyoWGX1jeQKqYCBWy4RyQ==", + "dev": true + }, + "cz-conventional-changelog": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-2.1.0.tgz", + "integrity": "sha1-L0vHOQ4yROTfKT5ro1Hkx0Cnx2Q=", + "dev": true, + "requires": { + "conventional-commit-types": "^2.0.0", + "lodash.map": "^4.5.1", + "longest": "^1.0.1", + "right-pad": "^1.0.1", + "word-wrap": "^1.0.3" + } + }, + "d3-helpers": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/d3-helpers/-/d3-helpers-0.3.0.tgz", + "integrity": "sha1-SzHc5KISGnczY4RXTYk/vtX7KT0=", + "dev": true + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -2881,11 +4876,42 @@ } } }, + "date-unit-ms": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/date-unit-ms/-/date-unit-ms-1.1.12.tgz", + "integrity": "sha512-ww06+LI2h8OY80ZxH6x7dFwSmuiWtIGegxfYWj8vAPSLBbwAFxjgAGZd4f0Dibekf5qXLWVAxzo5gNyI6TMu0w==", + "dev": true + }, "date-utils": { "version": "1.2.21", "resolved": "https://registry.npmjs.org/date-utils/-/date-utils-1.2.21.tgz", "integrity": "sha1-YfsWzcEnSzyayq/+n8ad+HIKK2Q=" }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "daty": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/daty/-/daty-1.1.4.tgz", + "integrity": "sha512-+rVSSQ0TMLtyUuBJwDj8o52wpfHzrip2lICUnp0ccqdQJqWSdUde2E5+CviRvfCN03X74SyWOZlMo5TLxgWLFA==", + "dev": true, + "requires": { + "add-subtract-date": "^1.0.0", + "class-methods": "^1.0.4", + "date-unit-ms": "^1.1.0", + "diff-dates": "^1.0.0", + "formatoid": "^1.0.0" + } + }, + "days": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/days/-/days-1.1.1.tgz", + "integrity": "sha512-vzeIwVsEIyA35GH4+mPd4hjVDNI87wYANyZFs0BHjBr5kIBH5zEl7LfD6Wr4SFZca4D3CU9IH1w4DuZLlXzKRw==", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2901,11 +4927,41 @@ } } }, + "debug-log": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", + "dev": true + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -2987,6 +5043,30 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, + "defer-to-connect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.0.1.tgz", + "integrity": "sha512-2e0FJesseUqQj671gvZWfUyxpnFx/5n4xleamlpCD3U6Fm5dh5qzmmLNxNhtmHF06+SYVHH8QU6FACffYTnj0Q==", + "dev": true + }, + "deffy": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.2.2.tgz", + "integrity": "sha1-CI9AkTy0cHhlP6b2l8IG4DRx1SM=", + "dev": true, + "requires": { + "typpy": "^2.0.0" + } + }, + "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", @@ -3024,6 +5104,63 @@ } } }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "deglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", + "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", + "dev": true, + "requires": { + "find-root": "^1.0.0", + "glob": "^7.0.5", + "ignore": "^3.0.9", + "pkg-config": "^1.1.0", + "run-parallel": "^1.1.2", + "uniq": "^1.0.1" + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -3039,6 +5176,95 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, + "dependency-check": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/dependency-check/-/dependency-check-3.2.1.tgz", + "integrity": "sha512-l2pC6U58I7CLqbYr32fP7OJnqgr3ubvMwEaG0ly9AWm0/k+8/nLQG0WaFYkGtlnQT6K7H8BidB22I7DU4XLZ2A==", + "dev": true, + "requires": { + "builtins": "^2.0.0", + "debug": "^4.0.0", + "detective": "^5.0.2", + "globby": "^8.0.1", + "is-relative": "^1.0.0", + "minimist": "^1.2.0", + "read-package-json": "^2.0.10", + "resolve": "^1.1.7" + }, + "dependencies": { + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "deps-ok": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/deps-ok/-/deps-ok-1.4.1.tgz", + "integrity": "sha512-5S216xoLM4mwrBUZBVVXIdkIxnp8TLjK1QeghAEJHiwxIpNpGJd5RkNR59duRCNPey8k/UlWh39WknjXH3mBDQ==", + "dev": true, + "requires": { + "check-more-types": "2.24.0", + "debug": "3.1.0", + "lazy-ass": "1.6.0", + "lodash": "4.17.10", + "minimist": "1.2.0", + "q": "2.0.3", + "quote": "0.4.0", + "semver": "5.5.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "q": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/q/-/q-2.0.3.tgz", + "integrity": "sha1-dbjbAlWhpa+C9Yw/Oqoe/sfQ0TQ=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "pop-iterate": "^1.0.1", + "weak-map": "^1.0.5" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + } + } + }, "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", @@ -3049,6 +5275,35 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, + "detective": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz", + "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==", + "dev": true, + "requires": { + "acorn-node": "^1.3.0", + "defined": "^1.0.0", + "minimist": "^1.1.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "diagnostics": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", @@ -3064,6 +5319,31 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=" }, + "diff-dates": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/diff-dates/-/diff-dates-1.0.11.tgz", + "integrity": "sha512-0okw/rlclr+J86tWInxVoC55F6Ixgl83GF+G8z6wDU4EKRoEBqJMpJ7Ios863o95pXt14pmG0zx2MBUVBEQi7A==", + "dev": true, + "requires": { + "date-unit-ms": "^1.1.0" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "dlv": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.2.tgz", + "integrity": "sha512-xxD4VSH67GbRvSGUrckvha94RD7hjgOH7rqGxiytLpkaeMvixOHFZTGFK6EkIm3T761OVHT8ABHmGkq9gXgu6Q==", + "dev": true + }, "dns-packet": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", @@ -3081,6 +5361,15 @@ "dns-packet": "^1.1.0" } }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "documentdb": { "version": "1.14.5", "resolved": "https://registry.npmjs.org/documentdb/-/documentdb-1.14.5.tgz", @@ -3115,6 +5404,15 @@ "webidl-conversions": "^4.0.2" } }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, "dotenv": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.0.0.tgz", @@ -3144,6 +5442,15 @@ "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -3172,6 +5479,12 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "electron-to-chromium": { + "version": "1.3.84", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.84.tgz", + "integrity": "sha512-IYhbzJYOopiTaNWMBp7RjbecUBsbnbDneOP86f3qvS0G0xfzwNSvMJpTrvi5/Y1gU7tg2NAgeg8a8rCYvW9Whw==", + "dev": true + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -3204,6 +5517,15 @@ "iconv-lite": "~0.4.13" } }, + "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" + } + }, "enhanced-resolve": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", @@ -3215,6 +5537,42 @@ "tapable": "^1.0.0" } }, + "env-ci": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-3.1.0.tgz", + "integrity": "sha512-+yFT8QX8W9bee0/fuzKvqt2vEhWvU3FXZ1P5xbveDq/EqcYLh4e0QNE16okUS3pawALDGXE9eCJPVeWY0/ilQA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "java-properties": "^0.2.9" + }, + "dependencies": { + "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" + } + }, + "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" + } + } + } + }, "env-variable": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz", @@ -3229,6 +5587,47 @@ "prr": "~1.0.1" } }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + } + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "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" + } + }, "es6-denodeify": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/es6-denodeify/-/es6-denodeify-0.1.5.tgz", @@ -3245,6 +5644,15 @@ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", "integrity": "sha1-2m0NVpLvtGHggsFIF/4kJ9j10FQ=" }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, "es6-shim": { "version": "0.35.3", "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.3.tgz", @@ -3285,12 +5693,278 @@ } } }, + "eslint": { + "version": "4.19.1", + "resolved": "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "dev": true, + "requires": { + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "4.0.2", + "text-table": "~0.2.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 + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "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" + } + }, + "globals": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", + "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "eslint-config-standard": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", + "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", + "dev": true + }, + "eslint-config-standard-jsx": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz", + "integrity": "sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg==", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.5.0" + } + }, + "eslint-module-utils": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", + "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" + } + }, + "eslint-plugin-es": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.3.2.tgz", + "integrity": "sha512-xrdbConViY20DhGrt9FwjhDo4fr/9Yus2pYf0xJsdJaCcUzMq7+pAoNH7kSXF6V08bRHMpgDWclYbcr/Sn3hNg==", + "dev": true, + "requires": { + "eslint-utils": "^1.3.0", + "regexpp": "^2.0.1" + }, + "dependencies": { + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", + "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "dev": true, + "requires": { + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + } + } + }, + "eslint-plugin-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", + "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", + "dev": true, + "requires": { + "eslint-plugin-es": "^1.3.1", + "eslint-utils": "^1.3.1", + "ignore": "^4.0.2", + "minimatch": "^3.0.4", + "resolve": "^1.8.1", + "semver": "^5.5.0" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", + "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", + "dev": true + }, + "eslint-plugin-react": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", + "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.2" + } + }, + "eslint-plugin-standard": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz", + "integrity": "sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA==", + "dev": true + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "3.5.4", + "resolved": "http://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", "dev": true }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", @@ -3306,6 +5980,22 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, + "exclude-arr": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/exclude-arr/-/exclude-arr-1.0.9.tgz", + "integrity": "sha512-56pdiJngqQg7Rc4RR0ypVoOlm3GpJUkDNr0p8MKLWo4eavZEhYZDQmCM8QftvIuNjem4yoPf5xwQ9NKVq56VZA==", + "dev": true + }, + "exec-limiter": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/exec-limiter/-/exec-limiter-3.2.11.tgz", + "integrity": "sha512-In82PmbeZ7spR2eJh2mlxVOU2q+TqevTvArNIyjHWasvSZuHSUqz3DqgWOOrTQir1/Q1yYE7SOdiqAsLrEP8Ng==", + "dev": true, + "requires": { + "limit-it": "^3.0.0", + "typpy": "^2.1.0" + } + }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", @@ -3332,6 +6022,12 @@ } } }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -3442,6 +6138,17 @@ } } }, + "external-editor": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -3511,6 +6218,20 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" }, + "fast-glob": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.4.tgz", + "integrity": "sha512-FjK2nCGI/McyzgNtTESqaWP3trPvHyRyoyY70hxjc3oKPNmDe8taohLZpoVKoUjW85tbU5txaYUZCNtVzygl1g==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, "fast-json-patch": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.0.7.tgz", @@ -3548,6 +6269,25 @@ "tough-cookie": "^2.3.1" } }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, "filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", @@ -3584,6 +6324,12 @@ } } }, + "fillo": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fillo/-/fillo-1.0.11.tgz", + "integrity": "sha512-3YWc82rxHEJUCMbHXxYwnu6X4zmOKjqVLtU0NsTOaPFj1lF8YaqodE+efvEPyq7kL5W8kT91OfO6KU1HVwBDzQ==", + "dev": true + }, "finalhandler": { "version": "1.1.1", "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", @@ -3605,6 +6351,40 @@ } } }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "find-parent-dir": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "dev": true + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -3613,6 +6393,54 @@ "locate-path": "^2.0.0" } }, + "find-versions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.0.0.tgz", + "integrity": "sha512-IUvtItVFNmTtKoB0PRfbkR0zR9XMG5rWNO3qI1S8L0zdv+v2gqzM0pAunloxqbqAfT8w7bg8n/5gHzTXte8H5A==", + "dev": true, + "requires": { + "array-uniq": "^2.0.0", + "semver-regex": "^2.0.0" + }, + "dependencies": { + "array-uniq": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-2.0.0.tgz", + "integrity": "sha512-O3QZEr+3wDj7otzF7PjNGs6CA3qmYMLvt5xGkjY/V0VxS+ovvqVo/5wKM/OVOAyuX4DTh9H31zE/yKtO66hTkg==", + "dev": true + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + } + } + }, + "findup": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/findup/-/findup-0.1.5.tgz", + "integrity": "sha1-itkpozk7rGJ5V6fl3kYjsGsOLOs=", + "dev": true, + "requires": { + "colors": "~0.6.0-1", + "commander": "~2.1.0" + }, + "dependencies": { + "colors": { + "version": "0.6.2", + "resolved": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", + "dev": true + }, + "commander": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", + "dev": true + } + } + }, "flat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", @@ -3628,6 +6456,24 @@ } } }, + "flat-cache": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.2.tgz", + "integrity": "sha512-KByBY8c98sLUAGpnmjEdWTrtrLZRtZdwds+kAL/ciFXTCb7AZgqKsAnVnYFQj1hxepwO8JKN/8AsRWwLq+RK0A==", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "del": "^3.0.0", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" + } + }, + "flat-colors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/flat-colors/-/flat-colors-3.0.0.tgz", + "integrity": "sha1-JTqxojmJwyHxOwrNS/c//0By7Lc=", + "dev": true + }, "follow-redirects": { "version": "1.5.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.9.tgz", @@ -3671,6 +6517,18 @@ "mime-types": "^2.1.12" } }, + "formatoid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formatoid/-/formatoid-1.2.2.tgz", + "integrity": "sha512-3pt8YwLgc5FSJdn+yaNF/3Mzqvp6keq0cEPQbZECDY1Jwg29fs82GPIE34KkB0I4Zgm9ukfYJH7Kw//TCaOA/g==", + "dev": true, + "requires": { + "days": "^1.0.1", + "fillo": "^1.0.0", + "months": "^1.0.0", + "parse-it": "^1.0.0" + } + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -3764,11 +6622,13 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true + "bundled": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3785,7 +6645,8 @@ }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", @@ -3914,6 +6775,7 @@ "minimatch": { "version": "3.0.4", "bundled": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4191,6 +7053,12 @@ } } }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "function.name": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/function.name/-/function.name-1.0.11.tgz", @@ -4199,6 +7067,12 @@ "noop6": "^1.0.1" } }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -4242,6 +7116,12 @@ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" }, + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "dev": true + }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -4260,6 +7140,175 @@ "assert-plus": "^1.0.0" } }, + "ggit": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/ggit/-/ggit-2.4.2.tgz", + "integrity": "sha512-4pltyhG4cjVT1Nqs9pq8Iykc/lTibc4LKRUAxszA9+OgwpfGhbsFgzhtyXwh5AbiWZrBa87nIHzyVGlJoT4nCw==", + "dev": true, + "requires": { + "always-error": "1.0.0", + "bluebird": "3.5.1", + "chdir-promise": "0.6.2", + "check-more-types": "2.24.0", + "cli-table": "0.3.1", + "colors": "1.1.2", + "commander": "2.12.2", + "d3-helpers": "0.3.0", + "debug": "3.1.0", + "find-up": "2.1.0", + "glob": "7.1.2", + "lazy-ass": "1.6.0", + "lodash": "4.17.4", + "moment": "2.19.3", + "moment-timezone": "0.5.14", + "optimist": "0.6.1", + "pluralize": "7.0.0", + "q": "2.0.3", + "quote": "0.4.0", + "ramda": "0.25.0", + "semver": "5.4.1" + }, + "dependencies": { + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "http://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "commander": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", + "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "moment": { + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.3.tgz", + "integrity": "sha1-vbmdJw1tf9p4zA+6zoVeJ/59pp8=", + "dev": true + }, + "moment-timezone": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.14.tgz", + "integrity": "sha1-TrOP+VOLgBCLpGekWPPtQmjM/LE=", + "dev": true, + "requires": { + "moment": ">= 2.9.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "q": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/q/-/q-2.0.3.tgz", + "integrity": "sha1-dbjbAlWhpa+C9Yw/Oqoe/sfQ0TQ=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "pop-iterate": "^1.0.1", + "weak-map": "^1.0.5" + } + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + } + } + }, + "git-issues": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/git-issues/-/git-issues-1.3.1.tgz", + "integrity": "sha1-bS11fH+0Fnt2UI39Y1v7m2aDMxc=", + "dev": true, + "requires": { + "abs": "^1.0.0", + "bug-killer": "^4.0.0", + "clp": "^3.0.0", + "couleurs": "^5.0.0", + "git-url-parse": "^4.0.0", + "gry": "^4.1.0", + "is-there": "^4.1.0", + "le-table": "^4.0.0", + "request": "^2.55.0" + } + }, + "git-log-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", + "integrity": "sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo=", + "dev": true, + "requires": { + "argv-formatter": "~1.0.0", + "spawn-error-forwarder": "~1.0.0", + "split2": "~1.0.0", + "stream-combiner2": "~1.1.1", + "through2": "~2.0.0", + "traverse": "~0.6.6" + }, + "dependencies": { + "split2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", + "integrity": "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=", + "dev": true, + "requires": { + "through2": "~2.0.0" + } + }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "dev": true + } + } + }, + "git-up": { + "version": "1.2.1", + "resolved": "http://registry.npmjs.org/git-up/-/git-up-1.2.1.tgz", + "integrity": "sha1-JkSAoAax2EJhrB/gmjpRacV+oZ0=", + "dev": true, + "requires": { + "is-ssh": "^1.0.0", + "parse-url": "^1.0.0" + } + }, + "git-url-parse": { + "version": "4.2.1", + "resolved": "http://registry.npmjs.org/git-url-parse/-/git-url-parse-4.2.1.tgz", + "integrity": "sha1-BAm0GRiOdc+6JjV1KKfUO+witRc=", + "dev": true, + "requires": { + "git-up": "^1.0.0" + } + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -4292,11 +7341,41 @@ } } }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=" }, + "globby": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, "got": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", @@ -4352,6 +7431,17 @@ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=" }, + "gry": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/gry/-/gry-4.3.1.tgz", + "integrity": "sha1-J49v34nV6JcuS3x4rC0aDM1jKUE=", + "dev": true, + "requires": { + "exec-limiter": "^3.0.0", + "one-by-one": "^2.0.0", + "ul": "^5.0.0" + } + }, "handlebars": { "version": "4.0.12", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", @@ -4384,6 +7474,15 @@ "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-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -4402,6 +7501,12 @@ "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", "integrity": "sha1-FAn5i8ACR9pF2mfO4KNvKC/yZFU=" }, + "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-to-string-tag-x": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", @@ -4479,6 +7584,30 @@ "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", "integrity": "sha1-ljRQKqEsRF3Vp8VzS1cruHOKrLs=" }, + "home-or-tmp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-3.0.0.tgz", + "integrity": "sha1-V6j+JM8zzdUkhgoVgh3cJchmcfs=", + "dev": true + }, + "hook-std": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-1.1.0.tgz", + "integrity": "sha512-aIyBZbZl3NS8XoSwIDQ+ZaiBuPOhhPWoBFA3QX0Q8hOMO8Tx4xGRTDnn/nl/LAtZWdieXzFC9ohAtTSnWrlHCQ==", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "hr": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/hr/-/hr-0.1.3.tgz", + "integrity": "sha1-2aow9ZKdq/0LZbo5WTij4YTbyv4=", + "dev": true + }, "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", @@ -4508,6 +7637,33 @@ "statuses": ">= 1.4.0 < 2" } }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -4518,6 +7674,27 @@ "sshpk": "^1.7.0" } }, + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "dev": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.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" + } + } + } + }, "iconv-lite": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", @@ -4531,6 +7708,12 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, "ignore-walk": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", @@ -4539,6 +7722,68 @@ "minimatch": "^3.0.4" } }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "dependencies": { + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, "inflection": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", @@ -4563,6 +7808,175 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "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" + } + } + } + }, + "inquirer-confirm": { + "version": "0.2.2", + "resolved": "http://registry.npmjs.org/inquirer-confirm/-/inquirer-confirm-0.2.2.tgz", + "integrity": "sha1-b0BtA3v52eRV7w+VOSnzV/6aiEg=", + "dev": true, + "requires": { + "bluebird": "2.9.24", + "inquirer": "0.8.2" + }, + "dependencies": { + "ansi-regex": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", + "integrity": "sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "bluebird": { + "version": "2.9.24", + "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.9.24.tgz", + "integrity": "sha1-FKLnXwVIMj3DWqRA2SAHyhVOlnw=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-width": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-1.1.1.tgz", + "integrity": "sha1-pNKT72frt7iNSk1CwMzwDE0eNm0=", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "inquirer": { + "version": "0.8.2", + "resolved": "http://registry.npmjs.org/inquirer/-/inquirer-0.8.2.tgz", + "integrity": "sha1-QVhlSOHF2bP4HfcyUDS6rKtvWKs=", + "dev": true, + "requires": { + "ansi-regex": "^1.1.1", + "chalk": "^1.0.0", + "cli-width": "^1.0.1", + "figures": "^1.3.5", + "lodash": "^3.3.1", + "readline2": "^0.1.1", + "rx": "^2.4.3", + "through": "^2.3.6" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha1-qSGZYKbV1dBGWXruUSUsZlX3F34=", + "dev": true + }, + "readline2": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-0.1.1.tgz", + "integrity": "sha1-mUQ7pug7gw7zBRv9fcJBqCco1Wg=", + "dev": true, + "requires": { + "mute-stream": "0.0.4", + "strip-ansi": "^2.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", + "integrity": "sha1-32LBqpTtLxFOHQ8h/R1QSCt5pg4=", + "dev": true, + "requires": { + "ansi-regex": "^1.0.0" + } + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, "int64-buffer": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-0.1.10.tgz", @@ -4650,6 +8064,21 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "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", @@ -4668,6 +8097,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", @@ -4685,6 +8120,12 @@ } } }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -4711,6 +8152,16 @@ "is-extglob": "^2.1.1" } }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, "is-ip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", @@ -4719,6 +8170,12 @@ "ip-regex": "^2.0.0" } }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -4737,11 +8194,41 @@ } } }, + "is-obj": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, "is-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -4765,21 +8252,99 @@ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "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-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, + "is-ssh": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.0.tgz", + "integrity": "sha1-6+oRaaJhTaOSpjdANmw84EnY3/Y=", + "dev": true, + "requires": { + "protocols": "^1.1.0" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "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-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-there": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/is-there/-/is-there-4.4.3.tgz", + "integrity": "sha1-osSTZsakh/cZ28rYDL3iEkjSwY0=", + "dev": true + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -4844,6 +8409,19 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, + "issue-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-3.0.0.tgz", + "integrity": "sha512-VWIhBdy0eOhlvpxOOMecBCHMpjx7lWVZcYpSzjD4dSdxptzI9TBR/cQEh057HL8+7jQKTLs+uCtezY/9VoveCA==", + "dev": true, + "requires": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + } + }, "istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", @@ -4872,6 +8450,18 @@ "is-object": "^1.0.1" } }, + "iterate-object": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.2.tgz", + "integrity": "sha1-JOwVr/pdADnog5aVohwsrh9Ftms=", + "dev": true + }, + "java-properties": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-0.2.10.tgz", + "integrity": "sha512-CpKJh9VRNhS+XqZtg1UMejETGEiqwCGDC/uwPEEQwc2nfdbSm73SIE29TplG2gLYuBOOTNDqxzG6A9NtEPLt0w==", + "dev": true + }, "joi": { "version": "6.10.1", "resolved": "http://registry.npmjs.org/joi/-/joi-6.10.1.tgz", @@ -4890,6 +8480,12 @@ } } }, + "js-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.4.tgz", + "integrity": "sha512-PxfGzSs0ztShKrUYPIn5r0MtyAhYcCwmndozzpz8YObbPnD1jFxzlBGbRnX2mIu6Z13xN6+PTu05TQFnZFlzow==", + "dev": true + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -4962,6 +8558,12 @@ "jsonparse": "~1.2.0" } }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -4972,6 +8574,12 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -5029,6 +8637,15 @@ "verror": "1.10.0" } }, + "jsx-ast-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", + "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "dev": true, + "requires": { + "array-includes": "^3.0.3" + } + }, "jwa": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.6.tgz", @@ -5069,6 +8686,45 @@ "colornames": "^1.1.1" } }, + "largest-semantic-change": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/largest-semantic-change/-/largest-semantic-change-1.1.0.tgz", + "integrity": "sha1-R/W+AAaqNENH0+d2lRoD1caS0v0=", + "dev": true, + "requires": { + "check-more-types": "2.23.0", + "lazy-ass": "1.5.0" + }, + "dependencies": { + "check-more-types": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.23.0.tgz", + "integrity": "sha1-YiYmTTCxCVqhwKW4dO291dLQpm8=", + "dev": true + }, + "lazy-ass": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.5.0.tgz", + "integrity": "sha1-yhW+JDx8R1uFZc2/oPnC83TyoB0=", + "dev": true + } + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", + "dev": true + }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -5083,6 +8739,44 @@ "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", "dev": true }, + "le-table": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/le-table/-/le-table-4.2.2.tgz", + "integrity": "sha1-faFqA5nQHZzrlTYokYiidBXPEME=", + "dev": true, + "requires": { + "cli-box": "5.0.0", + "overlap": "2.0.0", + "ul": "5.0.0" + }, + "dependencies": { + "deffy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.0.0.tgz", + "integrity": "sha1-+C4I7qUYxKCjCx8D7FBNJIryiTI=", + "dev": true, + "requires": { + "typpy": "^2.0.0" + } + }, + "typpy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.0.0.tgz", + "integrity": "sha1-re87rMEv9Hr/kg+rA6j/MnnXN9Y=", + "dev": true + }, + "ul": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ul/-/ul-5.0.0.tgz", + "integrity": "sha1-yoDXkwJfP9Xcm/g0aYGNMQp8mmI=", + "dev": true, + "requires": { + "deffy": "2.0.0", + "typpy": "2.0.0" + } + } + } + }, "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", @@ -5097,6 +8791,64 @@ "type-check": "~0.3.2" } }, + "license-checker": { + "version": "24.0.1", + "resolved": "https://registry.npmjs.org/license-checker/-/license-checker-24.0.1.tgz", + "integrity": "sha512-9qgTmu3aAk4e2L6fWQLLVcip/tZJ0x2K8ZfmEIo8nsB3cibSw/Lp/YplBiOOI3SfnEfLb50T3rDq3X6gai4dEw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "read-installed": "~4.0.3", + "semver": "^5.5.0", + "spdx": "^0.5.1", + "spdx-correct": "^3.0.0", + "spdx-satisfies": "^4.0.0", + "treeify": "^1.1.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" + } + } + } + }, + "limit-it": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/limit-it/-/limit-it-3.2.8.tgz", + "integrity": "sha1-uXsBRhzPVNt3fP3318Dty/sBCUo=", + "dev": true, + "requires": { + "typpy": "^2.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, "loader-utils": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", @@ -5166,6 +8918,18 @@ "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", + "dev": true + }, "lodash.create": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", @@ -5251,11 +9015,29 @@ "resolved": "https://registry.npmjs.org/lodash.last/-/lodash.last-3.0.0.tgz", "integrity": "sha1-JC9mMRLdTG5jcoxgo8kJ0b2tvUw=" }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", + "dev": true + }, "lodash.max": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.max/-/lodash.max-4.0.1.tgz", "integrity": "sha1-hzVWbGGLNan3YFILSHrnllivE2o=" }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", + "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", + "dev": true + }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -5266,6 +9048,12 @@ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, "lodash.tonumber": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/lodash.tonumber/-/lodash.tonumber-4.0.3.tgz", @@ -5276,6 +9064,18 @@ "resolved": "https://registry.npmjs.org/lodash.trimend/-/lodash.trimend-4.5.1.tgz", "integrity": "sha1-EoBENyhrmMrYmWt5QU4RMAEUCC8=" }, + "lodash.unescape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", + "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", + "dev": true + }, + "lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", + "dev": true + }, "log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", @@ -5294,6 +9094,55 @@ "triple-beam": "^1.2.0" } }, + "loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", + "dev": true + }, + "loglevel-colored-level-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", + "integrity": "sha1-akAhj9x64V/HbD0PPmdsRlOIYD4=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "loglevel": "^1.4.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -5302,6 +9151,16 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -5323,16 +9182,64 @@ } } }, + "macos-release": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-1.1.0.tgz", + "integrity": "sha512-mmLbumEYMi5nXReB9js3WGsB8UE6cDBWyIO62Z4DNx6GbRhDxHNjA1MlzSpJ2S2KM1wyiPRA0d19uHWYYvMHjA==", + "dev": true + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, "make-error": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", "integrity": "sha1-7+ToH22yjK3WBccPKcgxtY73dsg=" }, + "make-plural": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-4.3.0.tgz", + "integrity": "sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + } + } + }, + "map-age-cleaner": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz", + "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==", + "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", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -5346,6 +9253,19 @@ "resolved": "https://registry.npmjs.org/marked/-/marked-0.5.1.tgz", "integrity": "sha512-iUkBZegCZou4AdwbKTwSW/lNDcz5OuRSl3qdcl31Ia0B2QPG0Jn+tKblh/9/eP9/6+4h27vpoh8wel/vQOV0vw==" }, + "marked-terminal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-3.1.1.tgz", + "integrity": "sha512-7UBFww1rdx0w9HehLMCVYa8/AxXaiDigDfMsJcj82/wgLQG9cj+oiMAVlJpeWD57VFJY2OYY+bKeEVIjIlxi+w==", + "dev": true, + "requires": { + "cardinal": "^2.1.1", + "chalk": "^2.4.1", + "cli-table": "^0.3.1", + "lodash.assign": "^4.2.0", + "node-emoji": "^1.4.1" + } + }, "md5.js": { "version": "1.3.4", "resolved": "http://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", @@ -5378,11 +9298,129 @@ "readable-stream": "^2.0.1" } }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + } + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "merge2": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", + "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", + "dev": true + }, + "messageformat": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/messageformat/-/messageformat-1.1.1.tgz", + "integrity": "sha512-Q0uXcDtF5pEZsVSyhzDOGgZZK6ykN79VY9CwU3Nv0gsqx62BjdJW0MT+63UkHQ4exe3HE33ZlxR2/YwoJarRTg==", + "dev": true, + "requires": { + "glob": "~7.0.6", + "make-plural": "^4.1.1", + "messageformat-parser": "^1.1.0", + "nopt": "~3.0.6", + "reserved-words": "^0.1.2" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "messageformat-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/messageformat-parser/-/messageformat-parser-1.1.0.tgz", + "integrity": "sha512-Hwem6G3MsKDLS1FtBRGIs8T50P1Q00r3srS6QJePCFbad9fq0nYxwf3rnU2BreApRGhmpKMV7oZI06Sy1c9TPA==", + "dev": true + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -5449,6 +9487,16 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, "minipass": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", @@ -5544,6 +9592,12 @@ "yargs": "^11.0.0" } }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true + }, "moment": { "version": "2.22.2", "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", @@ -5557,6 +9611,12 @@ "moment": ">= 2.9.0" } }, + "months": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/months/-/months-1.2.0.tgz", + "integrity": "sha512-zFM7hUpziSYGk2DNObYGWgHdRRxAOgjl8CC1Rbl50p/q0rGDsREfk0nbxxmSIquVi/lEAuUY8nwbwkZ8biNCOQ==", + "dev": true + }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -5680,6 +9740,12 @@ "resolved": "https://registry.npmjs.org/mstranslator/-/mstranslator-3.0.0.tgz", "integrity": "sha1-ancOpFD/tMZfaNXmruBRuC3gXPM=" }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, "nan": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", @@ -5708,6 +9774,12 @@ "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", "integrity": "sha1-eJkHjmS/PIo9cyYBs9QP8F21j6A=" }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "ndjson": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-1.5.0.tgz", @@ -5762,6 +9834,12 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, + "nerf-dart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", + "integrity": "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=", + "dev": true + }, "nexmo": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/nexmo/-/nexmo-2.4.0.tgz", @@ -5845,6 +9923,15 @@ } } }, + "node-emoji": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz", + "integrity": "sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg==", + "dev": true, + "requires": { + "lodash.toarray": "^4.4.0" + } + }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", @@ -5854,6 +9941,12 @@ "is-stream": "^1.0.1" } }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, "node-pre-gyp": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz", @@ -5871,6 +9964,21 @@ "tar": "^4" } }, + "node-releases": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.3.tgz", + "integrity": "sha512-ZaZWMsbuDcetpHmYeKWPO6e63pSXLb50M7lJgCbcM2nC/nQC3daNifmtp5a2kp7EWwYfhuvH6zLPWkrF8IiDdw==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "nodesecurity-npm-utils": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nodesecurity-npm-utils/-/nodesecurity-npm-utils-6.0.0.tgz", + "integrity": "sha512-NLRle1woNaT2orR6fue2jNqkhxDTktgJj3sZxvR/8kp21pvOY7Gwlx5wvo0H8ZVPqdgd2nE2ADB9wDu5Cl8zNg==", + "dev": true + }, "noop6": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/noop6/-/noop6-1.0.7.tgz", @@ -5885,6 +9993,18 @@ "osenv": "^0.1.4" } }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", @@ -5903,6 +10023,3089 @@ "sort-keys": "^2.0.0" } }, + "npm": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/npm/-/npm-6.4.1.tgz", + "integrity": "sha512-mXJL1NTVU136PtuopXCUQaNWuHlXCTp4McwlSW8S9/Aj8OEPAlSBgo8og7kJ01MjCDrkmqFQTvN5tTEhBMhXQg==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "abbrev": "~1.1.1", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "aproba": "~1.2.0", + "archy": "~1.0.0", + "bin-links": "^1.1.2", + "bluebird": "~3.5.1", + "byte-size": "^4.0.3", + "cacache": "^11.2.0", + "call-limit": "~1.1.0", + "chownr": "~1.0.1", + "ci-info": "^1.4.0", + "cli-columns": "^3.1.2", + "cli-table3": "^0.5.0", + "cmd-shim": "~2.0.2", + "columnify": "~1.5.4", + "config-chain": "~1.1.11", + "debuglog": "*", + "detect-indent": "~5.0.0", + "detect-newline": "^2.1.0", + "dezalgo": "~1.0.3", + "editor": "~1.0.0", + "figgy-pudding": "^3.4.1", + "find-npm-prefix": "^1.0.2", + "fs-vacuum": "~1.2.10", + "fs-write-stream-atomic": "~1.0.10", + "gentle-fs": "^2.0.1", + "glob": "~7.1.2", + "graceful-fs": "~4.1.11", + "has-unicode": "~2.0.1", + "hosted-git-info": "^2.7.1", + "iferr": "^1.0.2", + "imurmurhash": "*", + "inflight": "~1.0.6", + "inherits": "~2.0.3", + "ini": "^1.3.5", + "init-package-json": "^1.10.3", + "is-cidr": "^2.0.6", + "json-parse-better-errors": "^1.0.2", + "lazy-property": "~1.0.0", + "libcipm": "^2.0.2", + "libnpmhook": "^4.0.1", + "libnpx": "^10.2.0", + "lock-verify": "^2.0.2", + "lockfile": "^1.0.4", + "lodash._baseindexof": "*", + "lodash._baseuniq": "~4.6.0", + "lodash._bindcallback": "*", + "lodash._cacheindexof": "*", + "lodash._createcache": "*", + "lodash._getnative": "*", + "lodash.clonedeep": "~4.5.0", + "lodash.restparam": "*", + "lodash.union": "~4.6.0", + "lodash.uniq": "~4.5.0", + "lodash.without": "~4.4.0", + "lru-cache": "^4.1.3", + "meant": "~1.0.1", + "mississippi": "^3.0.0", + "mkdirp": "~0.5.1", + "move-concurrently": "^1.0.1", + "node-gyp": "^3.8.0", + "nopt": "~4.0.1", + "normalize-package-data": "~2.4.0", + "npm-audit-report": "^1.3.1", + "npm-cache-filename": "~1.0.2", + "npm-install-checks": "~3.0.0", + "npm-lifecycle": "^2.1.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.11", + "npm-pick-manifest": "^2.1.0", + "npm-profile": "^3.0.2", + "npm-registry-client": "^8.6.0", + "npm-registry-fetch": "^1.1.0", + "npm-user-validate": "~1.0.0", + "npmlog": "~4.1.2", + "once": "~1.4.0", + "opener": "^1.5.0", + "osenv": "^0.1.5", + "pacote": "^8.1.6", + "path-is-inside": "~1.0.2", + "promise-inflight": "~1.0.1", + "qrcode-terminal": "^0.12.0", + "query-string": "^6.1.0", + "qw": "~1.0.1", + "read": "~1.0.7", + "read-cmd-shim": "~1.0.1", + "read-installed": "~4.0.3", + "read-package-json": "^2.0.13", + "read-package-tree": "^5.2.1", + "readable-stream": "^2.3.6", + "readdir-scoped-modules": "*", + "request": "^2.88.0", + "retry": "^0.12.0", + "rimraf": "~2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.5.0", + "sha": "~2.0.1", + "slide": "~1.1.6", + "sorted-object": "~2.0.1", + "sorted-union-stream": "~2.1.3", + "ssri": "^6.0.0", + "stringify-package": "^1.0.0", + "tar": "^4.4.6", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "uid-number": "0.0.6", + "umask": "~1.1.0", + "unique-filename": "~1.1.0", + "unpipe": "~1.0.0", + "update-notifier": "^2.5.0", + "uuid": "^3.3.2", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "~3.0.0", + "which": "^1.3.1", + "worker-farm": "^1.6.0", + "write-file-atomic": "^2.3.0" + }, + "dependencies": { + "JSONStream": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "agent-base": { + "version": "4.2.0", + "bundled": true, + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.4.1", + "bundled": true, + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "ajv": { + "version": "5.5.2", + "bundled": true, + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ansi-align": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.0.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true, + "dev": true + }, + "ansistyles": { + "version": "0.1.3", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "archy": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "asap": { + "version": "2.0.6", + "bundled": true, + "dev": true + }, + "asn1": { + "version": "0.2.4", + "bundled": true, + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "bundled": true, + "dev": true + }, + "aws4": { + "version": "1.8.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bin-links": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "cmd-shim": "^2.0.2", + "gentle-fs": "^2.0.0", + "graceful-fs": "^4.1.11", + "write-file-atomic": "^2.3.0" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.5.1", + "bundled": true, + "dev": true + }, + "boxen": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "builtins": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "byline": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "byte-size": { + "version": "4.0.3", + "bundled": true, + "dev": true + }, + "cacache": { + "version": "11.2.0", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "figgy-pudding": "^3.1.0", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.3", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.0", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "call-limit": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "chalk": { + "version": "2.4.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "ci-info": { + "version": "1.4.0", + "bundled": true, + "dev": true + }, + "cidr-regex": { + "version": "2.0.9", + "bundled": true, + "dev": true, + "requires": { + "ip-regex": "^2.1.0" + } + }, + "cli-boxes": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "cli-columns": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.0.0", + "strip-ansi": "^3.0.1" + } + }, + "cli-table3": { + "version": "0.5.0", + "bundled": true, + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + } + }, + "cliui": { + "version": "4.1.0", + "bundled": true, + "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", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "cmd-shim": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "mkdirp": "~0.5.0" + } + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "color-convert": { + "version": "1.9.1", + "bundled": true, + "dev": true, + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "bundled": true, + "dev": true + }, + "colors": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "columnify": { + "version": "1.5.4", + "bundled": true, + "dev": true, + "requires": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + } + }, + "combined-stream": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "bundled": true, + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "config-chain": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "configstore": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "iferr": { + "version": "0.1.5", + "bundled": true, + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "create-error-class": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "cyclist": { + "version": "0.2.2", + "bundled": true, + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + } + } + }, + "debuglog": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true + }, + "defaults": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "detect-indent": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "detect-newline": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "dezalgo": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "dot-prop": { + "version": "4.2.0", + "bundled": true, + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotenv": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "duplexify": { + "version": "3.6.0", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "editor": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "encoding": { + "version": "0.1.12", + "bundled": true, + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "err-code": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "errno": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "es6-promise": { + "version": "4.2.4", + "bundled": true, + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "execa": { + "version": "0.7.0", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + } + }, + "extend": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "figgy-pudding": { + "version": "3.4.1", + "bundled": true, + "dev": true + }, + "find-npm-prefix": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "find-up": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true + }, + "form-data": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs-vacuum": { + "version": "1.2.10", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "path-is-inside": "^1.0.1", + "rimraf": "^2.5.2" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "iferr": { + "version": "0.1.5", + "bundled": true, + "dev": true + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "genfun": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "gentle-fs": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.2", + "fs-vacuum": "^1.2.10", + "graceful-fs": "^4.1.11", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "path-is-inside": "^1.0.2", + "read-cmd-shim": "^1.0.1", + "slide": "^1.1.6" + }, + "dependencies": { + "iferr": { + "version": "0.1.5", + "bundled": true, + "dev": true + } + } + }, + "get-caller-file": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "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" + } + }, + "global-dirs": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "got": { + "version": "6.7.1", + "bundled": true, + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "har-validator": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "bundled": true, + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "bundled": true, + "dev": true + }, + "http-proxy-agent": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + } + }, + "http-signature": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + } + }, + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.23", + "bundled": true, + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "iferr": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "import-lazy": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true + }, + "init-package-json": { + "version": "1.10.3", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.1", + "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "1 || 2", + "semver": "2.x || 3.x || 4 || 5", + "validate-npm-package-license": "^3.0.1", + "validate-npm-package-name": "^3.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "ip": { + "version": "1.1.5", + "bundled": true, + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-ci": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "ci-info": "^1.0.0" + } + }, + "is-cidr": { + "version": "2.0.6", + "bundled": true, + "dev": true, + "requires": { + "cidr-regex": "^2.0.8" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "bundled": true, + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-redirect": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "bundled": true, + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "bundled": true, + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "latest-version": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lazy-property": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "lcid": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "libcipm": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "bin-links": "^1.1.2", + "bluebird": "^3.5.1", + "find-npm-prefix": "^1.0.2", + "graceful-fs": "^4.1.11", + "lock-verify": "^2.0.2", + "mkdirp": "^0.5.1", + "npm-lifecycle": "^2.0.3", + "npm-logical-tree": "^1.2.1", + "npm-package-arg": "^6.1.0", + "pacote": "^8.1.6", + "protoduck": "^5.0.0", + "read-package-json": "^2.0.13", + "rimraf": "^2.6.2", + "worker-farm": "^1.6.0" + } + }, + "libnpmhook": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "figgy-pudding": "^3.1.0", + "npm-registry-fetch": "^3.0.0" + }, + "dependencies": { + "npm-registry-fetch": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "figgy-pudding": "^3.1.0", + "lru-cache": "^4.1.2", + "make-fetch-happen": "^4.0.0", + "npm-package-arg": "^6.0.0" + } + } + } + }, + "libnpx": { + "version": "10.2.0", + "bundled": true, + "dev": true, + "requires": { + "dotenv": "^5.0.1", + "npm-package-arg": "^6.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.0", + "update-notifier": "^2.3.0", + "which": "^1.3.0", + "y18n": "^4.0.0", + "yargs": "^11.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lock-verify": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "npm-package-arg": "^5.1.2 || 6", + "semver": "^5.4.1" + } + }, + "lockfile": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "requires": { + "signal-exit": "^3.0.2" + } + }, + "lodash._baseindexof": { + "version": "3.1.0", + "bundled": true, + "dev": true + }, + "lodash._baseuniq": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "requires": { + "lodash._createset": "~4.0.0", + "lodash._root": "~3.0.0" + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "lodash._cacheindexof": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "lodash._createcache": { + "version": "3.1.2", + "bundled": true, + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0" + } + }, + "lodash._createset": { + "version": "4.0.3", + "bundled": true, + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "bundled": true, + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "bundled": true, + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "bundled": true, + "dev": true + }, + "lodash.union": { + "version": "4.6.0", + "bundled": true, + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "bundled": true, + "dev": true + }, + "lodash.without": { + "version": "4.4.0", + "bundled": true, + "dev": true + }, + "lowercase-keys": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "lru-cache": { + "version": "4.1.3", + "bundled": true, + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "make-fetch-happen": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^11.0.1", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^4.1.2", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + } + }, + "meant": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "mem": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "mime-db": { + "version": "1.35.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.19", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "~1.35.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mississippi": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "move-concurrently": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "bundled": true, + "dev": true + }, + "node-fetch-npm": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-gyp": { + "version": "3.8.0", + "bundled": true, + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "nopt": { + "version": "3.0.6", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + } + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-audit-report": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "cli-table3": "^0.5.0", + "console-control-strings": "^1.1.0" + } + }, + "npm-bundled": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "npm-cache-filename": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "npm-install-checks": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "semver": "^2.3.0 || 3.x || 4 || 5" + } + }, + "npm-lifecycle": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "byline": "^5.0.0", + "graceful-fs": "^4.1.11", + "node-gyp": "^3.8.0", + "resolve-from": "^4.0.0", + "slide": "^1.1.6", + "uid-number": "0.0.6", + "umask": "^1.1.0", + "which": "^1.3.1" + } + }, + "npm-logical-tree": { + "version": "1.2.1", + "bundled": true, + "dev": true + }, + "npm-package-arg": { + "version": "6.1.0", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "npm-profile": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.2 || 2", + "make-fetch-happen": "^2.5.0 || 3 || 4" + } + }, + "npm-registry-client": { + "version": "8.6.0", + "bundled": true, + "dev": true, + "requires": { + "concat-stream": "^1.5.2", + "graceful-fs": "^4.1.6", + "normalize-package-data": "~1.0.1 || ^2.0.0", + "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "npmlog": "2 || ^3.1.0 || ^4.0.0", + "once": "^1.3.3", + "request": "^2.74.0", + "retry": "^0.10.0", + "safe-buffer": "^5.1.1", + "semver": "2 >=2.2.1 || 3.x || 4 || 5", + "slide": "^1.1.3", + "ssri": "^5.2.4" + }, + "dependencies": { + "retry": { + "version": "0.10.1", + "bundled": true, + "dev": true + }, + "ssri": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + } + } + }, + "npm-registry-fetch": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "figgy-pudding": "^2.0.1", + "lru-cache": "^4.1.2", + "make-fetch-happen": "^3.0.0", + "npm-package-arg": "^6.0.0", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "cacache": { + "version": "10.0.4", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + }, + "dependencies": { + "mississippi": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + } + } + }, + "figgy-pudding": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "make-fetch-happen": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^10.0.4", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.0", + "lru-cache": "^4.1.2", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^3.0.1", + "ssri": "^5.2.4" + } + }, + "pump": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "smart-buffer": { + "version": "1.1.15", + "bundled": true, + "dev": true + }, + "socks": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "requires": { + "ip": "^1.1.4", + "smart-buffer": "^1.0.13" + } + }, + "socks-proxy-agent": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "^4.1.0", + "socks": "^1.1.10" + } + }, + "ssri": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npm-user-validate": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opener": { + "version": "1.5.0", + "bundled": true, + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "package-json": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "pacote": { + "version": "8.1.6", + "bundled": true, + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "cacache": "^11.0.2", + "get-stream": "^3.0.0", + "glob": "^7.1.2", + "lru-cache": "^4.1.3", + "make-fetch-happen": "^4.0.1", + "minimatch": "^3.0.4", + "minipass": "^2.3.3", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.10", + "npm-pick-manifest": "^2.1.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.5.0", + "ssri": "^6.0.0", + "tar": "^4.4.3", + "unique-filename": "^1.1.0", + "which": "^1.3.0" + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "path-exists": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "pify": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "dependencies": { + "retry": { + "version": "0.10.1", + "bundled": true, + "dev": true + } + } + }, + "promzard": { + "version": "0.3.0", + "bundled": true, + "dev": true, + "requires": { + "read": "1" + } + }, + "proto-list": { + "version": "1.2.4", + "bundled": true, + "dev": true + }, + "protoduck": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "genfun": "^4.0.1" + } + }, + "prr": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "psl": { + "version": "1.1.29", + "bundled": true, + "dev": true + }, + "pump": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "bundled": true, + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true + }, + "qrcode-terminal": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "qs": { + "version": "6.5.2", + "bundled": true, + "dev": true + }, + "query-string": { + "version": "6.1.0", + "bundled": true, + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "strict-uri-encode": "^2.0.0" + } + }, + "qw": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "read": { + "version": "1.0.7", + "bundled": true, + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-cmd-shim": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2" + } + }, + "read-installed": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "graceful-fs": "^4.1.2", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" + } + }, + "read-package-json": { + "version": "2.0.13", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "slash": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.2.1", + "bundled": true, + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "once": "^1.3.0", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "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" + } + }, + "readdir-scoped-modules": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "bundled": true, + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "request": { + "version": "2.88.0", + "bundled": true, + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "retry": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "run-queue": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "sha": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "readable-stream": "^2.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "slash": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "slide": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "smart-buffer": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "socks": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.0.1" + } + }, + "socks-proxy-agent": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "agent-base": "~4.2.0", + "socks": "~2.2.0" + } + }, + "sorted-object": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "sorted-union-stream": { + "version": "2.1.3", + "bundled": true, + "dev": true, + "requires": { + "from2": "^1.3.0", + "stream-iterate": "^1.1.0" + }, + "dependencies": { + "from2": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~1.1.10" + } + }, + "isarray": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "bundled": true, + "dev": true + } + } + }, + "spdx-correct": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "sshpk": { + "version": "1.14.2", + "bundled": true, + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.0", + "bundled": true, + "dev": true + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-iterate": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "stream-shift": "^1.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "strict-uri-encode": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringify-package": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tar": { + "version": "4.4.6", + "bundled": true, + "dev": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.3", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "term-size": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "^0.7.0" + } + }, + "text-table": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "through": { + "version": "2.3.8", + "bundled": true, + "dev": true + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "timed-out": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "tiny-relative-date": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "bundled": true, + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "bundled": true, + "dev": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true + }, + "umask": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "unique-filename": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "bundled": true, + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "util-extend": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.3.2", + "bundled": true, + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "which": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.2" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "widest-line": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, + "worker-farm": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "xtend": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "y18n": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "yargs": { + "version": "11.0.0", + "bundled": true, + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.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", + "yargs-parser": "^9.0.2" + }, + "dependencies": { + "y18n": { + "version": "3.2.1", + "bundled": true, + "dev": true + } + } + }, + "yargs-parser": { + "version": "9.0.2", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, "npm-bundled": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz", @@ -5936,6 +13139,118 @@ "set-blocking": "~2.0.0" } }, + "nsp": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/nsp/-/nsp-3.2.1.tgz", + "integrity": "sha512-dLmGi7IGixJEHKetErIH460MYiYIzAoxuVsloZFu9e1p9U8K0yULx7YQ1+VzrjZbB+wqq67ES1SfOvKVb/qMDQ==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "cli-table2": "^0.2.0", + "cvss": "^1.0.2", + "https-proxy-agent": "^2.1.0", + "inquirer": "^3.3.0", + "nodesecurity-npm-utils": "^6.0.0", + "semver": "^5.4.1", + "wreck": "^12.5.1", + "yargs": "^9.0.1" + }, + "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 + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "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" + }, + "dependencies": { + "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 + }, + "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": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.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", + "yargs-parser": "^7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -6971,6 +14286,12 @@ } } }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -7003,11 +14324,29 @@ "wrappy": "1" } }, + "one-by-one": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/one-by-one/-/one-by-one-2.2.1.tgz", + "integrity": "sha1-YcgS4BNHX0vbKvXTjgVpY79jVcQ=", + "dev": true, + "requires": { + "deffy": "^2.0.0" + } + }, "one-time": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, "opn": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", @@ -7060,6 +14399,16 @@ "mem": "^1.1.0" } }, + "os-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-2.0.1.tgz", + "integrity": "sha1-uaOGNhwXrjohc27wWZQFyajF3F4=", + "dev": true, + "requires": { + "macos-release": "^1.0.0", + "win-release": "^1.0.0" + } + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -7074,11 +14423,62 @@ "os-tmpdir": "^1.0.0" } }, + "overlap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/overlap/-/overlap-2.0.0.tgz", + "integrity": "sha1-sptrsq11acTmb67yjLXXQ2EXnLQ=", + "dev": true, + "requires": { + "ansi-parser": "3.0.0", + "cli-box": "5.0.0", + "couleurs": "5.0.0" + }, + "dependencies": { + "ansi-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-parser/-/ansi-parser-3.0.0.tgz", + "integrity": "sha1-lFwOcjLK9WdSFzdbPriJIAjBRik=", + "dev": true + }, + "couleurs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/couleurs/-/couleurs-5.0.0.tgz", + "integrity": "sha1-HNOs5cyhvsAEFXiydGSyZ2OH9ts=", + "dev": true, + "requires": { + "flat-colors": "3.0.0", + "typpy": "2.0.0", + "x256": "0.0.2" + } + }, + "typpy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.0.0.tgz", + "integrity": "sha1-re87rMEv9Hr/kg+rA6j/MnnXN9Y=", + "dev": true + } + } + }, "p-cancelable": { "version": "0.4.1", "resolved": "http://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==" }, + "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-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-1.0.0.tgz", + "integrity": "sha1-Yp0xcVAgnI/VCLoTdxPvS7kg6ds=", + "dev": true, + "requires": { + "p-map": "^1.0.0" + } + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -7105,6 +14505,27 @@ "p-limit": "^1.1.0" } }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "p-retry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-2.0.0.tgz", + "integrity": "sha512-ZbCuzAmiwJ45q4evp/IG9D+5MUllGSUeCWwPt3j/tdYSi1KPkSD+46uqmAA1LhccDhOXv8kYZKNb8x78VflzfA==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, "p-timeout": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", @@ -7118,6 +14539,88 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "dependencies": { + "got": { + "version": "6.7.1", + "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + } + } + }, + "parse-github-url": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", + "dev": true + }, + "parse-it": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/parse-it/-/parse-it-1.0.8.tgz", + "integrity": "sha1-6aU73hjIBJ57tBW3PhbTKS346uc=", + "dev": true, + "requires": { + "regex-escape": "^3.4.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-url": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-1.3.11.tgz", + "integrity": "sha1-V8FUKKuKiSsfQ4aWRccR0OFEtVQ=", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "protocols": "^1.4.0" + } + }, "parse5": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", @@ -7148,6 +14651,12 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -7163,6 +14672,15 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, "pathval": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", @@ -7191,11 +14709,107 @@ "pinkie": "^2.0.0" } }, + "pirates": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.0.tgz", + "integrity": "sha512-8t5BsXy1LUIjn3WWOlOuFDuKswhQb/tkak641lvBgmPOBUQHXveORtlMCp6OdPV1dtuTaEahKA8VNz6uLfKBtA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "pkg-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", + "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", + "dev": true, + "requires": { + "debug-log": "^1.0.0", + "find-root": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, "pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" }, + "pop-iterate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pop-iterate/-/pop-iterate-1.0.1.tgz", + "integrity": "sha1-zqz9q0q/NT16DyqqLB/Hs/lBO6M=", + "dev": true + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -7212,6 +14826,73 @@ "url-join": "^4.0.0-m2.0" } }, + "pre-git": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/pre-git/-/pre-git-3.17.1.tgz", + "integrity": "sha512-/UH/OXKadgcm+7AvK7yNw5jxhN14/NSZ7rq8RgtJvX/KUjGtYQYx7UEAKIZtMjYZDO53nFpDVDr7SQzpVV55lA==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "chalk": "2.3.2", + "check-more-types": "2.24.0", + "conventional-commit-message": "1.1.0", + "cz-conventional-changelog": "2.1.0", + "debug": "3.1.0", + "ggit": "2.4.2", + "inquirer": "3.3.0", + "lazy-ass": "1.6.0", + "require-relative": "0.8.7", + "shelljs": "0.8.1", + "simple-commit-message": "4.0.3", + "validate-commit-msg": "2.14.0", + "word-wrap": "1.2.3" + }, + "dependencies": { + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "chalk": { + "version": "2.3.2", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "shelljs": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.1.tgz", + "integrity": "sha512-YA/iYtZpzFe5HyWVGrb02FjPxc4EMCfpoU/Phg9fQoyMC72u9598OUBrsU8IrtwAKG0tO8IYaqbaLIw+k3IRGA==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + } + } + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -7222,6 +14903,94 @@ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" }, + "prettier": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.9.2.tgz", + "integrity": "sha512-piXx9N2WT8hWb7PBbX1glAuJVIkEyUV9F5fMXFINpZ0x3otVOFKKeGmeuiclFJlP/UrgTckyV606VjH2rNK4bw==", + "dev": true + }, + "prettier-eslint": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-8.8.2.tgz", + "integrity": "sha512-2UzApPuxi2yRoyMlXMazgR6UcH9DKJhNgCviIwY3ixZ9THWSSrUww5vkiZ3C48WvpFl1M1y/oU63deSy1puWEA==", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "common-tags": "^1.4.0", + "dlv": "^1.1.0", + "eslint": "^4.0.0", + "indent-string": "^3.2.0", + "lodash.merge": "^4.6.0", + "loglevel-colored-level-prefix": "^1.0.0", + "prettier": "^1.7.0", + "pretty-format": "^23.0.1", + "require-relative": "^0.8.7", + "typescript": "^2.5.1", + "typescript-eslint-parser": "^16.0.0", + "vue-eslint-parser": "^2.0.2" + }, + "dependencies": { + "typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "dev": true + } + } + }, + "prettier-standard": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/prettier-standard/-/prettier-standard-8.0.1.tgz", + "integrity": "sha512-egiIKvmlizoXuRkh83myjB4elmdIahCaUACLDaZyCgvspZQyps0fUayQpvcv4/gW/XahMTu95a3f9Fu8ouGYZw==", + "dev": true, + "requires": { + "@sheerun/eslint-config-standard": "^10.2.1", + "babel-eslint": ">=7.2.3", + "babel-runtime": "^6.23.0", + "chalk": "^2.3.0", + "core-js": "^2.5.3", + "eslint": "^4.7.2", + "find-up": "^2.1.0", + "get-stdin": "^5.0.1", + "glob": "^7.1.2", + "ignore": "^3.3.3", + "indent-string": "^3.1.0", + "lodash.memoize": "^4.1.2", + "loglevel-colored-level-prefix": "^1.0.0", + "messageformat": "^1.0.2", + "minimist": "1.2.0", + "prettier": "1.9.x", + "prettier-eslint": "^8.1.1", + "regenerator-runtime": "^0.11.1", + "rxjs": "^5.4.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.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 + } + } + }, "priorityqueuejs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/priorityqueuejs/-/priorityqueuejs-1.0.0.tgz", @@ -7258,11 +15027,27 @@ "asap": "~2.0.3" } }, + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "dev": true, + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, "propagate": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/propagate/-/propagate-1.0.0.tgz", "integrity": "sha1-AMLa7t2iDofjeCs0Stuhzd1q1wk=" }, + "protocols": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.6.tgz", + "integrity": "sha1-+LsmPqG1/Xp2BNJri+Ob13Z4v4o=", + "dev": true + }, "proxy-addr": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", @@ -7308,6 +15093,16 @@ "pify": "^3.0.0" } }, + "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": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -7348,6 +15143,24 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==" }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "quote": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/quote/-/quote-0.4.0.tgz", + "integrity": "sha1-EIOSF/bBNiuJGUBE0psjP9fzLwE=", + "dev": true + }, + "ramda": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", + "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==", + "dev": true + }, "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", @@ -7382,6 +15195,72 @@ } } }, + "read-installed": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz", + "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "graceful-fs": "^4.1.2", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" + } + }, + "read-package-json": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", + "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", + "dev": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "slash": "^1.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "dependencies": { + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", @@ -7396,6 +15275,18 @@ "util-deprecate": "~1.0.1" } }, + "readdir-scoped-modules": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz", + "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, "readdirp": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", @@ -7412,6 +15303,25 @@ "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", "integrity": "sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw=" }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "mute-stream": "0.0.5" + }, + "dependencies": { + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + } + } + }, "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -7420,6 +15330,25 @@ "resolve": "^1.1.6" } }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", + "dev": true, + "requires": { + "esprima": "~4.0.0" + } + }, "reflect-metadata": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", @@ -7430,6 +15359,15 @@ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", "integrity": "sha1-SoVuxLVuQHfFV1icroXnpMiGmhE=" }, + "regenerate-unicode-properties": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", + "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -7445,6 +15383,12 @@ "private": "^0.1.6" } }, + "regex-escape": { + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/regex-escape/-/regex-escape-3.4.8.tgz", + "integrity": "sha512-DG0VFPTDwfl+XsuVaM/0RmGJvCpZNB9UG/limzbev50XQ44G4mbOG+0Eh5M7Al9JB68NbP7YeY1KhDzpnX7qSw==", + "dev": true + }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -7454,6 +15398,12 @@ "safe-regex": "^1.1.0" } }, + "regexpp": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true + }, "regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", @@ -7464,6 +15414,25 @@ "regjsparser": "^0.1.4" } }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, "regjsgen": { "version": "0.2.0", "resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", @@ -7558,11 +15527,33 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, + "require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, + "reserved-words": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", + "integrity": "sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=", + "dev": true + }, "resolve": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", @@ -7571,6 +15562,12 @@ "path-parse": "^1.0.5" } }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -7584,11 +15581,27 @@ "lowercase-keys": "^1.0.0" } }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=" }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, "retry-as-promised": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-2.3.2.tgz", @@ -7598,6 +15611,12 @@ "debug": "^2.6.9" } }, + "right-pad": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/right-pad/-/right-pad-1.0.1.tgz", + "integrity": "sha1-jKCMLLtbVedNr6lr9/0aJ9VoyNA=", + "dev": true + }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", @@ -7611,6 +15630,51 @@ "resolved": "https://registry.npmjs.org/rsa-pem-from-mod-exp/-/rsa-pem-from-mod-exp-0.8.4.tgz", "integrity": "sha1-NipCxtMEBW1JOz8SvOq7LGV2ptQ=" }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, + "rx": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/rx/-/rx-2.5.3.tgz", + "integrity": "sha1-Ia3H2A8CACr1Da6X/Z2/JIdV9WY=", + "dev": true + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "*" + } + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -7644,6 +15708,302 @@ "resolved": "https://registry.npmjs.org/sec/-/sec-1.0.0.tgz", "integrity": "sha1-Az1go60g7PLgCUDRT5eCNGV3QzU=" }, + "semantic-release": { + "version": "15.10.8", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-15.10.8.tgz", + "integrity": "sha512-+n1eQArIw0TROFFwyf6csSLtKPt47goFbYk0ROAz3ja0r0ltV/ClKNCN6bkV2XzVlvTYqYFY6yutOIvPr1K4hQ==", + "dev": true, + "requires": { + "@semantic-release/commit-analyzer": "^6.1.0", + "@semantic-release/error": "^2.2.0", + "@semantic-release/github": "^5.1.0", + "@semantic-release/npm": "^5.0.5", + "@semantic-release/release-notes-generator": "^7.1.2", + "aggregate-error": "^1.0.0", + "cosmiconfig": "^5.0.1", + "debug": "^4.0.0", + "env-ci": "^3.0.0", + "execa": "^1.0.0", + "figures": "^2.0.0", + "find-versions": "^3.0.0", + "get-stream": "^4.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^1.1.0", + "hosted-git-info": "^2.7.1", + "lodash": "^4.17.4", + "marked": "^0.5.0", + "marked-terminal": "^3.0.0", + "p-locate": "^3.0.0", + "p-reduce": "^1.0.0", + "read-pkg-up": "^4.0.0", + "resolve-from": "^4.0.0", + "semver": "^5.4.1", + "signale": "^1.2.1", + "yargs": "^12.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 + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "dev": true, + "requires": { + "xregexp": "4.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mem": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", + "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^1.1.0" + } + }, + "os-locale": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", + "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", + "dev": true, + "requires": { + "execa": "^0.10.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "dependencies": { + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.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" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + } + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "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.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", + "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^2.0.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": "^10.1.0" + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, "semaphore": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", @@ -7654,6 +16014,21 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", "integrity": "sha1-ff3YgUvbfKvHvg+x1zTPtmyUBHc=" }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "semver-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", + "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=", + "dev": true + }, "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", @@ -7687,9 +16062,9 @@ } }, "sequelize": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-4.41.1.tgz", - "integrity": "sha512-8LqFgM3SovWk+FOQDIJphUi7462dFIAUD4TUDKy1PU7tWve4x1p0PdeKOXUmDkqtBoHtj1neSsRNcoC2eE6uHQ==", + "version": "4.41.2", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-4.41.2.tgz", + "integrity": "sha512-8vPf2R0o9iEmtzkqNzwFdblO+0Mu+RNxOdLeYGGqWGlp3cushLpQucAeSGPQgf2hQVZP5yOCM1ouZKTQ5FTlvA==", "requires": { "bluebird": "^3.5.0", "cls-bluebird": "^2.1.0", @@ -7854,6 +16229,161 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, + "signale": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/signale/-/signale-1.3.0.tgz", + "integrity": "sha512-TyFhsQ9wZDYDfsPqWMyjCxsDoMwfpsT0130Mce7wDiVCSDdtWSg83dOqoj8aGpGCs3n1YPcam6sT1OFPuGT/OQ==", + "dev": true, + "requires": { + "chalk": "^2.3.2", + "figures": "^2.0.0", + "pkg-conf": "^2.1.0" + } + }, + "simple-commit-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/simple-commit-message/-/simple-commit-message-4.0.3.tgz", + "integrity": "sha512-eC4PcOUQJLIQTSxFM2qzTetbK9excIlRVu4DMQ1HaVjdfLJ7U1QEyyiLgIAhlcf7cnLol9qev1PSTlcZmj9dxg==", + "dev": true, + "requires": { + "am-i-a-dependency": "1.1.2", + "check-more-types": "2.24.0", + "debug": "3.1.0", + "ggit": "2.4.2", + "hr": "0.1.3", + "inquirer": "0.12.0", + "inquirer-confirm": "0.2.2", + "largest-semantic-change": "1.1.0", + "lazy-ass": "1.6.0", + "semver": "5.5.0", + "word-wrap": "1.2.3" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "inquirer": { + "version": "0.12.0", + "resolved": "http://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "^1.3.0" + } + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, "simple-git": { "version": "1.107.0", "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.107.0.tgz", @@ -7880,6 +16410,35 @@ "is-arrayish": "^0.3.1" } }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -8031,6 +16590,105 @@ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, + "spawn-error-forwarder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", + "integrity": "sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk=", + "dev": true + }, + "spdx": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/spdx/-/spdx-0.5.2.tgz", + "integrity": "sha512-WQbfCQT2uKLsDllnO9ItpcGUiiF1O/ZvBGCyqFZRg122HgiZubpwpZiM7BkmH19HC3XR3Z+DFMGJNzXSPebG8A==", + "dev": true, + "requires": { + "spdx-exceptions": "^1.0.0", + "spdx-license-ids": "^1.0.0" + }, + "dependencies": { + "spdx-exceptions": { + "version": "1.0.5", + "resolved": "http://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.5.tgz", + "integrity": "sha1-nSGsTaS9tx0GD7dOWmdTHQMsu6Y=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "http://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + } + } + }, + "spdx-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz", + "integrity": "sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==", + "dev": true, + "requires": { + "array-find-index": "^1.0.2", + "spdx-expression-parse": "^3.0.0", + "spdx-ranges": "^2.0.0" + } + }, + "spdx-correct": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", + "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", + "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==", + "dev": true + }, + "spdx-ranges": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.0.0.tgz", + "integrity": "sha512-AUUXLfqkwD7GlzZkXv8ePPCpPjeVWI9xJCfysL8re/uKb6H10umMnC7bFRsHmLJan4fslUtekAgpHlSgLc/7mA==", + "dev": true + }, + "spdx-satisfies": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-satisfies/-/spdx-satisfies-4.0.0.tgz", + "integrity": "sha512-OcARj6U1OuVv98SVrRqgrR30sVocONtoPpnX8Xz4vXNrFVedqtbgkA+0KmQoXIQ2xjfltPPRVIMeNzKEFLWWKQ==", + "dev": true, + "requires": { + "spdx-compare": "^1.0.0", + "spdx-expression-parse": "^3.0.0", + "spdx-ranges": "^2.0.0" + } + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -8083,6 +16741,253 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" }, + "standard": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/standard/-/standard-12.0.1.tgz", + "integrity": "sha512-UqdHjh87OG2gUrNCSM4QRLF5n9h3TFPwrCNyVlkqu31Hej0L/rc8hzKqVvkb2W3x0WMq7PzZdkLfEcBhVOR6lg==", + "dev": true, + "requires": { + "eslint": "~5.4.0", + "eslint-config-standard": "12.0.0", + "eslint-config-standard-jsx": "6.0.2", + "eslint-plugin-import": "~2.14.0", + "eslint-plugin-node": "~7.0.1", + "eslint-plugin-promise": "~4.0.0", + "eslint-plugin-react": "~7.11.1", + "eslint-plugin-standard": "~4.0.0", + "standard-engine": "~9.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", + "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", + "dev": true + }, + "acorn-jsx": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.0.tgz", + "integrity": "sha512-XkB50fn0MURDyww9+UYL3c1yLbOBz0ZFvrdYlGB8l+Ije1oSC75qAqrzSPjYQbdnQUzhlUGNKuesryAv0gxZOg==", + "dev": true + }, + "ajv": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", + "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "eslint": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", + "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", + "dev": true, + "requires": { + "ajv": "^6.5.0", + "babel-code-frame": "^6.26.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.2", + "imurmurhash": "^0.1.4", + "inquirer": "^5.2.0", + "is-resolvable": "^1.1.0", + "js-yaml": "^3.11.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^2.0.0", + "require-uncached": "^1.0.3", + "semver": "^5.5.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^4.0.3", + "text-table": "^0.2.0" + } + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "espree": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", + "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", + "dev": true, + "requires": { + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "globals": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", + "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "inquirer": { + "version": "5.2.0", + "resolved": "http://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "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 + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "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" + } + }, + "table": { + "version": "4.0.3", + "resolved": "http://registry.npmjs.org/table/-/table-4.0.3.tgz", + "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "dev": true, + "requires": { + "ajv": "^6.0.1", + "ajv-keywords": "^3.0.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + } + } + } + }, + "standard-engine": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-9.0.0.tgz", + "integrity": "sha512-ZfNfCWZ2Xq67VNvKMPiVMKHnMdvxYzvZkf1AH8/cw2NLDBm5LRsxMqvEJpsjLI/dUosZ3Z1d6JlHDp5rAvvk2w==", + "dev": true, + "requires": { + "deglob": "^2.1.0", + "get-stdin": "^6.0.0", + "minimist": "^1.1.0", + "pkg-conf": "^2.0.0" + }, + "dependencies": { + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -8102,6 +17007,12 @@ } } }, + "static-methods": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/static-methods/-/static-methods-1.0.10.tgz", + "integrity": "sha512-Xqx9JmW1KHrmk32aJ7pl5L7Kf2zwkJvenW5MaAdMSIGJEmfa+7XAIDyxqLCgz5SowvfeHoWKVRq1wlPMlotktw==", + "dev": true + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -8112,6 +17023,16 @@ "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dev": true, + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, "strict-password-generator": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/strict-password-generator/-/strict-password-generator-1.1.1.tgz", @@ -8275,11 +17196,23 @@ "ansi-regex": "^2.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -8332,11 +17265,64 @@ } } }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, "symbol-tree": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, + "requires": { + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + }, + "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" + } + } + } + }, "tapable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz", @@ -8406,6 +17392,15 @@ } } }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + } + }, "terraformer": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/terraformer/-/terraformer-1.0.9.tgz", @@ -8423,11 +17418,23 @@ "terraformer": "~1.0.5" } }, + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true + }, "text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha1-adycGxdEbueakr9biEu0uRJ1BvU=" }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -8447,6 +17454,15 @@ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", @@ -8470,6 +17486,12 @@ } } }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", @@ -8557,6 +17579,315 @@ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" }, + "travis-deploy-once": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/travis-deploy-once/-/travis-deploy-once-5.0.9.tgz", + "integrity": "sha512-cyHFErzq0HTEGY29RAq1clqFdt/IkCrlcOmyM1cGoGnEyukrrFi1fpy6JH3Mlf+88XsFwvluqKVWzj2bdz3k8A==", + "dev": true, + "requires": { + "@babel/core": "^7.0.0", + "@babel/polyfill": "^7.0.0", + "@babel/preset-env": "^7.0.0", + "@babel/register": "^7.0.0", + "chalk": "^2.1.0", + "execa": "^1.0.0", + "got": "^9.1.0", + "p-retry": "^2.0.0", + "semver": "^5.4.1", + "update-notifier": "^2.3.0", + "url-join": "^4.0.0", + "yargs": "^12.0.1" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.12.0.tgz", + "integrity": "sha512-9ve22cGrAKlSRvi8Vb2JIjzcaaQg79531yQHnF+hi/kOpsSj3Om8AyR1wcHrgl0u7U3vYQ7gmF5erZzOp4+51Q==", + "dev": true, + "requires": { + "symbol-observable": "^1.2.0" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "cacheable-request": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-5.1.0.tgz", + "integrity": "sha512-UCdjX4N/QjymZGpKY7hW4VJsxsVJM+drIiCxPa9aTvFQN5sL2+kJCYyeys8f2W0dJ0sU6Et54Ovl0sAmCpHHsA==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^4.0.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^1.0.1", + "normalize-url": "^3.1.0", + "responselike": "^1.0.2" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "dev": true, + "requires": { + "xregexp": "4.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "got": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-9.3.2.tgz", + "integrity": "sha512-OyKOUg71IKvwb8Uj0KP6EN3+qVVvXmYsFznU1fnwUnKtDbZnwSlAi7muNlu4HhBfN9dImtlgg9e7H0g5qVdaeQ==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.12.0", + "@szmarczak/http-timer": "^1.1.0", + "cacheable-request": "^5.1.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "http-cache-semantics": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", + "integrity": "sha512-NtexGRtaV5z3ZUX78W9UDTOJPBdpqms6RmwQXmOhHws7CuQK3cqIoQtnmeqi1VvVD6u6eMMRL0sKE9BCZXTDWQ==", + "dev": true + }, + "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 + }, + "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 + }, + "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" + } + }, + "mem": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", + "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^1.1.0" + } + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "os-locale": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", + "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", + "dev": true, + "requires": { + "execa": "^0.10.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "dependencies": { + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.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" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + } + } + }, + "p-cancelable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.0.0.tgz", + "integrity": "sha512-USgPoaC6tkTGlS831CxsVdmZmyb8tR1D+hStI84MyckLOzfJlYQUweomrwE3D8T7u5u5GVuW064LT501wHTYYA==", + "dev": true + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "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.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "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" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "yargs": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", + "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^2.0.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": "^10.1.0" + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "treeify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", + "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true + }, "trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", @@ -8713,6 +18044,12 @@ "mime-types": "~2.1.18" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, "typedoc": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.13.0.tgz", @@ -8767,6 +18104,24 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.6.tgz", "integrity": "sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==" }, + "typescript-eslint-parser": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/typescript-eslint-parser/-/typescript-eslint-parser-16.0.1.tgz", + "integrity": "sha512-IKawLTu4A2xN3aN/cPLxvZ0bhxZHILGDKTZWvWNJ3sLNhJ3PjfMEDQmR2VMpdRPrmWOadgWXRwjLBzSA8AGsaQ==", + "dev": true, + "requires": { + "lodash.unescape": "4.0.1", + "semver": "5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + } + } + }, "typpy": { "version": "2.3.10", "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.3.10.tgz", @@ -8799,11 +18154,55 @@ } } }, + "ul": { + "version": "5.2.13", + "resolved": "https://registry.npmjs.org/ul/-/ul-5.2.13.tgz", + "integrity": "sha1-n/BQTqNcofdMC/WeZIDe8Am617U=", + "dev": true, + "requires": { + "deffy": "^2.2.2", + "typpy": "^2.3.4" + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, "underscore": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", "integrity": "sha1-BtzjSg5op7q8KbNluOdLiSUgOWE=" }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz", + "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", + "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==", + "dev": true + }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -8836,6 +18235,30 @@ } } }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "universal-user-agent": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.0.1.tgz", + "integrity": "sha512-vz+heWVydO0iyYAa65VHD7WZkYzhl7BeNVy4i54p4TF8OMiLSXdbuQe4hm+fmWAsL+rVibaQHXfhvkw3c1Ws2w==", + "dev": true, + "requires": { + "os-name": "^2.0.1" + } + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -8882,11 +18305,51 @@ } } }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, "upath": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", "integrity": "sha1-NSVll+RqWB20eT0M5H+prr/J+r0=" }, + "update-notifier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", + "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -8930,6 +18393,12 @@ "prepend-http": "^2.0.0" } }, + "url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", + "dev": true + }, "url-to-options": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", @@ -8970,6 +18439,12 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "util-extend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz", + "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=", + "dev": true + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -8980,6 +18455,28 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=" }, + "validate-commit-msg": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/validate-commit-msg/-/validate-commit-msg-2.14.0.tgz", + "integrity": "sha1-5Tg2kQEsuycNzAvCpO/+vhSJDqw=", + "dev": true, + "requires": { + "conventional-commit-types": "^2.0.0", + "find-parent-dir": "^0.3.0", + "findup": "0.1.5", + "semver-regex": "1.0.0" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "validator": { "version": "9.4.1", "resolved": "http://registry.npmjs.org/validator/-/validator-9.4.1.tgz", @@ -9000,6 +18497,31 @@ "extsprintf": "^1.2.0" } }, + "vue-eslint-parser": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz", + "integrity": "sha512-ZezcU71Owm84xVF6gfurBQUGg8WQ+WZGxgDEQu1IHFBZNx7BFZg3L1yHxrCBNNwbwFtE1GuvfJKMtb6Xuwc/Bw==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.2", + "esquery": "^1.0.0", + "lodash": "^4.17.4" + }, + "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" + } + } + } + }, "w3c-hr-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", @@ -9022,6 +18544,12 @@ "lodash": "^4.5.0" } }, + "weak-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", + "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=", + "dev": true + }, "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", @@ -9086,6 +18614,57 @@ "string-width": "^1.0.2 || 2" } }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "requires": { + "string-width": "^2.1.1" + }, + "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" + } + } + } + }, + "win-release": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", + "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=", + "dev": true, + "requires": { + "semver": "^5.0.1" + } + }, "winston": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/winston/-/winston-3.1.0.tgz", @@ -9119,6 +18698,12 @@ "@types/node": "*" } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -9138,6 +18723,47 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "wreck": { + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/wreck/-/wreck-12.5.1.tgz", + "integrity": "sha512-l5DUGrc+yDyIflpty1x9XuMj1ehVjC/dTbF3/BasOO77xk0EdEa4M/DuOY8W88MQDAD0fEDqyjc8bkIMHd2E9A==", + "dev": true, + "requires": { + "boom": "5.x.x", + "hoek": "4.x.x" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "dev": true, + "requires": { + "hoek": "4.x.x" + } + } + } + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, "ws": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", @@ -9146,6 +18772,18 @@ "async-limiter": "~1.0.0" } }, + "x256": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/x256/-/x256-0.0.2.tgz", + "integrity": "sha1-ya8Yh296F1gB1WT+cK2egxd4STQ=", + "dev": true + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", @@ -9175,6 +18813,12 @@ "resolved": "https://registry.npmjs.org/xpath.js/-/xpath.js-1.1.0.tgz", "integrity": "sha1-OBakTtS7NSCRCD0AKjg91RBKX/E=" }, + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", + "dev": true + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", diff --git a/package.json b/package.json index d36bf9f7..ecd326c4 100644 --- a/package.json +++ b/package.json @@ -18,15 +18,29 @@ "url": "https://github.com/pragmatismo-io/BotServer.git" }, "scripts": { - "clean": "rimraf dist", - "tslint": "tslint ./src ./packages/**/*.ts -t verbose", + "clean": "shx rm -rf node_modules/ dist/ docs/reference", + "tslint": "tslint --fix ./src/*.ts ./packages/**/*.ts -t verbose", "build": "tsc", "build-docs": "typedoc --options typedoc.json src/", "test": "nyc --reporter=html --reporter=text mocha -r ts-node/register packages/**/*.test.ts ", + "pretest": "npm run build", "coveralls": "npm run test && nyc report --reporter=text-lcov | coveralls", "start": "node ./dist/src/app.js", "watch:build": "tsc --watch", - "watch:server": "nodemon './dist/index.js' --watch './dist'" + "watch:server": "nodemon './dist/index.js' --watch './dist'", + "posttypedoc": "shx cp .nojekyll docs/reference/.nojekyll", + "ban": "ban", + "issues": "git-issues", + "license": "license-checker --production --onlyunknown --csv", + "lint": "standard --verbose --fix 'src/*.js' 'cypress/**/*.js'", + "prelint": "npm run pretty", + "pretty": "prettier-standard 'src/*.ts' 'packages/**/*.ts'", + "secure": "nsp check", + "size": "t=\"$(npm pack .)\"; wc -c \"${t}\"; tar tvf \"${t}\"; rm \"${t}\";", + "unused-deps": "dependency-check --unused --no-dev ./package.json", + "travis-deploy-once": "travis-deploy-once", + "semantic-release": "semantic-release", + "commit": "commit-wizard" }, "engines": { "node": "=10.13.0" @@ -81,7 +95,7 @@ "reflect-metadata": "0.1.12", "request-promise-native": "1.0.5", "scanf": "^1.0.2", - "sequelize": "4.41.1", + "sequelize": "4.41.2", "sequelize-typescript": "0.6.6", "simple-git": "^1.107.0", "sqlite3": "4.0.4", @@ -99,14 +113,25 @@ "winston": "3.1.0" }, "devDependencies": { - "@types/mocha": "^2.2.47", + "@types/mocha": "^5.2.5", "chai": "^4.2.0", "coveralls": "^3.0.2", "mocha": "^5.2.0", "shx": "^0.3.2", "ts-loader": "^5.3.0", "tslint": "^5.11.0", - "tslint-microsoft-contrib": "^5.2.1" + "tslint-microsoft-contrib": "^5.2.1", + "ban-sensitive-files": "1.9.2", + "dependency-check": "3.2.1", + "deps-ok": "1.4.1", + "git-issues": "1.3.1", + "license-checker": "24.0.1", + "nsp": "3.2.1", + "pre-git": "3.17.1", + "prettier-standard": "8.0.1", + "standard": "12.0.1", + "travis-deploy-once": "5.0.9", + "semantic-release": "15.10.8" }, "eslintConfig": { "env": { @@ -152,5 +177,18 @@ "warn" ] } + }, + "release": { + "analyzeCommits": "simple-commit-message" + }, + "config": { + "pre-git": { + "commit-msg": "simple", + "pre-commit": [], + "pre-push": [], + "post-commit": [], + "post-checkout": [], + "post-merge": [] + } } } diff --git a/packages/admin.gbapp/dialogs/AdminDialog.ts b/packages/admin.gbapp/dialogs/AdminDialog.ts index 2831a733..8b9cd419 100644 --- a/packages/admin.gbapp/dialogs/AdminDialog.ts +++ b/packages/admin.gbapp/dialogs/AdminDialog.ts @@ -36,36 +36,36 @@ 'use strict'; -const UrlJoin = require("url-join"); -import { GBMinInstance } from "botlib"; -import { IGBDialog } from "botlib"; -import { GBDeployer } from "../../core.gbapp/services/GBDeployer"; -import { GBImporter } from "../../core.gbapp/services/GBImporter"; -import { GBConfigService } from "../../core.gbapp/services/GBConfigService"; -import { BotAdapter } from "botbuilder"; -import { GBAdminService } from "../services/GBAdminService"; -import { Messages } from "../strings"; -import { WaterfallDialog } from "botbuilder-dialogs"; +const UrlJoin = require('url-join'); +import { BotAdapter } from 'botbuilder'; +import { WaterfallDialog } from 'botbuilder-dialogs'; +import { GBMinInstance } from 'botlib'; +import { IGBDialog } from 'botlib'; +import { GBConfigService } from '../../core.gbapp/services/GBConfigService'; +import { GBDeployer } from '../../core.gbapp/services/GBDeployer'; +import { GBImporter } from '../../core.gbapp/services/GBImporter'; +import { GBAdminService } from '../services/GBAdminService'; +import { Messages } from '../strings'; /** * Dialogs for administration tasks. */ export class AdminDialog extends IGBDialog { - static async createFarmCommand(text: any, min: GBMinInstance) {} + public static async createFarmCommand(text: any, min: GBMinInstance) {} - static async undeployPackageCommand(text: any, min: GBMinInstance) { - let packageName = text.split(" ")[1]; - let importer = new GBImporter(min.core); - let deployer = new GBDeployer(min.core, importer); + public static async undeployPackageCommand(text: any, min: GBMinInstance) { + const packageName = text.split(' ')[1]; + const importer = new GBImporter(min.core); + const deployer = new GBDeployer(min.core, importer); await deployer.undeployPackageFromLocalPath( min.instance, - UrlJoin("packages", packageName) + UrlJoin('packages', packageName) ); } - static async deployPackageCommand(text: string, deployer: GBDeployer) { - let packageName = text.split(" ")[1]; - let additionalPath = GBConfigService.get("ADDITIONAL_DEPLOY_PATH"); + public static async deployPackageCommand(text: string, deployer: GBDeployer) { + const packageName = text.split(' ')[1]; + const additionalPath = GBConfigService.get('ADDITIONAL_DEPLOY_PATH'); await deployer.deployPackageFromLocalPath( UrlJoin(additionalPath, packageName) ); @@ -76,59 +76,59 @@ export class AdminDialog extends IGBDialog { * @param bot The bot adapter. * @param min The minimal bot instance data. */ - static setup(bot: BotAdapter, min: GBMinInstance) { + public static setup(bot: BotAdapter, min: GBMinInstance) { // Setup services. - let importer = new GBImporter(min.core); - let deployer = new GBDeployer(min.core, importer); + const importer = new GBImporter(min.core); + const deployer = new GBDeployer(min.core, importer); min.dialogs.add( - new WaterfallDialog("/admin", [ + new WaterfallDialog('/admin', [ async step => { const locale = step.context.activity.locale; const prompt = Messages[locale].authenticate; - await step.prompt("textPrompt", prompt); + await step.prompt('textPrompt', prompt); return await step.next(); }, async step => { const locale = step.context.activity.locale; - let password = step.result; + const password = step.result; if ( - password === GBConfigService.get("ADMIN_PASS") && + password === GBConfigService.get('ADMIN_PASS') && GBAdminService.StrongRegex.test(password) ) { await step.context.sendActivity(Messages[locale].welcome); - await step.prompt("textPrompt", Messages[locale].which_task); + await step.prompt('textPrompt', Messages[locale].which_task); } else { - await step.prompt("textPrompt", Messages[locale].wrong_password); + await step.prompt('textPrompt', Messages[locale].wrong_password); await step.endDialog(); } return await step.next(); }, async step => { const locale = step.context.activity.locale; - var text = step.result; - let cmdName = text.split(" ")[0]; + const text = step.result; + const cmdName = text.split(' ')[0]; step.context.sendActivity(Messages[locale].working(cmdName)); let unknownCommand = false; - if (text === "quit") { - await step.replaceDialog("/"); - } else if (cmdName === "createFarm") { + if (text === 'quit') { + await step.replaceDialog('/'); + } else if (cmdName === 'createFarm') { await AdminDialog.createFarmCommand(text, deployer); - await step.replaceDialog("/admin", { firstRun: false }); - } else if (cmdName === "deployPackage") { + await step.replaceDialog('/admin', { firstRun: false }); + } else if (cmdName === 'deployPackage') { await AdminDialog.deployPackageCommand(text, deployer); - await step.replaceDialog("/admin", { firstRun: false }); - } else if (cmdName === "redeployPackage") { + await step.replaceDialog('/admin', { firstRun: false }); + } else if (cmdName === 'redeployPackage') { await AdminDialog.undeployPackageCommand(text, min); await AdminDialog.deployPackageCommand(text, deployer); - await step.replaceDialog("/admin", { firstRun: false }); - } else if (cmdName === "undeployPackage") { + await step.replaceDialog('/admin', { firstRun: false }); + } else if (cmdName === 'undeployPackage') { await AdminDialog.undeployPackageCommand(text, min); - await step.replaceDialog("/admin", { firstRun: false }); - } else if (cmdName === "setupSecurity") { + await step.replaceDialog('/admin', { firstRun: false }); + } else if (cmdName === 'setupSecurity') { await AdminDialog.setupSecurity(min, step); } else { unknownCommand = true; @@ -142,7 +142,7 @@ export class AdminDialog extends IGBDialog { ); } await step.endDialog(); - await step.replaceDialog("/answer", { query: text }); + await step.replaceDialog('/answer', { query: text }); return await step.next(); } ]) @@ -151,15 +151,15 @@ export class AdminDialog extends IGBDialog { private static async setupSecurity(min: any, step: any) { const locale = step.activity.locale; - let state = `${min.instance.instanceId}${Math.floor( + const state = `${min.instance.instanceId}${Math.floor( Math.random() * 1000000000 )}`; await min.adminService.setValue( min.instance.instanceId, - "AntiCSRFAttackState", + 'AntiCSRFAttackState', state ); - let url = `https://login.microsoftonline.com/${ + const url = `https://login.microsoftonline.com/${ min.instance.authenticatorTenant }/oauth2/authorize?client_id=${ min.instance.authenticatorClientId diff --git a/packages/admin.gbapp/models/AdminModel.ts b/packages/admin.gbapp/models/AdminModel.ts index f0f439b7..e7d26acb 100644 --- a/packages/admin.gbapp/models/AdminModel.ts +++ b/packages/admin.gbapp/models/AdminModel.ts @@ -37,32 +37,30 @@ 'use strict'; import { - Table, Column, - Model, CreatedAt, - UpdatedAt, -} from "sequelize-typescript"; - + Model, + Table, + UpdatedAt +} from 'sequelize-typescript'; @Table -export class GuaribasAdmin extends Model - { +export class GuaribasAdmin extends Model { @Column - instanceId: number; + public instanceId: number; @Column - key: string; + public key: string; @Column - value: string; + public value: string; @Column @CreatedAt - createdAt: Date; + public createdAt: Date; @Column @UpdatedAt - updatedAt: Date; + public updatedAt: Date; } diff --git a/packages/admin.gbapp/services/GBAdminService.ts b/packages/admin.gbapp/services/GBAdminService.ts index 0011198d..dcd6390a 100644 --- a/packages/admin.gbapp/services/GBAdminService.ts +++ b/packages/admin.gbapp/services/GBAdminService.ts @@ -36,116 +36,41 @@ 'use strict'; -import { GuaribasAdmin } from "../models/AdminModel"; -import { IGBCoreService } from "botlib"; -import { AuthenticationContext, TokenResponse } from "adal-node"; -const UrlJoin = require("url-join"); -const msRestAzure = require("ms-rest-azure"); -const PasswordGenerator = require("strict-password-generator").default; +import { AuthenticationContext, TokenResponse } from 'adal-node'; +import { IGBCoreService } from 'botlib'; +import { GuaribasAdmin } from '../models/AdminModel'; +const UrlJoin = require('url-join'); +const msRestAzure = require('ms-rest-azure'); +const PasswordGenerator = require('strict-password-generator').default; export class GBAdminService { - static GB_PROMPT: string = "GeneralBots: " - - static generateUuid(): string { - return msRestAzure.generateUuid(); - } - static masterBotInstanceId = 0; + public static GB_PROMPT: string = 'GeneralBots: '; + public static masterBotInstanceId = 0; public static StrongRegex = new RegExp( - "^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*+_-])(?=.{8,})" + '^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*+_-])(?=.{8,})' ); - core: IGBCoreService; + public core: IGBCoreService; constructor(core: IGBCoreService) { this.core = core; } - public async setValue( - instanceId: number, - key: string, - value: string - ): Promise { - let options = { where: {} }; - options.where = { key: key }; - let admin = await GuaribasAdmin.findOne(options); - if (admin == null) { - admin = new GuaribasAdmin(); - admin.key = key; - } - admin.value = value; - admin.instanceId = instanceId; - return admin.save(); - } - - public async getValue(instanceId: number, key: string) { - let options = { where: {} }; - options.where = { key: key, instanceId: instanceId }; - let obj = await GuaribasAdmin.findOne(options); - return Promise.resolve(obj.value); - } - - public async acquireElevatedToken(instanceId): Promise { - return new Promise(async (resolve, reject) => { - let instance = await this.core.loadInstanceById(instanceId); - - let expiresOn = new Date(await this.getValue(instanceId, "expiresOn")); - if (expiresOn.getTime() > new Date().getTime()) { - let accessToken = await this.getValue(instanceId, "accessToken"); - resolve(accessToken); - } else { - let authorizationUrl = UrlJoin( - instance.authenticatorAuthorityHostUrl, - instance.authenticatorTenant, - "/oauth2/authorize" - ); - - let refreshToken = await this.getValue(instanceId, "refreshToken"); - let resource = "https://graph.microsoft.com"; - var authenticationContext = new AuthenticationContext(authorizationUrl); - authenticationContext.acquireTokenWithRefreshToken( - refreshToken, - instance.authenticatorClientId, - instance.authenticatorClientSecret, - resource, - async (err, res) => { - if (err) { - reject(err); - } else { - let token = res as TokenResponse; - await this.setValue( - instanceId, - "accessToken", - token.accessToken - ); - await this.setValue( - instanceId, - "refreshToken", - token.refreshToken - ); - await this.setValue( - instanceId, - "expiresOn", - token.expiresOn.toString() - ); - resolve(token.accessToken); - } - } - ); - } - }); + public static generateUuid(): string { + return msRestAzure.generateUuid(); } public static async getADALTokenFromUsername( username: string, password: string ) { - let credentials = await GBAdminService.getADALCredentialsFromUsername( + const credentials = await GBAdminService.getADALCredentialsFromUsername( username, password ); - let accessToken = credentials.tokenCache._entries[0].accessToken; + const accessToken = credentials.tokenCache._entries[0].accessToken; return accessToken; } @@ -153,7 +78,7 @@ export class GBAdminService { username: string, password: string ) { - let credentials = await msRestAzure.loginWithUsernamePassword( + const credentials = await msRestAzure.loginWithUsernamePassword( username, password ); @@ -171,7 +96,7 @@ export class GBAdminService { maximumLength: 14 }; let password = passwordGenerator.generatePassword(options); - password = password.replace(/@[=:;\?]/g, "#"); + password = password.replace(/@[=:;\?]/g, '#'); return password; } @@ -185,8 +110,83 @@ export class GBAdminService { minimumLength: 12, maximumLength: 14 }; - let name = passwordGenerator.generatePassword(options); + const name = passwordGenerator.generatePassword(options); return name; } + public async setValue( + instanceId: number, + key: string, + value: string + ): Promise { + const options = { where: {} }; + options.where = { key: key }; + let admin = await GuaribasAdmin.findOne(options); + if (admin == null) { + admin = new GuaribasAdmin(); + admin.key = key; + } + admin.value = value; + admin.instanceId = instanceId; + return admin.save(); + } + + public async getValue(instanceId: number, key: string) { + const options = { where: {} }; + options.where = { key: key, instanceId: instanceId }; + const obj = await GuaribasAdmin.findOne(options); + return Promise.resolve(obj.value); + } + + public async acquireElevatedToken(instanceId): Promise { + return new Promise(async (resolve, reject) => { + const instance = await this.core.loadInstanceById(instanceId); + + const expiresOn = new Date(await this.getValue(instanceId, 'expiresOn')); + if (expiresOn.getTime() > new Date().getTime()) { + const accessToken = await this.getValue(instanceId, 'accessToken'); + resolve(accessToken); + } else { + const authorizationUrl = UrlJoin( + instance.authenticatorAuthorityHostUrl, + instance.authenticatorTenant, + '/oauth2/authorize' + ); + + const refreshToken = await this.getValue(instanceId, 'refreshToken'); + const resource = 'https://graph.microsoft.com'; + const authenticationContext = new AuthenticationContext(authorizationUrl); + authenticationContext.acquireTokenWithRefreshToken( + refreshToken, + instance.authenticatorClientId, + instance.authenticatorClientSecret, + resource, + async (err, res) => { + if (err) { + reject(err); + } else { + const token = res as TokenResponse; + await this.setValue( + instanceId, + 'accessToken', + token.accessToken + ); + await this.setValue( + instanceId, + 'refreshToken', + token.refreshToken + ); + await this.setValue( + instanceId, + 'expiresOn', + token.expiresOn.toString() + ); + resolve(token.accessToken); + } + } + ); + } + }); + } + } diff --git a/packages/admin.gbapp/strings.ts b/packages/admin.gbapp/strings.ts index dbd2c65d..db158f9d 100644 --- a/packages/admin.gbapp/strings.ts +++ b/packages/admin.gbapp/strings.ts @@ -1,10 +1,10 @@ export const Messages = { - "en-US": { - authenticate: "Please, authenticate:", - welcome: "Welcome to Pragmatismo.io GeneralBots Administration.", - which_task: "Which task do you wanna run now?", - working:(command)=> `I'm working on ${command}...`, - finshed_working:"Done.", + 'en-US': { + authenticate: 'Please, authenticate:', + welcome: 'Welcome to Pragmatismo.io GeneralBots Administration.', + which_task: 'Which task do you wanna run now?', + working: (command) => `I'm working on ${command}...`, + finshed_working: 'Done.', unknown_command: text => `Well, but ${text} is not a administrative General Bots command, I will try to search for it.`, hi: text => `Hello, ${text}.`, @@ -12,11 +12,11 @@ export const Messages = { deployPackage: text => `Deploying package ${text}...`, redeployPackage: text => `Redeploying package ${text}...`, packageUndeployed: text => `Package ${text} undeployed...`, - consent: (url)=>`Please, consent access to this app at: [Microsoft Online](${url}).`, - wrong_password: "Sorry, wrong password. Please, try again." + consent: (url) => `Please, consent access to this app at: [Microsoft Online](${url}).`, + wrong_password: 'Sorry, wrong password. Please, try again.' }, - "pt-BR": { - show_video: "Vou te mostrar um vídeo. Por favor, aguarde...", + 'pt-BR': { + show_video: 'Vou te mostrar um vídeo. Por favor, aguarde...', hi: msg => `Oi, ${msg}.` } }; diff --git a/packages/analytics.gblib/index.ts b/packages/analytics.gblib/index.ts index 9e6cdfbc..63ba890b 100644 --- a/packages/analytics.gblib/index.ts +++ b/packages/analytics.gblib/index.ts @@ -34,33 +34,31 @@ * @fileoverview General Bots server core. */ -'use strict' +'use strict'; -const UrlJoin = require("url-join") +const UrlJoin = require('url-join'); +import { GBMinInstance, IGBCoreService, IGBPackage } from 'botlib'; - -import { GBMinInstance, IGBPackage, IGBCoreService } from "botlib" - -import { Sequelize } from "sequelize-typescript" +import { Sequelize } from 'sequelize-typescript'; export class GBAnalyticsPackage implements IGBPackage { - - sysPackages: IGBPackage[] = null - - loadPackage(core: IGBCoreService, sequelize: Sequelize): void { - + + public sysPackages: IGBPackage[] = null; + + public loadPackage(core: IGBCoreService, sequelize: Sequelize): void { + } - unloadPackage(core: IGBCoreService): void { - + public unloadPackage(core: IGBCoreService): void { + } - loadBot(min: GBMinInstance): void { - + public loadBot(min: GBMinInstance): void { + } - unloadBot(min: GBMinInstance): void { - + public unloadBot(min: GBMinInstance): void { + } - onNewSession(min: GBMinInstance, step: any): void { - + public onNewSession(min: GBMinInstance, step: any): void { + } } diff --git a/packages/analytics.gblib/models/index.ts b/packages/analytics.gblib/models/index.ts index eea895b2..63b148b3 100644 --- a/packages/analytics.gblib/models/index.ts +++ b/packages/analytics.gblib/models/index.ts @@ -34,36 +34,36 @@ * @fileoverview General Bots server core. */ -'use strict' +'use strict'; import { - DataTypes, - DataTypeUUIDv4, DataTypeDate, - DataTypeDecimal -} from "sequelize" + DataTypeDecimal, + DataTypes, + DataTypeUUIDv4 +} from 'sequelize'; import { - Sequelize, - Table, - Column, - Model, - HasMany, + AutoIncrement, BelongsTo, BelongsToMany, - Length, - ForeignKey, + Column, CreatedAt, - UpdatedAt, DataType, + ForeignKey, + HasMany, IsUUID, + Length, + Model, PrimaryKey, - AutoIncrement -} from "sequelize-typescript" + Sequelize, + Table, + UpdatedAt +} from 'sequelize-typescript'; -import { GuaribasSubject } from "../../kb.gbapp/models" -import { GuaribasUser } from "../../security.gblib/models" -import { GuaribasChannel, GuaribasInstance } from "../../core.gbapp/models/GBModel" +import { GuaribasChannel, GuaribasInstance } from '../../core.gbapp/models/GBModel'; +import { GuaribasSubject } from '../../kb.gbapp/models'; +import { GuaribasUser } from '../../security.gblib/models'; @Table export class GuaribasConversation extends Model { @@ -71,40 +71,40 @@ export class GuaribasConversation extends Model { @PrimaryKey @AutoIncrement @Column - conversationId: number + public conversationId: number; @ForeignKey(() => GuaribasSubject) @Column - startSubjectId: number + public startSubjectId: number; @BelongsTo(() => GuaribasSubject) - startSubject: GuaribasSubject + public startSubject: GuaribasSubject; @ForeignKey(() => GuaribasChannel) @Column - channelId: string + public channelId: string; - @Column rateDate: Date + @Column public rateDate: Date; @Column(DataType.FLOAT) @Column - rate: number + public rate: number; @Column @CreatedAt - createdAt: Date + public createdAt: Date; - @Column text: string + @Column public text: string; @HasMany(() => GuaribasConversationMessage) - conversationMessage: GuaribasConversationMessage[] + public conversationMessage: GuaribasConversationMessage[]; @ForeignKey(() => GuaribasUser) @Column - startedByUserId: number + public startedByUserId: number; @BelongsTo(() => GuaribasUser) - startedBy: GuaribasUser + public startedBy: GuaribasUser; } @Table @@ -113,38 +113,38 @@ export class GuaribasConversationMessage extends Model GuaribasSubject) @Column - subjectId: number + public subjectId: number; @Column(DataType.TEXT) - content: string + public content: string; @Column @CreatedAt - createdAt: Date + public createdAt: Date; @Column @UpdatedAt - updatedAt: Date + public updatedAt: Date; @ForeignKey(() => GuaribasConversation) @Column - conversationId: number + public conversationId: number; @BelongsTo(() => GuaribasConversation) - conversation: GuaribasConversation + public conversation: GuaribasConversation; @ForeignKey(() => GuaribasInstance) @Column - instanceId: number + public instanceId: number; @ForeignKey(() => GuaribasUser) @Column - userId: number + public userId: number; @BelongsTo(() => GuaribasUser) - user: GuaribasUser + public user: GuaribasUser; } diff --git a/packages/analytics.gblib/services/AnalyticsService.ts b/packages/analytics.gblib/services/AnalyticsService.ts index 5ab71ec0..abefd2bc 100644 --- a/packages/analytics.gblib/services/AnalyticsService.ts +++ b/packages/analytics.gblib/services/AnalyticsService.ts @@ -34,38 +34,38 @@ * @fileoverview General Bots server core. */ -import { GuaribasUser } from "../../security.gblib/models" -import { GuaribasConversation, GuaribasConversationMessage } from "../models" +import { GuaribasUser } from '../../security.gblib/models'; +import { GuaribasConversation, GuaribasConversationMessage } from '../models'; export class AnalyticsService { - async createConversation( + public async createConversation( user: GuaribasUser ): Promise { return new Promise( (resolve, reject) => { - let conversation = new GuaribasConversation() - conversation.startedBy = user - conversation.startedByUserId = user.userId + const conversation = new GuaribasConversation(); + conversation.startedBy = user; + conversation.startedByUserId = user.userId; conversation.save().then((value: GuaribasConversation) => { - resolve(value) - }) - }) + resolve(value); + }); + }); } - createMessage( + public createMessage( conversation: GuaribasConversation, user: GuaribasUser, content: string ): Promise { return new Promise( (resolve, reject) => { - let message = GuaribasConversationMessage.build() - message.conversation = conversation - message.user = user - message.content = content + const message = GuaribasConversationMessage.build(); + message.conversation = conversation; + message.user = user; + message.content = content; message.save().then((value: GuaribasConversationMessage) => { - resolve(value) - }) - }) + resolve(value); + }); + }); } } diff --git a/packages/azuredeployer.gbapp/dialogs/BotFarmDialog.ts b/packages/azuredeployer.gbapp/dialogs/BotFarmDialog.ts index 4bc6b644..19a95fb9 100644 --- a/packages/azuredeployer.gbapp/dialogs/BotFarmDialog.ts +++ b/packages/azuredeployer.gbapp/dialogs/BotFarmDialog.ts @@ -57,13 +57,13 @@ export class BotFarmDialog extends IGBDialog { '2', '3', '4', - '5', + '5' ]); }, async step => { const locale = step.context.activity.locale; await step.context.sendActivity(Messages[locale].thanks); - }, + } ]); } } diff --git a/packages/azuredeployer.gbapp/services/AzureDeployerService.ts b/packages/azuredeployer.gbapp/services/AzureDeployerService.ts index f6c30475..b94712e4 100644 --- a/packages/azuredeployer.gbapp/services/AzureDeployerService.ts +++ b/packages/azuredeployer.gbapp/services/AzureDeployerService.ts @@ -36,60 +36,161 @@ 'use strict'; -import { GBService, IGBInstance } from "botlib"; +import { CognitiveServicesManagementClient } from 'azure-arm-cognitiveservices'; +import { CognitiveServicesAccount } from 'azure-arm-cognitiveservices/lib/models'; import { ResourceManagementClient, SubscriptionClient -} from "azure-arm-resource"; -import { WebSiteManagementClient } from "azure-arm-website"; -import { SqlManagementClient } from "azure-arm-sql"; -import { CognitiveServicesManagementClient } from "azure-arm-cognitiveservices"; -import { CognitiveServicesAccount } from "azure-arm-cognitiveservices/lib/models"; -import { SearchManagementClient } from "azure-arm-search"; -import { WebResource, ServiceClient, HttpMethods } from "ms-rest-js"; -import * as simplegit from "simple-git/promise"; -import { AppServicePlan } from "azure-arm-website/lib/models"; -import { GBConfigService } from "../../../packages/core.gbapp/services/GBConfigService"; -import { GBAdminService } from "../../../packages/admin.gbapp/services/GBAdminService"; -import { GBCorePackage } from "../../../packages/core.gbapp"; -import { GBDeployer } from "packages/core.gbapp/services/GBDeployer"; +} from 'azure-arm-resource'; +import { SearchManagementClient } from 'azure-arm-search'; +import { SqlManagementClient } from 'azure-arm-sql'; +import { WebSiteManagementClient } from 'azure-arm-website'; +import { AppServicePlan } from 'azure-arm-website/lib/models'; +import { GBService, IGBInstance } from 'botlib'; +import { HttpMethods, ServiceClient, WebResource } from 'ms-rest-js'; +import { GBDeployer } from 'packages/core.gbapp/services/GBDeployer'; +import * as simplegit from 'simple-git/promise'; +import { GBAdminService } from '../../../packages/admin.gbapp/services/GBAdminService'; +import { GBCorePackage } from '../../../packages/core.gbapp'; +import { GBConfigService } from '../../../packages/core.gbapp/services/GBConfigService'; -const Spinner = require("cli-spinner").Spinner; -const scanf = require("scanf"); +const Spinner = require('cli-spinner').Spinner; +const scanf = require('scanf'); const git = simplegit(); -const logger = require("../../../src/logger"); -const UrlJoin = require("url-join"); +const logger = require('../../../src/logger'); +const UrlJoin = require('url-join'); const iconUrl = - "https://github.com/pragmatismo-io/BotServer/blob/master/docs/images/generalbots-logo-squared.png"; -const publicIp = require("public-ip"); + 'https://github.com/pragmatismo-io/BotServer/blob/master/docs/images/generalbots-logo-squared.png'; +const publicIp = require('public-ip'); export class AzureDeployerService extends GBService { - instance: IGBInstance; - resourceClient: ResourceManagementClient.ResourceManagementClient; - webSiteClient: WebSiteManagementClient; - storageClient: SqlManagementClient; - cognitiveClient: CognitiveServicesManagementClient; - searchClient: SearchManagementClient; - provider = "Microsoft.BotService"; - subscriptionClient: SubscriptionClient.SubscriptionClient; - accessToken: string; - location: string; + public static apiVersion = '2017-12-01'; + public instance: IGBInstance; + public resourceClient: ResourceManagementClient.ResourceManagementClient; + public webSiteClient: WebSiteManagementClient; + public storageClient: SqlManagementClient; + public cognitiveClient: CognitiveServicesManagementClient; + public searchClient: SearchManagementClient; + public provider = 'Microsoft.BotService'; + public subscriptionClient: SubscriptionClient.SubscriptionClient; + public accessToken: string; + public location: string; public subscriptionId: string; - static apiVersion = "2017-12-01"; - farmName: any; - deployer: GBDeployer; + public farmName: any; + public deployer: GBDeployer; - constructor(deployer: GBDeployer){ + constructor(deployer: GBDeployer) { super(); this.deployer = deployer; } public static async getSubscriptions(credentials) { - let subscriptionClient = new SubscriptionClient.default(credentials); + const subscriptionClient = new SubscriptionClient.default(credentials); return subscriptionClient.subscriptions.list(); } + public static getKBSearchSchema(indexName) { + return { + name: indexName, + fields: [ + { + name: 'questionId', + type: 'Edm.String', + searchable: false, + filterable: false, + retrievable: true, + sortable: false, + facetable: false, + key: true + }, + { + name: 'subject1', + type: 'Edm.String', + searchable: true, + filterable: false, + retrievable: false, + sortable: false, + facetable: false, + key: false + }, + { + name: 'subject2', + type: 'Edm.String', + searchable: true, + filterable: false, + retrievable: false, + sortable: false, + facetable: false, + key: false + }, + { + name: 'subject3', + type: 'Edm.String', + searchable: true, + filterable: false, + retrievable: false, + sortable: false, + facetable: false, + key: false + }, + { + name: 'subject4', + type: 'Edm.String', + searchable: true, + filterable: false, + retrievable: false, + sortable: false, + facetable: false, + key: false + }, + { + name: 'content', + type: 'Edm.String', + searchable: true, + filterable: false, + retrievable: false, + sortable: false, + facetable: false, + key: false + }, + { + name: 'answerId', + type: 'Edm.Int32', + searchable: false, + filterable: false, + retrievable: true, + sortable: false, + facetable: false, + key: false + }, + { + name: 'instanceId', + type: 'Edm.Int32', + searchable: false, + filterable: true, + retrievable: true, + sortable: false, + facetable: false, + key: false + }, + { + name: 'packageId', + type: 'Edm.Int32', + searchable: false, + filterable: true, + retrievable: true, + sortable: false, + facetable: false, + key: false + } + ], + scoringProfiles: [], + defaultScoringProfile: null, + corsOptions: null + }; + } + public async deployFarm(proxyAddress: string): Promise { - let culture = "en-us"; + const culture = 'en-us'; // Tries do get information from .env file otherwise asks in command-line. @@ -97,18 +198,18 @@ export class AzureDeployerService extends GBService { instance = await this.ensureConfiguration(instance); instance.marketplacePassword = GBAdminService.getRndPassword(); - let spinner = new Spinner("%s"); + const spinner = new Spinner('%s'); spinner.start(); - spinner.setSpinnerString("|/-\\"); + spinner.setSpinnerString('|/-\\'); let keys: any; - let name = instance.botId; + const name = instance.botId; logger.info(`Deploying Deploy Group (It may take a few minutes)...`); await this.createDeployGroup(name, instance.cloudLocation); logger.info(`Deploying Bot Server...`); - let serverFarm = await this.createHostingPlan( + const serverFarm = await this.createHostingPlan( name, `${name}-server-plan`, instance.cloudLocation @@ -121,10 +222,10 @@ export class AzureDeployerService extends GBService { ); logger.info(`Deploying Bot Storage...`); - let administratorLogin = `sa${GBAdminService.getRndReadableIdentifier()}`; - let administratorPassword = GBAdminService.getRndPassword(); - let storageServer = `${name}-storage-server`; - let storageName = `${name}-storage`; + const administratorLogin = `sa${GBAdminService.getRndReadableIdentifier()}`; + const administratorPassword = GBAdminService.getRndPassword(); + const storageServer = `${name}-storage-server`; + const storageName = `${name}-storage`; await this.createStorageServer( name, storageServer, @@ -142,24 +243,24 @@ export class AzureDeployerService extends GBService { instance.storageUsername = administratorLogin; instance.storagePassword = administratorPassword; instance.storageName = storageName; - instance.storageDialect = "mssql"; + instance.storageDialect = 'mssql'; instance.storageServer = storageServer; logger.info(`Deploying Search...`); - let searchName = `${name}-search`; + const searchName = `${name}-search`; await this.createSearch(name, searchName, instance.cloudLocation); - let searchKeys = await this.searchClient.adminKeys.get( + const searchKeys = await this.searchClient.adminKeys.get( name, searchName ); instance.searchHost = `${searchName}.search.windows.net`; - instance.searchIndex = "azuresql-index"; - instance.searchIndexer = "azuresql-indexer"; + instance.searchIndex = 'azuresql-index'; + instance.searchIndexer = 'azuresql-indexer'; instance.searchKey = searchKeys.primaryKey; this.deployer.rebuildIndex(instance); logger.info(`Deploying Speech...`); - let speech = await this.createSpeech( + const speech = await this.createSpeech( name, `${name}-speech`, instance.cloudLocation @@ -169,7 +270,7 @@ export class AzureDeployerService extends GBService { instance.speechKey = keys.key1; logger.info(`Deploying SpellChecker...`); - let spellChecker = await this.createSpellChecker( + const spellChecker = await this.createSpellChecker( name, `${name}-spellchecker`, instance.cloudLocation @@ -182,7 +283,7 @@ export class AzureDeployerService extends GBService { instance.spellCheckerEndpoint = spellChecker.endpoint; logger.info(`Deploying Text Analytics...`); - let textAnalytics = await this.createTextAnalytics( + const textAnalytics = await this.createTextAnalytics( name, `${name}-textanalytics`, instance.cloudLocation @@ -195,9 +296,9 @@ export class AzureDeployerService extends GBService { instance.textAnalyticsKey = keys.key1; logger.info(`Deploying NLP...`); - let nlp = await this.createNLP(name, `${name}-nlp`, instance.cloudLocation); + const nlp = await this.createNLP(name, `${name}-nlp`, instance.cloudLocation); keys = await this.cognitiveClient.accounts.listKeys(name, nlp.name); - let nlpAppId = await this.createLUISApp( + const nlpAppId = await this.createLUISApp( name, name, instance.cloudLocation, @@ -219,24 +320,23 @@ export class AzureDeployerService extends GBService { instance.cloudSubscriptionId ); - spinner.stop(); return instance; } public async openStorageFirewall(groupName, serverName) { - let username = GBConfigService.get("CLOUD_USERNAME"); - let password = GBConfigService.get("CLOUD_PASSWORD"); - let subscriptionId = GBConfigService.get("CLOUD_SUBSCRIPTIONID"); + const username = GBConfigService.get('CLOUD_USERNAME'); + const password = GBConfigService.get('CLOUD_PASSWORD'); + const subscriptionId = GBConfigService.get('CLOUD_SUBSCRIPTIONID'); - let credentials = await GBAdminService.getADALCredentialsFromUsername( + const credentials = await GBAdminService.getADALCredentialsFromUsername( username, password ); - let storageClient = new SqlManagementClient(credentials, subscriptionId); + const storageClient = new SqlManagementClient(credentials, subscriptionId); - let ip = await publicIp.v4(); - let params = { + const ip = await publicIp.v4(); + const params = { startIpAddress: ip, endIpAddress: ip }; @@ -244,53 +344,149 @@ export class AzureDeployerService extends GBService { await storageClient.firewallRules.createOrUpdate( groupName, serverName, - "gb", + 'gb', params ); } + public async deployBootBot( + instance, + botId, + endpoint, + nlpAppId, + nlpKey, + subscriptionId + ) { + let appId = GBConfigService.get('MARKETPLACE_ID'); + let appPassword = GBConfigService.get('MARKETPLACE_SECRET'); + + if (!appId || !appPassword) { + process.stdout.write( + 'Sorry, this part cannot be automated yet due to Microsoft schedule, please go to https://apps.dev.microsoft.com/portal/register-app to generate manually an App ID and App Secret.\n' + ); + } + + const retriveAppId = () => { + if (!appId) { + process.stdout.write('Generated Application Id (MARKETPLACE_ID):'); + appId = scanf('%s').replace(/(\n|\r)+$/, ''); + } + }; + + const retriveAppPassword = () => { + if (!appPassword) { + process.stdout.write('Generated Password (MARKETPLACE_SECRET):'); + appPassword = scanf('%s').replace(/(\n|\r)+$/, ''); + } + }; + + retriveAppId(); + retriveAppPassword(); + + await this.internalDeployBot( + instance, + this.accessToken, + botId, + botId, + botId, + 'General BootBot', + endpoint, + 'global', + nlpAppId, + nlpKey, + appId, + appPassword, + subscriptionId + ); + instance.marketplaceId = appId; + instance.marketplacePassword = appPassword; + instance.botId = botId; + + return instance; + } + + public async updateBotProxy(botId, group, endpoint) { + const baseUrl = `https://management.azure.com/`; + const username = GBConfigService.get('CLOUD_USERNAME'); + const password = GBConfigService.get('CLOUD_PASSWORD'); + const subscriptionId = GBConfigService.get('CLOUD_SUBSCRIPTIONID'); + + const accessToken = await GBAdminService.getADALTokenFromUsername( + username, + password + ); + const httpClient = new ServiceClient(); + + const parameters = { + properties: { + endpoint: endpoint + } + }; + + const query = `subscriptions/${subscriptionId}/resourceGroups/${group}/providers/${ + this.provider + }/botServices/${botId}?api-version=${AzureDeployerService.apiVersion}`; + const url = UrlJoin(baseUrl, query); + const req = this.createRequestObject( + url, + accessToken, + 'PATCH', + JSON.stringify(parameters) + ); + const res = await httpClient.sendRequest(req); + if (!(res.bodyAsJson as any).id) { + throw res.bodyAsText; + } + logger.info(`Bot proxy updated at: ${endpoint}.`); + } + + public async deployGeneralBotsToAzure() { + const status = await git.status(); + // TODO: Copy github to webapp. + } + private async ensureConfiguration(instance: IGBInstance) { - let username = GBConfigService.get("CLOUD_USERNAME"); - let password = GBConfigService.get("CLOUD_PASSWORD"); - let subscriptionId = GBConfigService.get("CLOUD_SUBSCRIPTIONID"); - let location = GBConfigService.get("CLOUD_LOCATION"); - let botId = GBConfigService.get("BOT_ID"); + let username = GBConfigService.get('CLOUD_USERNAME'); + let password = GBConfigService.get('CLOUD_PASSWORD'); + let subscriptionId = GBConfigService.get('CLOUD_SUBSCRIPTIONID'); + let location = GBConfigService.get('CLOUD_LOCATION'); + let botId = GBConfigService.get('BOT_ID'); // No .env so asks for cloud credentials to start a new farm. if (!username || !password || !subscriptionId || !location || !botId) { process.stdout.write( - "A empty enviroment is detected. To start automatic deploy, please enter some information:\n" + 'A empty enviroment is detected. To start automatic deploy, please enter some information:\n' ); } - let retriveUsername = () => { + const retriveUsername = () => { if (!username) { process.stdout.write(`${GBAdminService.GB_PROMPT}CLOUD_USERNAME:`); - username = scanf("%s").replace(/(\n|\r)+$/, ""); + username = scanf('%s').replace(/(\n|\r)+$/, ''); } }; - let retrivePassword = () => { + const retrivePassword = () => { if (!password) { process.stdout.write(`${GBAdminService.GB_PROMPT}CLOUD_PASSWORD:`); - password = scanf("%s").replace(/(\n|\r)+$/, ""); + password = scanf('%s').replace(/(\n|\r)+$/, ''); } }; - let retrieveBotId = () => { + const retrieveBotId = () => { if (!botId) { process.stdout.write( `${GBAdminService.GB_PROMPT}Bot Id must only contain lowercase letters, digits or dashes, cannot start or end with or contain consecutive dashes and is limited from 4 to 42 characters long.\n` ); process.stdout.write(`${GBAdminService.GB_PROMPT}BOT_ID:`); - botId = scanf("%s").replace(/(\n|\r)+$/, ""); // TODO: Update this regexp to match description of it. + botId = scanf('%s').replace(/(\n|\r)+$/, ''); // TODO: Update this regexp to match description of it. } }; - let authoringKey = GBConfigService.get("NLP_AUTHORING_KEY"); - let retriveAuthoringKey = () => { + let authoringKey = GBConfigService.get('NLP_AUTHORING_KEY'); + const retriveAuthoringKey = () => { if (!authoringKey) { process.stdout.write( `${GBAdminService.GB_PROMPT}Due to this opened issue: https://github.com/Microsoft/botbuilder-tools/issues/550\n` ); process.stdout.write(`${GBAdminService.GB_PROMPT}Please enter your LUIS Authoring Key:`); - authoringKey = scanf("%s").replace(/(\n|\r)+$/, ""); + authoringKey = scanf('%s').replace(/(\n|\r)+$/, ''); } }; while (!authoringKey) { @@ -308,14 +504,14 @@ export class AzureDeployerService extends GBService { // Connects to the cloud and retrives subscriptions. - let credentials = await GBAdminService.getADALCredentialsFromUsername( + const credentials = await GBAdminService.getADALCredentialsFromUsername( username, password ); if (!subscriptionId) { - let map = {}; + const map = {}; let index = 1; - let list = await AzureDeployerService.getSubscriptions(credentials); + const list = await AzureDeployerService.getSubscriptions(credentials); list.forEach(element => { console.log( `${index}: ${element.displayName} (${element.subscriptionId})` @@ -323,10 +519,10 @@ export class AzureDeployerService extends GBService { map[index++] = element; }); let subscriptionIndex; - let retrieveSubscription = () => { + const retrieveSubscription = () => { if (!subscriptionIndex) { - process.stdout.write("CLOUD_SUBSCRIPTIONID (type a number):"); - subscriptionIndex = scanf("%d"); + process.stdout.write('CLOUD_SUBSCRIPTIONID (type a number):'); + subscriptionIndex = scanf('%d'); } }; while (!subscriptionIndex) { @@ -334,10 +530,10 @@ export class AzureDeployerService extends GBService { } subscriptionId = map[subscriptionIndex].subscriptionId; } - let retriveLocation = () => { + const retriveLocation = () => { if (!location) { - process.stdout.write("CLOUD_LOCATION (eg. 'westus'):"); - location = scanf("%s"); + process.stdout.write('CLOUD_LOCATION (eg. \'westus\'):'); + location = scanf('%s'); } }; while (!location) { @@ -374,62 +570,6 @@ export class AzureDeployerService extends GBService { return instance; } - public async deployBootBot( - instance, - botId, - endpoint, - nlpAppId, - nlpKey, - subscriptionId - ) { - let appId = GBConfigService.get("MARKETPLACE_ID"); - let appPassword = GBConfigService.get("MARKETPLACE_SECRET"); - - if (!appId || !appPassword) { - process.stdout.write( - "Sorry, this part cannot be automated yet due to Microsoft schedule, please go to https://apps.dev.microsoft.com/portal/register-app to generate manually an App ID and App Secret.\n" - ); - } - - let retriveAppId = () => { - if (!appId) { - process.stdout.write("Generated Application Id (MARKETPLACE_ID):"); - appId = scanf("%s").replace(/(\n|\r)+$/, ""); - } - }; - - let retriveAppPassword = () => { - if (!appPassword) { - process.stdout.write("Generated Password (MARKETPLACE_SECRET):"); - appPassword = scanf("%s").replace(/(\n|\r)+$/, ""); - } - }; - - retriveAppId(); - retriveAppPassword(); - - await this.internalDeployBot( - instance, - this.accessToken, - botId, - botId, - botId, - "General BootBot", - endpoint, - "global", - nlpAppId, - nlpKey, - appId, - appPassword, - subscriptionId - ); - instance.marketplaceId = appId; - instance.marketplacePassword = appPassword; - instance.botId = botId; - - return instance; - } - private async createStorageServer( group, name, @@ -438,7 +578,7 @@ export class AzureDeployerService extends GBService { serverName, location ) { - var params = { + const params = { location: location, administratorLogin: administratorLogin, administratorLoginPassword: administratorPassword, @@ -449,21 +589,21 @@ export class AzureDeployerService extends GBService { } private async registerProviders(subscriptionId, baseUrl, accessToken) { - let query = `subscriptions/${subscriptionId}/providers/${ + const query = `subscriptions/${subscriptionId}/providers/${ this.provider }/register?api-version=2018-02-01`; - let requestUrl = UrlJoin(baseUrl, query); + const requestUrl = UrlJoin(baseUrl, query); - let req = new WebResource(); - req.method = "POST"; + const req = new WebResource(); + req.method = 'POST'; req.url = requestUrl; req.headers = {}; - req.headers["Content-Type"] = "application/json; charset=utf-8"; - req.headers["accept-language"] = "*"; - req.headers["Authorization"] = "Bearer " + accessToken; + req.headers['Content-Type'] = 'application/json; charset=utf-8'; + req.headers['accept-language'] = '*'; + req.headers.Authorization = 'Bearer ' + accessToken; - let httpClient = new ServiceClient(); - let res = await httpClient.sendRequest(req); + const httpClient = new ServiceClient(); + const res = await httpClient.sendRequest(req); // TODO: Check res for error. } /** @@ -485,20 +625,20 @@ export class AzureDeployerService extends GBService { subscriptionId ) { return new Promise(async (resolve, reject) => { - let baseUrl = `https://management.azure.com/`; + const baseUrl = `https://management.azure.com/`; await this.registerProviders(subscriptionId, baseUrl, accessToken); instance.marketplaceId = appId; instance.marketplacePassword = appPassword; instance.engineName = GBCorePackage.CurrentEngineName; - let parameters = { + const parameters = { location: location, sku: { - name: "F0" + name: 'F0' }, name: botId, - kind: "bot", + kind: 'bot', properties: { description: description, displayName: name, @@ -508,12 +648,12 @@ export class AzureDeployerService extends GBService { luisKey: nlpKey, msaAppId: appId, msaAppPassword: appPassword, - enabledChannels: ["webchat"], // , "skype", "facebook"], - configuredChannels: ["webchat"] // , "skype", "facebook"] + enabledChannels: ['webchat'], // , "skype", "facebook"], + configuredChannels: ['webchat'] // , "skype", "facebook"] } }; - let httpClient = new ServiceClient(); + const httpClient = new ServiceClient(); let query = `subscriptions/${subscriptionId}/resourceGroups/${group}/providers/${ this.provider }/botServices/${botId}?api-version=${AzureDeployerService.apiVersion}`; @@ -521,10 +661,10 @@ export class AzureDeployerService extends GBService { let req = this.createRequestObject( url, accessToken, - "PUT", + 'PUT', JSON.stringify(parameters) ); - let res = await httpClient.sendRequest(req); + const res = await httpClient.sendRequest(req); if (!(res.bodyAsJson as any).id) { reject(res.bodyAsText); return; @@ -539,69 +679,34 @@ export class AzureDeployerService extends GBService { req = this.createRequestObject( url, accessToken, - "GET", + 'GET', JSON.stringify(parameters) ); - let resChannel = await httpClient.sendRequest(req); - let key = (resChannel.bodyAsJson as any).properties.properties + const resChannel = await httpClient.sendRequest(req); + const key = (resChannel.bodyAsJson as any).properties.properties .sites[0].key; instance.webchatKey = key; resolve(instance); } catch (error) { reject(error); } - }, 20000); + }, 20000); }); } - public async updateBotProxy(botId, group, endpoint) { - let baseUrl = `https://management.azure.com/`; - let username = GBConfigService.get("CLOUD_USERNAME"); - let password = GBConfigService.get("CLOUD_PASSWORD"); - let subscriptionId = GBConfigService.get("CLOUD_SUBSCRIPTIONID"); - - let accessToken = await GBAdminService.getADALTokenFromUsername( - username, - password - ); - let httpClient = new ServiceClient(); - - let parameters = { - properties: { - endpoint: endpoint - } - }; - - let query = `subscriptions/${subscriptionId}/resourceGroups/${group}/providers/${ - this.provider - }/botServices/${botId}?api-version=${AzureDeployerService.apiVersion}`; - let url = UrlJoin(baseUrl, query); - let req = this.createRequestObject( - url, - accessToken, - "PATCH", - JSON.stringify(parameters) - ); - let res = await httpClient.sendRequest(req); - if (!(res.bodyAsJson as any).id) { - throw res.bodyAsText; - } - logger.info(`Bot proxy updated at: ${endpoint}.`); - } - private createRequestObject( url: string, accessToken: string, verb: HttpMethods, body: string ) { - let req = new WebResource(); + const req = new WebResource(); req.method = verb; req.url = url; req.headers = {}; - req.headers["Content-Type"] = "application/json"; - req.headers["accept-language"] = "*"; - req.headers["Authorization"] = "Bearer " + accessToken; + req.headers['Content-Type'] = 'application/json'; + req.headers['accept-language'] = '*'; + req.headers.Authorization = 'Bearer ' + accessToken; req.body = body; return req; } @@ -613,29 +718,29 @@ export class AzureDeployerService extends GBService { culture: string, authoringKey: string ) { - let parameters = { + const parameters = { name: name, description: description, culture: culture }; - let body = JSON.stringify(parameters); - let apps = await this.makeNlpRequest( + const body = JSON.stringify(parameters); + const apps = await this.makeNlpRequest( location, authoringKey, null, - "GET", - "apps" + 'GET', + 'apps' ); - let app = (apps.bodyAsJson as any).filter(x => x.name == name)[0]; + const app = (apps.bodyAsJson as any).filter(x => x.name == name)[0]; let id: string; if (!app) { - let res = await this.makeNlpRequest( + const res = await this.makeNlpRequest( location, authoringKey, body, - "POST", - "apps" + 'POST', + 'apps' ); id = res.bodyAsText; } else { @@ -652,22 +757,22 @@ export class AzureDeployerService extends GBService { method: HttpMethods, resource: string ) { - let req = new WebResource(); + const req = new WebResource(); req.method = method; req.url = `https://${location}.api.cognitive.microsoft.com/luis/api/v2.0/${resource}`; req.headers = {}; - req.headers["Content-Type"] = "application/json"; - req.headers["accept-language"] = "*"; - req.headers["Ocp-Apim-Subscription-Key"] = authoringKey; + req.headers['Content-Type'] = 'application/json'; + req.headers['accept-language'] = '*'; + req.headers['Ocp-Apim-Subscription-Key'] = authoringKey; req.body = body; - let httpClient = new ServiceClient(); - let res = await httpClient.sendRequest(req); + const httpClient = new ServiceClient(); + const res = await httpClient.sendRequest(req); return res; } private async createSearch(group, name, location) { - var params = { - sku: { name: "free" }, + const params = { + sku: { name: 'free' }, location: location }; @@ -675,9 +780,9 @@ export class AzureDeployerService extends GBService { } private async createStorage(group, serverName, name, location) { - var params = { - sku: { name: "Free" }, - createMode: "Default", + const params = { + sku: { name: 'Free' }, + createMode: 'Default', location: location }; @@ -695,9 +800,9 @@ export class AzureDeployerService extends GBService { location, kind ): Promise { - let params = { - sku: { name: "F0" }, - createMode: "Default", + const params = { + sku: { name: 'F0' }, + createMode: 'Default', location: location, kind: kind, properties: {} @@ -715,7 +820,7 @@ export class AzureDeployerService extends GBService { group, name, location, - "SpeechServices" + 'SpeechServices' ); } @@ -724,7 +829,7 @@ export class AzureDeployerService extends GBService { name, location ): Promise { - return await this.createCognitiveServices(group, name, location, "LUIS"); + return await this.createCognitiveServices(group, name, location, 'LUIS'); } private async createSpellChecker( @@ -735,8 +840,8 @@ export class AzureDeployerService extends GBService { return await this.createCognitiveServices( group, name, - "global", - "Bing.SpellCheck.v7" + 'global', + 'Bing.SpellCheck.v7' ); } @@ -749,12 +854,12 @@ export class AzureDeployerService extends GBService { group, name, location, - "TextAnalytics" + 'TextAnalytics' ); } private async createDeployGroup(name, location) { - var params = { location: location }; + const params = { location: location }; return this.resourceClient.resourceGroups.createOrUpdate(name, params); } @@ -763,13 +868,13 @@ export class AzureDeployerService extends GBService { name, location ): Promise { - let params = { + const params = { serverFarmWithRichSkuName: name, location: location, sku: { - name: "F1", + name: 'F1', capacity: 1, - tier: "Free" + tier: 'Free' } }; @@ -781,7 +886,7 @@ export class AzureDeployerService extends GBService { } private async createServer(farmId, group, name, location) { - var parameters = { + const parameters = { location: location, serverFarmId: farmId }; @@ -789,11 +894,11 @@ export class AzureDeployerService extends GBService { } private async updateWebisteConfig(group, serverFarmId, name, location) { - var siteConfig = { + const siteConfig = { location: location, serverFarmId: serverFarmId, numberOfWorkers: 1, - phpVersion: "5.5" + phpVersion: '5.5' }; // TODO: Copy .env to app settings. @@ -804,110 +909,4 @@ export class AzureDeployerService extends GBService { siteConfig ); } - - async deployGeneralBotsToAzure() { - let status = await git.status(); - // TODO: Copy github to webapp. - } - - static getKBSearchSchema(indexName) { - return { - name: indexName, - fields: [ - { - name: "questionId", - type: "Edm.String", - searchable: false, - filterable: false, - retrievable: true, - sortable: false, - facetable: false, - key: true - }, - { - name: "subject1", - type: "Edm.String", - searchable: true, - filterable: false, - retrievable: false, - sortable: false, - facetable: false, - key: false - }, - { - name: "subject2", - type: "Edm.String", - searchable: true, - filterable: false, - retrievable: false, - sortable: false, - facetable: false, - key: false - }, - { - name: "subject3", - type: "Edm.String", - searchable: true, - filterable: false, - retrievable: false, - sortable: false, - facetable: false, - key: false - }, - { - name: "subject4", - type: "Edm.String", - searchable: true, - filterable: false, - retrievable: false, - sortable: false, - facetable: false, - key: false - }, - { - name: "content", - type: "Edm.String", - searchable: true, - filterable: false, - retrievable: false, - sortable: false, - facetable: false, - key: false - }, - { - name: "answerId", - type: "Edm.Int32", - searchable: false, - filterable: false, - retrievable: true, - sortable: false, - facetable: false, - key: false - }, - { - name: "instanceId", - type: "Edm.Int32", - searchable: false, - filterable: true, - retrievable: true, - sortable: false, - facetable: false, - key: false - }, - { - name: "packageId", - type: "Edm.Int32", - searchable: false, - filterable: true, - retrievable: true, - sortable: false, - facetable: false, - key: false - } - ], - scoringProfiles: [], - defaultScoringProfile: null, - corsOptions: null - }; - } } diff --git a/packages/azuredeployer.gbapp/strings.ts b/packages/azuredeployer.gbapp/strings.ts index ba5e75e0..bc43b1e4 100644 --- a/packages/azuredeployer.gbapp/strings.ts +++ b/packages/azuredeployer.gbapp/strings.ts @@ -1,8 +1,8 @@ export const Messages = { - "en-US": { - about_suggestions: "Suggestions are welcomed and improve my quality...", + 'en-US': { + about_suggestions: 'Suggestions are welcomed and improve my quality...' }, - "pt-BR": { - about_suggestions: "Sugestões melhoram muito minha qualidade...", + 'pt-BR': { + about_suggestions: 'Sugestões melhoram muito minha qualidade...' } }; diff --git a/packages/console.gblib/index.ts b/packages/console.gblib/index.ts index 0a14dc55..09eb4489 100644 --- a/packages/console.gblib/index.ts +++ b/packages/console.gblib/index.ts @@ -34,32 +34,32 @@ * @fileoverview General Bots server core. */ -'use strict' +'use strict'; -const UrlJoin = require("url-join") +const UrlJoin = require('url-join'); -import { GBMinInstance, IGBPackage, IGBCoreService } from "botlib" +import { GBMinInstance, IGBCoreService, IGBPackage } from 'botlib'; -import { Sequelize } from 'sequelize-typescript' -import { ConsoleDirectLine } from "./services/ConsoleDirectLine" +import { Sequelize } from 'sequelize-typescript'; +import { ConsoleDirectLine } from './services/ConsoleDirectLine'; export class GBConsolePackage implements IGBPackage { - sysPackages: IGBPackage[] = null - channel: ConsoleDirectLine + public sysPackages: IGBPackage[] = null; + public channel: ConsoleDirectLine; - loadPackage(core: IGBCoreService, sequelize: Sequelize): void { + public loadPackage(core: IGBCoreService, sequelize: Sequelize): void { } - unloadPackage(core: IGBCoreService): void { + public unloadPackage(core: IGBCoreService): void { } - loadBot(min: GBMinInstance): void { - this.channel = new ConsoleDirectLine(min.instance.webchatKey) + public loadBot(min: GBMinInstance): void { + this.channel = new ConsoleDirectLine(min.instance.webchatKey); } - unloadBot(min: GBMinInstance): void { + public unloadBot(min: GBMinInstance): void { } - onNewSession(min: GBMinInstance, step: any): void { + public onNewSession(min: GBMinInstance, step: any): void { } } diff --git a/packages/console.gblib/services/ConsoleDirectLine.ts b/packages/console.gblib/services/ConsoleDirectLine.ts index fc8dccc4..a15768f0 100644 --- a/packages/console.gblib/services/ConsoleDirectLine.ts +++ b/packages/console.gblib/services/ConsoleDirectLine.ts @@ -30,76 +30,75 @@ | | \*****************************************************************************/ -const Path = require("path") -const Fs = require("fs") -const _ = require("lodash") -const Parse = require("csv-parse") -const Async = require("async") -const UrlJoin = require("url-join") -const Walk = require("fs-walk") -const logger = require("../../../src/logger") -const Swagger = require('swagger-client') -const rp = require('request-promise') -import { GBService } from "botlib" +const Path = require('path'); +const Fs = require('fs'); +const _ = require('lodash'); +const Parse = require('csv-parse'); +const Async = require('async'); +const UrlJoin = require('url-join'); +const Walk = require('fs-walk'); +const logger = require('../../../src/logger'); +const Swagger = require('swagger-client'); +const rp = require('request-promise'); +import { GBService } from 'botlib'; export class ConsoleDirectLine extends GBService { - pollInterval = 1000 - directLineSecret = '' - directLineClientName = 'DirectLineClient' - directLineSpecUrl = 'https://docs.botframework.com/en-us/restapi/directline3/swagger.json' + public pollInterval = 1000; + public directLineSecret = ''; + public directLineClientName = 'DirectLineClient'; + public directLineSpecUrl = 'https://docs.botframework.com/en-us/restapi/directline3/swagger.json'; constructor(directLineSecret) { - super() - - this.directLineSecret = directLineSecret + super(); + this.directLineSecret = directLineSecret; // TODO: Migrate to Swagger 3. - let directLineClient = rp(this.directLineSpecUrl) + const directLineClient = rp(this.directLineSpecUrl) .then(function (spec) { return new Swagger({ spec: JSON.parse(spec.trim()), usePromise: true - }) + }); }) .then(function (client) { client.clientAuthorizations.add('AuthorizationBotConnector', - new Swagger.ApiKeyAuthorization('Authorization', 'Bearer ' + directLineSecret, 'header')) - return client + new Swagger.ApiKeyAuthorization('Authorization', 'Bearer ' + directLineSecret, 'header')); + return client; }) .catch(function (err) { - console.error('Error initializing DirectLine client', err) - }) + console.error('Error initializing DirectLine client', err); + }); // TODO: Remove *this* issue. - let _this_ = this - directLineClient.then((client)=> { + const _this_ = this; + directLineClient.then((client) => { client.Conversations.Conversations_StartConversation() .then(function (response) { - return response.obj.conversationId + return response.obj.conversationId; }) .then(function (conversationId) { - _this_.sendMessagesFromConsole(client, conversationId) - _this_.pollMessages(client, conversationId) + _this_.sendMessagesFromConsole(client, conversationId); + _this_.pollMessages(client, conversationId); }) .catch(function (err) { - console.error('Error starting conversation', err) - }) - }) + console.error('Error starting conversation', err); + }); + }); } - sendMessagesFromConsole(client, conversationId) { - let _this_ = this - process.stdin.resume() - var stdin = process.stdin - process.stdout.write('Command> ') + public sendMessagesFromConsole(client, conversationId) { + const _this_ = this; + process.stdin.resume(); + const stdin = process.stdin; + process.stdout.write('Command> '); stdin.addListener('data', function (e) { - var input = e.toString().trim() + const input = e.toString().trim(); if (input) { // exit if (input.toLowerCase() === 'exit') { - return process.exit() + return process.exit(); } client.Conversations.Conversations_PostActivity( @@ -115,80 +114,80 @@ export class ConsoleDirectLine extends GBService { } } }).catch(function (err) { - console.error('Error sending message:', err) - }) + console.error('Error sending message:', err); + }); - process.stdout.write('Command> ') + process.stdout.write('Command> '); } - }) + }); } /** TBD: Poll Messages from conversation using DirectLine client */ - pollMessages(client, conversationId) { - let _this_ = this - console.log('Starting polling message for conversationId: ' + conversationId) - var watermark = null + public pollMessages(client, conversationId) { + const _this_ = this; + console.log('Starting polling message for conversationId: ' + conversationId); + let watermark = null; setInterval(function () { client.Conversations.Conversations_GetActivities({ conversationId: conversationId, watermark: watermark }) .then(function (response) { - watermark = response.obj.watermark // use watermark so subsequent requests skip old messages - return response.obj.activities + watermark = response.obj.watermark; // use watermark so subsequent requests skip old messages + return response.obj.activities; }) - .then(_this_.printMessages, _this_.directLineClientName) - }, this.pollInterval) + .then(_this_.printMessages, _this_.directLineClientName); + }, this.pollInterval); } - printMessages(activities, directLineClientName) { + public printMessages(activities, directLineClientName) { if (activities && activities.length) { // ignore own messages - activities = activities.filter(function (m) { return m.from.id !== directLineClientName }) + activities = activities.filter(function (m) { return m.from.id !== directLineClientName; }); if (activities.length) { // print other messages activities.forEach(activity => { - console.log(activity.text) - }, this) + console.log(activity.text); + }, this); - process.stdout.write('Command> ') + process.stdout.write('Command> '); } } } - printMessage(activity) { + public printMessage(activity) { if (activity.text) { - console.log(activity.text) + console.log(activity.text); } if (activity.attachments) { activity.attachments.forEach(function (attachment) { switch (attachment.contentType) { - case "application/vnd.microsoft.card.hero": - this.renderHeroCard(attachment) - break + case 'application/vnd.microsoft.card.hero': + this.renderHeroCard(attachment); + break; - case "image/png": - console.log('Opening the requested image ' + attachment.contentUrl) - open(attachment.contentUrl) - break + case 'image/png': + console.log('Opening the requested image ' + attachment.contentUrl); + open(attachment.contentUrl); + break; } - }) + }); } } - renderHeroCard(attachment) { - var width = 70 - var contentLine = function (content) { + public renderHeroCard(attachment) { + const width = 70; + const contentLine = function (content) { return ' '.repeat((width - content.length) / 2) + content + - ' '.repeat((width - content.length) / 2) - } + ' '.repeat((width - content.length) / 2); + }; - console.log('/' + '*'.repeat(width + 1)) - console.log('*' + contentLine(attachment.content.title) + '*') - console.log('*' + ' '.repeat(width) + '*') - console.log('*' + contentLine(attachment.content.text) + '*') - console.log('*'.repeat(width + 1) + '/') + console.log('/' + '*'.repeat(width + 1)); + console.log('*' + contentLine(attachment.content.title) + '*'); + console.log('*' + ' '.repeat(width) + '*'); + console.log('*' + contentLine(attachment.content.text) + '*'); + console.log('*'.repeat(width + 1) + '/'); } -} \ No newline at end of file +} diff --git a/packages/core.gbapp/dialogs/WelcomeDialog.ts b/packages/core.gbapp/dialogs/WelcomeDialog.ts index 890057b9..b4dcfe75 100644 --- a/packages/core.gbapp/dialogs/WelcomeDialog.ts +++ b/packages/core.gbapp/dialogs/WelcomeDialog.ts @@ -36,11 +36,11 @@ 'use strict'; -import { IGBDialog } from "botlib"; -import { GBMinInstance } from "botlib"; -import { BotAdapter } from "botbuilder"; -import {WaterfallDialog } from "botbuilder-dialogs"; -import { Messages } from "../strings"; +import { BotAdapter } from 'botbuilder'; +import {WaterfallDialog } from 'botbuilder-dialogs'; +import { IGBDialog } from 'botlib'; +import { GBMinInstance } from 'botlib'; +import { Messages } from '../strings'; export class WelcomeDialog extends IGBDialog { /** @@ -49,20 +49,20 @@ export class WelcomeDialog extends IGBDialog { * @param bot The bot adapter. * @param min The minimal bot instance data. */ - static setup(bot: BotAdapter, min: GBMinInstance) { + public static setup(bot: BotAdapter, min: GBMinInstance) { + + min.dialogs.add(new WaterfallDialog('/', [ + async step => { - min.dialogs.add(new WaterfallDialog("/", [ - async step => { - const user = await min.userProfile.get(context, {}); const locale = step.context.activity.locale; if (!user.once) { user.once = true; await min.userProfile.set(step.context, user); - var a = new Date(); + const a = new Date(); const date = a.getHours(); - var msg = + const msg = date < 12 ? Messages[locale].good_morning : date < 18 @@ -70,18 +70,18 @@ export class WelcomeDialog extends IGBDialog { : Messages[locale].good_night; await step.context.sendActivity(Messages[locale].hi(msg)); - await step.replaceDialog("/ask", { firstTime: true }); + await step.replaceDialog('/ask', { firstTime: true }); if ( step.context.activity && - step.context.activity.type == "message" && - step.context.activity.text != "" + step.context.activity.type == 'message' && + step.context.activity.text != '' ) { - await step.replaceDialog("/answer", { query: step.context.activity.text }); + await step.replaceDialog('/answer', { query: step.context.activity.text }); } } return await step.next(); } - ])) + ])); } } diff --git a/packages/core.gbapp/dialogs/WhoAmIDialog.ts b/packages/core.gbapp/dialogs/WhoAmIDialog.ts index 02027c27..d9e599b2 100644 --- a/packages/core.gbapp/dialogs/WhoAmIDialog.ts +++ b/packages/core.gbapp/dialogs/WhoAmIDialog.ts @@ -36,11 +36,11 @@ 'use strict'; -import { IGBDialog } from "botlib"; -import { GBMinInstance } from "botlib"; -import { BotAdapter } from "botbuilder"; -import { Messages } from "../strings"; -import { WaterfallDialog } from "botbuilder-dialogs"; +import { BotAdapter } from 'botbuilder'; +import { WaterfallDialog } from 'botbuilder-dialogs'; +import { IGBDialog } from 'botlib'; +import { GBMinInstance } from 'botlib'; +import { Messages } from '../strings'; export class WhoAmIDialog extends IGBDialog { /** @@ -49,21 +49,21 @@ export class WhoAmIDialog extends IGBDialog { * @param bot The bot adapter. * @param min The minimal bot instance data. */ - static setup(bot: BotAdapter, min: GBMinInstance) { - min.dialogs.add(new WaterfallDialog("/whoAmI", [ + public static setup(bot: BotAdapter, min: GBMinInstance) { + min.dialogs.add(new WaterfallDialog('/whoAmI', [ async step => { - let locale = step.context.activity.locale; + const locale = step.context.activity.locale; await step.context.sendActivity(`${min.instance.description}`); if (min.instance.whoAmIVideo) { await step.context.sendActivity(Messages[locale].show_video); - await min.conversationalService.sendEvent(step, "play", { - playerType: "video", + await min.conversationalService.sendEvent(step, 'play', { + playerType: 'video', data: min.instance.whoAmIVideo.trim() }); } - await step.replaceDialog("/ask", { isReturning: true }); + await step.replaceDialog('/ask', { isReturning: true }); return await step.next(); } ])); diff --git a/packages/core.gbapp/index.ts b/packages/core.gbapp/index.ts index a1b70bdd..0ea3b719 100644 --- a/packages/core.gbapp/index.ts +++ b/packages/core.gbapp/index.ts @@ -34,44 +34,44 @@ * @fileoverview General Bots server core. */ -'use strict' +'use strict'; -const UrlJoin = require("url-join") +const UrlJoin = require('url-join'); -import { GBMinInstance, IGBPackage } from "botlib" +import { GBMinInstance, IGBPackage } from 'botlib'; -import { WelcomeDialog } from "./dialogs/WelcomeDialog" -import { WhoAmIDialog } from "./dialogs/WhoAmIDialog" -import { IGBCoreService} from "botlib" -import { Sequelize } from "sequelize-typescript" -import { GuaribasInstance, GuaribasException, GuaribasPackage, GuaribasChannel } from "./models/GBModel" +import { IGBCoreService} from 'botlib'; +import { Sequelize } from 'sequelize-typescript'; +import { WelcomeDialog } from './dialogs/WelcomeDialog'; +import { WhoAmIDialog } from './dialogs/WhoAmIDialog'; +import { GuaribasChannel, GuaribasException, GuaribasInstance, GuaribasPackage } from './models/GBModel'; export class GBCorePackage implements IGBPackage { - sysPackages: IGBPackage[] = null - public static CurrentEngineName = "guaribas-1.0.0"; - - loadPackage(core: IGBCoreService, sequelize: Sequelize): void { + public static CurrentEngineName = 'guaribas-1.0.0'; + public sysPackages: IGBPackage[] = null; + + public loadPackage(core: IGBCoreService, sequelize: Sequelize): void { core.sequelize.addModels([ GuaribasInstance, GuaribasPackage, GuaribasChannel, - GuaribasException, - ]) + GuaribasException + ]); } - unloadPackage(core: IGBCoreService): void { - + public unloadPackage(core: IGBCoreService): void { + } - loadBot(min: GBMinInstance): void { - WelcomeDialog.setup(min.bot, min) - WhoAmIDialog.setup(min.bot, min) + public loadBot(min: GBMinInstance): void { + WelcomeDialog.setup(min.bot, min); + WhoAmIDialog.setup(min.bot, min); } - unloadBot(min: GBMinInstance): void { - + public unloadBot(min: GBMinInstance): void { + } - onNewSession(min: GBMinInstance, step: any): void { - + public onNewSession(min: GBMinInstance, step: any): void { + } } diff --git a/packages/core.gbapp/models/GBModel.ts b/packages/core.gbapp/models/GBModel.ts index 0c6c8f09..ca0bf05b 100644 --- a/packages/core.gbapp/models/GBModel.ts +++ b/packages/core.gbapp/models/GBModel.ts @@ -36,21 +36,20 @@ 'use strict'; - import { - Table, - Column, - Model, + AutoIncrement, BelongsTo, - ForeignKey, + Column, CreatedAt, - UpdatedAt, DataType, + ForeignKey, + Model, PrimaryKey, - AutoIncrement -} from "sequelize-typescript"; + Table, + UpdatedAt +} from 'sequelize-typescript'; -import { IGBInstance } from "botlib"; +import { IGBInstance } from 'botlib'; @Table export class GuaribasInstance extends Model @@ -58,185 +57,185 @@ export class GuaribasInstance extends Model @PrimaryKey @AutoIncrement @Column - instanceId: number; + public instanceId: number; @Column - botEndpoint: string; + public botEndpoint: string; @Column - whoAmIVideo: string; + public whoAmIVideo: string; @Column - botId: string; + public botId: string; @Column - title: string; + public title: string; @Column - description: string; + public description: string; @Column - version: string; + public version: string; @Column - enabledAdmin: boolean; + public enabledAdmin: boolean; /* Services section on bot.json */ @Column - engineName: string; + public engineName: string; @Column - marketplaceId: string; + public marketplaceId: string; @Column - textAnalyticsKey: string; + public textAnalyticsKey: string; @Column - textAnalyticsEndpoint: string; + public textAnalyticsEndpoint: string; @Column - marketplacePassword: string; + public marketplacePassword: string; @Column - webchatKey: string; + public webchatKey: string; @Column - authenticatorTenant: string; + public authenticatorTenant: string; @Column - authenticatorAuthorityHostUrl: string; + public authenticatorAuthorityHostUrl: string; @Column - authenticatorClientId: string; + public authenticatorClientId: string; @Column - authenticatorClientSecret: string; + public authenticatorClientSecret: string; @Column - cloudSubscriptionId: string; - - @Column - cloudUsername: string; + public cloudSubscriptionId: string; @Column - cloudPassword: string; + public cloudUsername: string; @Column - cloudLocation: string; + public cloudPassword: string; @Column - whatsappBotKey: string; + public cloudLocation: string; @Column - whatsappServiceKey: string; + public whatsappBotKey: string; @Column - whatsappServiceNumber: string; + public whatsappServiceKey: string; @Column - whatsappServiceUrl: string; + public whatsappServiceNumber: string; @Column - whatsappServiceWebhookUrl: string; + public whatsappServiceUrl: string; @Column - smsKey: string; + public whatsappServiceWebhookUrl: string; @Column - smsSecret: string; + public smsKey: string; @Column - smsServiceNumber: string; + public smsSecret: string; @Column - speechKey: string; + public smsServiceNumber: string; @Column - speechKeyEndpoint: string; + public speechKey: string; @Column - spellcheckerKey: string; + public speechKeyEndpoint: string; @Column - spellcheckerEndpoint: string; + public spellcheckerKey: string; @Column - theme: string; + public spellcheckerEndpoint: string; @Column - ui: string; + public theme: string; @Column - kb: string; + public ui: string; @Column - nlpAppId: string; + public kb: string; @Column - nlpKey: string; + public nlpAppId: string; + + @Column + public nlpKey: string; @Column @Column({ type: DataType.STRING(512) }) - nlpEndpoint: string; + public nlpEndpoint: string; @Column - nlpAuthoringKey: string; - - @Column - deploymentPaths: string; + public nlpAuthoringKey: string; @Column - searchHost: string; + public deploymentPaths: string; @Column - searchKey: string; + public searchHost: string; @Column - searchIndex: string; + public searchKey: string; @Column - searchIndexer: string; + public searchIndex: string; @Column - storageUsername: string; + public searchIndexer: string; @Column - storagePassword: string; + public storageUsername: string; @Column - storageName: string; + public storagePassword: string; @Column - storageServer: string; + public storageName: string; @Column - storageDialect: string; + public storageServer: string; @Column - storagePath: string; + public storageDialect: string; @Column - adminPass: string; + public storagePath: string; + + @Column + public adminPass: string; /* Settings section of bot.json */ @Column(DataType.FLOAT) - nlpVsSearch: number; + public nlpVsSearch: number; @Column(DataType.FLOAT) - searchScore: number; + public searchScore: number; @Column(DataType.FLOAT) - nlpScore: number; + public nlpScore: number; @Column @CreatedAt - createdAt: Date; + public createdAt: Date; @Column @UpdatedAt - updatedAt: Date; + public updatedAt: Date; } @Table @@ -244,25 +243,25 @@ export class GuaribasPackage extends Model { @PrimaryKey @AutoIncrement @Column - packageId: number; + public packageId: number; @Column - packageName: string; + public packageName: string; @ForeignKey(() => GuaribasInstance) @Column - instanceId: number; + public instanceId: number; @BelongsTo(() => GuaribasInstance) - instance: GuaribasInstance; + public instance: GuaribasInstance; @Column @CreatedAt - createdAt: Date; + public createdAt: Date; @Column @UpdatedAt - updatedAt: Date; + public updatedAt: Date; } @Table @@ -270,18 +269,18 @@ export class GuaribasChannel extends Model { @PrimaryKey @AutoIncrement @Column - channelId: number; + public channelId: number; @Column - title: string; + public title: string; @Column @CreatedAt - createdAt: Date; + public createdAt: Date; @Column @UpdatedAt - updatedAt: Date; + public updatedAt: Date; } @Table @@ -289,23 +288,23 @@ export class GuaribasException extends Model { @PrimaryKey @AutoIncrement @Column - exceptionId: number; + public exceptionId: number; @Column - message: string; + public message: string; @ForeignKey(() => GuaribasInstance) @Column - instanceId: number; + public instanceId: number; @BelongsTo(() => GuaribasInstance) - instance: GuaribasInstance; + public instance: GuaribasInstance; @Column @CreatedAt - createdAt: Date; + public createdAt: Date; @Column @UpdatedAt - updatedAt: Date; + public updatedAt: Date; } diff --git a/packages/core.gbapp/services/GBConfigService.ts b/packages/core.gbapp/services/GBConfigService.ts index 2bdc308c..60160e01 100644 --- a/packages/core.gbapp/services/GBConfigService.ts +++ b/packages/core.gbapp/services/GBConfigService.ts @@ -30,20 +30,20 @@ | | \*****************************************************************************/ -const logger = require("../../../src/logger"); -import * as fs from "fs"; +const logger = require('../../../src/logger'); +import * as fs from 'fs'; /** * @fileoverview General Bots server core. */ -"use strict"; +'use strict'; export class GBConfigService { - static init(): any { + public static init(): any { try { - require("dotenv-extended").load({ - path: ".env", + require('dotenv-extended').load({ + path: '.env', errorOnMissing: true, errorOnExtra: false, overrideProcessEnv: true @@ -54,52 +54,52 @@ export class GBConfigService { } } - static get(key: string): string | undefined { + public static get(key: string): string | undefined { let value = GBConfigService.tryGet(key); if (!value) { switch (key) { - case "CLOUD_USERNAME": + case 'CLOUD_USERNAME': value = undefined; break; - case "BOT_ID": + case 'BOT_ID': value = undefined; break; - case "CLOUD_PASSWORD": + case 'CLOUD_PASSWORD': value = undefined; break; - case "CLOUD_SUBSCRIPTIONID": + case 'CLOUD_SUBSCRIPTIONID': value = undefined; break; - case "CLOUD_LOCATION": + case 'CLOUD_LOCATION': value = undefined; break; - case "NLP_AUTHORING_KEY": + case 'NLP_AUTHORING_KEY': value = undefined; break; - case "STORAGE_DIALECT": + case 'STORAGE_DIALECT': value = undefined; break; - case "STORAGE_STORAGE": - value = "./guaribas.sqlite"; + case 'STORAGE_STORAGE': + value = './guaribas.sqlite'; break; - case "ADDITIONAL_DEPLOY_PATH": + case 'ADDITIONAL_DEPLOY_PATH': value = undefined; break; - case "STORAGE_SYNC": - value = "false"; + case 'STORAGE_SYNC': + value = 'false'; break; - case "STORAGE_SYNC_ALTER": - value = "false"; + case 'STORAGE_SYNC_ALTER': + value = 'false'; break; - case "STORAGE_SYNC_FORCE": - value = "false"; + case 'STORAGE_SYNC_FORCE': + value = 'false'; break; - case "STORAGE_LOGGING": - value = "false"; + case 'STORAGE_LOGGING': + value = 'false'; break; - case "STORAGE_ENCRYPT": - value = "true"; + case 'STORAGE_ENCRYPT': + value = 'true'; break; default: logger.warn(`Invalid key on .env file: '${key}'`); @@ -110,7 +110,7 @@ export class GBConfigService { } public static tryGet(key: string) { - let value = process.env["container:" + key]; + let value = process.env['container:' + key]; if (!value) { value = process.env[key]; } diff --git a/packages/core.gbapp/services/GBConversationalService.ts b/packages/core.gbapp/services/GBConversationalService.ts index c50ce2c2..0eda2815 100644 --- a/packages/core.gbapp/services/GBConversationalService.ts +++ b/packages/core.gbapp/services/GBConversationalService.ts @@ -36,17 +36,17 @@ 'use strict'; -const logger = require("../../../src/logger"); +const logger = require('../../../src/logger'); -import { GBCoreService } from "./GBCoreService"; -import { IGBConversationalService } from "botlib"; -import { GBMinInstance } from "botlib"; -import { LuisRecognizer } from "botbuilder-ai"; -import { MessageFactory } from "botbuilder"; -import { Messages } from "../strings"; -import { AzureText } from "pragmatismo-io-framework"; -import { any } from "bluebird"; -const Nexmo = require("nexmo"); +import { any } from 'bluebird'; +import { MessageFactory } from 'botbuilder'; +import { LuisRecognizer } from 'botbuilder-ai'; +import { IGBConversationalService } from 'botlib'; +import { GBMinInstance } from 'botlib'; +import { AzureText } from 'pragmatismo-io-framework'; +import { Messages } from '../strings'; +import { GBCoreService } from './GBCoreService'; +const Nexmo = require('nexmo'); export interface LanguagePickerSettings { defaultLocale?: string; @@ -54,27 +54,27 @@ export interface LanguagePickerSettings { } export class GBConversationalService implements IGBConversationalService { - coreService: GBCoreService; + public coreService: GBCoreService; constructor(coreService: GBCoreService) { this.coreService = coreService; } - getCurrentLanguage(step: any) { + public getCurrentLanguage(step: any) { return step.context.activity.locale; } - async sendEvent(step: any, name: string, value: any): Promise { - if (step.context.activity.channelId === "webchat") { - const msg = MessageFactory.text(""); + public async sendEvent(step: any, name: string, value: any): Promise { + if (step.context.activity.channelId === 'webchat') { + const msg = MessageFactory.text(''); msg.value = value; - msg.type = "event"; + msg.type = 'event'; msg.name = name; return step.context.sendActivity(msg); } } - async sendSms( + public async sendSms( min: GBMinInstance, mobile: string, text: string @@ -99,7 +99,7 @@ export class GBConversationalService implements IGBConversationalService { }); } - async routeNLP(step: any, min: GBMinInstance, text: string): Promise { + public async routeNLP(step: any, min: GBMinInstance, text: string): Promise { // Invokes LUIS. const model = new LuisRecognizer({ @@ -112,39 +112,38 @@ export class GBConversationalService implements IGBConversationalService { try { nlp = await model.recognize(step.context); } catch (error) { - if (error.statusCode == 404){ - logger.warn ('NLP application still not publish and there are no other options for answering.') + if (error.statusCode == 404) { + logger.warn ('NLP application still not publish and there are no other options for answering.'); return Promise.resolve(false); - } - else{ - let msg = `Error calling NLP server, check if you have a published model and assigned keys on the service. Error: ${ - error.statusCode ? error.statusCode : "" + } else { + const msg = `Error calling NLP server, check if you have a published model and assigned keys on the service. Error: ${ + error.statusCode ? error.statusCode : '' } ${error.message}`; - return Promise.reject(new Error(msg));} + return Promise.reject(new Error(msg)); } } // Resolves intents returned from LUIS. - let topIntent = LuisRecognizer.topIntent(nlp); + const topIntent = LuisRecognizer.topIntent(nlp); if (topIntent) { - var intent = topIntent; - var entity = + const intent = topIntent; + const entity = nlp.entities && nlp.entities.length > 0 ? nlp.entities[0].entity.toUpperCase() : null; - if (intent === "None") { + if (intent === 'None') { return Promise.resolve(false); } - logger.info("NLP called:" + intent + ", " + entity); + logger.info('NLP called:' + intent + ', ' + entity); try { - await step.replace("/" + intent, nlp.entities); + await step.replace('/' + intent, nlp.entities); return Promise.resolve(true); } catch (error) { - let msg = `Error finding dialog associated to NLP event: ${intent}: ${ + const msg = `Error finding dialog associated to NLP event: ${intent}: ${ error.message }`; return Promise.reject(new Error(msg)); @@ -153,20 +152,20 @@ export class GBConversationalService implements IGBConversationalService { return Promise.resolve(false); } - async checkLanguage(step, min, text) { - let locale = await AzureText.getLocale( + public async checkLanguage(step, min, text) { + const locale = await AzureText.getLocale( min.instance.textAnalyticsKey, min.instance.textAnalyticsEndpoint, text ); - if (locale != step.context.activity.locale.split("-")[0]) { + if (locale != step.context.activity.locale.split('-')[0]) { switch (locale) { - case "pt": - step.context.activity.locale = "pt-BR"; + case 'pt': + step.context.activity.locale = 'pt-BR'; await step.context.sendActivity(Messages[locale].changing_language); break; - case "en": - step.context.activity.locale = "en-US"; + case 'en': + step.context.activity.locale = 'en-US'; await step.context.sendActivity(Messages[locale].changing_language); break; default: diff --git a/packages/core.gbapp/services/GBCoreService.ts b/packages/core.gbapp/services/GBCoreService.ts index 1dde014d..6043c892 100644 --- a/packages/core.gbapp/services/GBCoreService.ts +++ b/packages/core.gbapp/services/GBCoreService.ts @@ -70,7 +70,7 @@ export class GBCoreService implements IGBCoreService { private createTableQuery: ( tableName: string, attributes: any, - options: any, + options: any ) => string; /** @@ -136,15 +136,15 @@ export class GBCoreService implements IGBCoreService { dialect: this.dialect, storage: storage, dialectOptions: { - encrypt: encrypt, + encrypt: encrypt }, pool: { max: 32, min: 8, idle: 40000, evict: 40000, - acquire: 40000, - }, + acquire: 40000 + } }); if (this.dialect === 'mssql') { @@ -153,7 +153,7 @@ export class GBCoreService implements IGBCoreService { this.queryGenerator.createTableQuery = ( tableName, attributes, - options, + options ) => this.createTableQueryOverride(tableName, attributes, options); this.changeColumnQuery = this.queryGenerator.changeColumnQuery; this.queryGenerator.changeColumnQuery = (tableName, attributes) => @@ -163,7 +163,7 @@ export class GBCoreService implements IGBCoreService { } catch (error) { reject(error); } - }, + } ); } @@ -174,7 +174,7 @@ export class GBCoreService implements IGBCoreService { logger.info('Syncing database...'); return this.sequelize.sync({ alter: alter, - force: force, + force: force }); } else { const msg = 'Database synchronization is disabled.'; @@ -257,7 +257,7 @@ export class GBCoreService implements IGBCoreService { let sql: string = this.createTableQuery.apply(this.queryGenerator, [ tableName, attributes, - options, + options ]); const re1 = /CREATE\s+TABLE\s+\[([^\]]*)\]/; const matches = re1.exec(sql); @@ -268,7 +268,7 @@ export class GBCoreService implements IGBCoreService { re2, (match: string, ...args: any[]): string => { return 'CONSTRAINT [' + table + '_pk] ' + match; - }, + } ); const re3 = /FOREIGN\s+KEY\s+\((\[[^\]]*\](?:,\s*\[[^\]]*\])*)\)/g; const re4 = /\[([^\]]*)\]/g; @@ -283,7 +283,7 @@ export class GBCoreService implements IGBCoreService { matches = re4.exec(fkcols); } return 'CONSTRAINT [' + fkname + '_fk] FOREIGN KEY (' + fkcols + ')'; - }, + } ); } return sql; @@ -300,7 +300,7 @@ export class GBCoreService implements IGBCoreService { private changeColumnQueryOverride(tableName, attributes): string { let sql: string = this.changeColumnQuery.apply(this.queryGenerator, [ tableName, - attributes, + attributes ]); const re1 = /ALTER\s+TABLE\s+\[([^\]]*)\]/; const matches = re1.exec(sql); @@ -326,7 +326,7 @@ export class GBCoreService implements IGBCoreService { fkcols + ')' ); - }, + } ); } return sql; diff --git a/packages/core.gbapp/services/GBDeployer.ts b/packages/core.gbapp/services/GBDeployer.ts index d68452ed..1b334c49 100644 --- a/packages/core.gbapp/services/GBDeployer.ts +++ b/packages/core.gbapp/services/GBDeployer.ts @@ -36,35 +36,45 @@ 'use strict'; -const logger = require("../../../src/logger"); -const Path = require("path"); -const UrlJoin = require("url-join"); -const Fs = require("fs"); -const WaitUntil = require("wait-until"); -const express = require("express"); +const logger = require('../../../src/logger'); +const Path = require('path'); +const UrlJoin = require('url-join'); +const Fs = require('fs'); +const WaitUntil = require('wait-until'); +const express = require('express'); -import { KBService } from "./../../kb.gbapp/services/KBService"; -import { GBImporter } from "./GBImporter"; -import { IGBCoreService, IGBInstance } from "botlib"; -import { GBConfigService } from "./GBConfigService"; -import { GBError } from "botlib"; -import { GuaribasPackage, GuaribasInstance } from "../models/GBModel"; -import { IGBPackage } from "botlib"; -import { AzureSearch } from "pragmatismo-io-framework"; -import { AzureDeployerService } from "../../azuredeployer.gbapp/services/AzureDeployerService"; +import { IGBCoreService, IGBInstance } from 'botlib'; +import { GBError } from 'botlib'; +import { IGBPackage } from 'botlib'; +import { AzureSearch } from 'pragmatismo-io-framework'; +import { AzureDeployerService } from '../../azuredeployer.gbapp/services/AzureDeployerService'; +import { GuaribasInstance, GuaribasPackage } from '../models/GBModel'; +import { KBService } from './../../kb.gbapp/services/KBService'; +import { GBConfigService } from './GBConfigService'; +import { GBImporter } from './GBImporter'; /** Deployer service for bots, themes, ai and more. */ export class GBDeployer { - core: IGBCoreService; - importer: GBImporter; - workDir: string = "./work"; - static deployFolder = "packages"; + public static deployFolder = 'packages'; + public core: IGBCoreService; + public importer: GBImporter; + public workDir: string = './work'; constructor(core: IGBCoreService, importer: GBImporter) { this.core = core; this.importer = importer; } + public static getConnectionStringFromInstance(instance: GuaribasInstance) { + return `Server=tcp:${ + instance.storageServer + }.database.windows.net,1433;Database=${instance.storageName};User ID=${ + instance.storageUsername + };Password=${ + instance.storagePassword + };Trusted_Connection=False;Encrypt=True;Connection Timeout=30;`; + } + /** * * Performs package deployment in all .gbai or default. @@ -73,18 +83,18 @@ export class GBDeployer { public deployPackages( core: IGBCoreService, server: any, - appPackages: Array + appPackages: IGBPackage[] ) { - let _this = this; + const _this = this; return new Promise((resolve: any, reject: any): any => { let totalPackages = 0; - let additionalPath = GBConfigService.get("ADDITIONAL_DEPLOY_PATH"); + const additionalPath = GBConfigService.get('ADDITIONAL_DEPLOY_PATH'); let paths = [GBDeployer.deployFolder]; if (additionalPath) { - paths = paths.concat(additionalPath.toLowerCase().split(";")); + paths = paths.concat(additionalPath.toLowerCase().split(';')); } - let botPackages = new Array(); - let gbappPackages = new Array(); + const botPackages = new Array(); + const gbappPackages = new Array(); let generalPackages = new Array(); function doIt(path) { @@ -94,14 +104,14 @@ export class GBDeployer { .map(name => Path.join(source, name)) .filter(isDirectory); - let dirs = getDirectories(path); + const dirs = getDirectories(path); dirs.forEach(element => { - if (element.startsWith(".")) { + if (element.startsWith('.')) { logger.info(`Ignoring ${element}...`); } else { - if (element.endsWith(".gbot")) { + if (element.endsWith('.gbot')) { botPackages.push(element); - } else if (element.endsWith(".gbapp")) { + } else if (element.endsWith('.gbapp')) { gbappPackages.push(element); } else { generalPackages.push(element); @@ -124,11 +134,11 @@ export class GBDeployer { gbappPackages.forEach(e => { // Skips .gbapp inside deploy folder. - if (!e.startsWith("packages")) { + if (!e.startsWith('packages')) { logger.info(`Deploying app: ${e}...`); import(e) .then(m => { - let p = new m.Package(); + const p = new m.Package(); p.loadPackage(core, core.sequelize); appPackages.push(p); logger.info(`App (.gbapp) deployed: ${e}.`); @@ -169,40 +179,40 @@ export class GBDeployer { /** Then all remaining generalPackages are loaded. */ - generalPackages = generalPackages.filter(p => !p.endsWith(".git")); + generalPackages = generalPackages.filter(p => !p.endsWith('.git')); generalPackages.forEach(filename => { - let filenameOnly = Path.basename(filename); + const filenameOnly = Path.basename(filename); logger.info(`Deploying package: ${filename}...`); /** Handles apps for general bots - .gbapp must stay out of deploy folder. */ if ( - Path.extname(filename) === ".gbapp" || - Path.extname(filename) === ".gblib" + Path.extname(filename) === '.gbapp' || + Path.extname(filename) === '.gblib' ) { /** Themes for bots. */ - } else if (Path.extname(filename) === ".gbtheme") { - server.use("/themes/" + filenameOnly, express.static(filename)); + } else if (Path.extname(filename) === '.gbtheme') { + server.use('/themes/' + filenameOnly, express.static(filename)); logger.info( - `Theme (.gbtheme) assets accessible at: ${"/themes/" + + `Theme (.gbtheme) assets accessible at: ${'/themes/' + filenameOnly}.` ); /** Knowledge base for bots. */ - } else if (Path.extname(filename) === ".gbkb") { + } else if (Path.extname(filename) === '.gbkb') { server.use( - "/kb/" + filenameOnly + "/subjects", - express.static(UrlJoin(filename, "subjects")) + '/kb/' + filenameOnly + '/subjects', + express.static(UrlJoin(filename, 'subjects')) ); logger.info( - `KB (.gbkb) assets accessible at: ${"/kb/" + filenameOnly}.` + `KB (.gbkb) assets accessible at: ${'/kb/' + filenameOnly}.` ); - } else if (Path.extname(filename) === ".gbui") { + } else if (Path.extname(filename) === '.gbui') { // Already Handled } else { /** Unknown package format. */ - let err = new Error(`Package type not handled: ${filename}.`); + const err = new Error(`Package type not handled: ${filename}.`); reject(err); } totalPackages++; @@ -218,7 +228,7 @@ export class GBDeployer { .done(function(result) { if (botPackages.length === 0) { logger.warn( - "No external packages to load, please use ADDITIONAL_DEPLOY_PATH to point to a .gbai package folder." + 'No external packages to load, please use ADDITIONAL_DEPLOY_PATH to point to a .gbai package folder.' ); } else { logger.info(`Package deployment done.`); @@ -233,17 +243,17 @@ export class GBDeployer { * Deploys a bot to the storage. */ - async deployBot(localPath: string): Promise { - let packageType = Path.extname(localPath); - let packageName = Path.basename(localPath); - let instance = await this.importer.importIfNotExistsBotPackage( + public async deployBot(localPath: string): Promise { + const packageType = Path.extname(localPath); + const packageName = Path.basename(localPath); + const instance = await this.importer.importIfNotExistsBotPackage( packageName, localPath ); return instance; } - async deployPackageToStorage( + public async deployPackageToStorage( instanceId: number, packageName: string ): Promise { @@ -253,7 +263,7 @@ export class GBDeployer { }); } - deployTheme(localPath: string) { + public deployTheme(localPath: string) { // DISABLED: Until completed, "/ui/public". // FsExtra.copy(localPath, this.workDir + packageName) // .then(() => { @@ -265,26 +275,26 @@ export class GBDeployer { // }) } - async deployPackageFromLocalPath(localPath: string) { - let packageType = Path.extname(localPath); + public async deployPackageFromLocalPath(localPath: string) { + const packageType = Path.extname(localPath); switch (packageType) { - case ".gbot": + case '.gbot': return this.deployBot(localPath); - case ".gbtheme": + case '.gbtheme': return this.deployTheme(localPath); // PACKAGE: Put in package logic. - case ".gbkb": - let service = new KBService(this.core.sequelize); + case '.gbkb': + const service = new KBService(this.core.sequelize); return service.deployKb(this.core, this, localPath); - case ".gbui": + case '.gbui': break; default: - var err = GBError.create( + const err = GBError.create( `GuaribasBusinessError: Unknow package type: ${packageType}.` ); Promise.reject(err); @@ -292,30 +302,30 @@ export class GBDeployer { } } - async undeployPackageFromLocalPath(instance: IGBInstance, localPath: string) { - let packageType = Path.extname(localPath); - let packageName = Path.basename(localPath); + public async undeployPackageFromLocalPath(instance: IGBInstance, localPath: string) { + const packageType = Path.extname(localPath); + const packageName = Path.basename(localPath); - let p = await this.getPackageByName(instance.instanceId, packageName); + const p = await this.getPackageByName(instance.instanceId, packageName); switch (packageType) { - case ".gbot": + case '.gbot': // TODO: this.undeployBot(packageName, localPath) break; - case ".gbtheme": + case '.gbtheme': // TODO: this.undeployTheme(packageName, localPath) break; - case ".gbkb": - let service = new KBService(this.core.sequelize); + case '.gbkb': + const service = new KBService(this.core.sequelize); return service.undeployKbFromStorage(instance, this, p.packageId); - case ".gbui": + case '.gbui': break; default: - var err = GBError.create( + const err = GBError.create( `GuaribasBusinessError: Unknown package type: ${packageType}.` ); Promise.reject(err); @@ -323,27 +333,17 @@ export class GBDeployer { } } - public static getConnectionStringFromInstance(instance: GuaribasInstance) { - return `Server=tcp:${ - instance.storageServer - }.database.windows.net,1433;Database=${instance.storageName};User ID=${ - instance.storageUsername - };Password=${ - instance.storagePassword - };Trusted_Connection=False;Encrypt=True;Connection Timeout=30;`; - } - public async rebuildIndex(instance: GuaribasInstance) { - let search = new AzureSearch( + const search = new AzureSearch( instance.searchKey, instance.searchHost, instance.searchIndex, instance.searchIndexer ); - let connectionString = GBDeployer.getConnectionStringFromInstance(instance); + const connectionString = GBDeployer.getConnectionStringFromInstance(instance); - const dsName = "gb"; + const dsName = 'gb'; try { await search.deleteDataSource(dsName); } catch (err) { @@ -356,8 +356,8 @@ export class GBDeployer { await search.createDataSource( dsName, dsName, - "GuaribasQuestion", - "azuresql", + 'GuaribasQuestion', + 'azuresql', connectionString ); @@ -375,11 +375,11 @@ export class GBDeployer { ); } - async getPackageByName( + public async getPackageByName( instanceId: number, packageName: string ): Promise { - var where = { packageName: packageName, instanceId: instanceId }; + const where = { packageName: packageName, instanceId: instanceId }; return GuaribasPackage.findOne({ where: where }); @@ -390,11 +390,11 @@ export class GBDeployer { * Hot deploy processing. * */ - async scanBootPackage() { - const deployFolder = "packages"; - let bootPackage = GBConfigService.get("BOOT_PACKAGE"); + public async scanBootPackage() { + const deployFolder = 'packages'; + const bootPackage = GBConfigService.get('BOOT_PACKAGE'); - if (bootPackage === "none") { + if (bootPackage === 'none') { return Promise.resolve(true); } else { return this.deployPackageFromLocalPath( diff --git a/packages/core.gbapp/services/GBImporter.ts b/packages/core.gbapp/services/GBImporter.ts index e3dbcf92..35c5e11d 100644 --- a/packages/core.gbapp/services/GBImporter.ts +++ b/packages/core.gbapp/services/GBImporter.ts @@ -30,42 +30,41 @@ | | \*****************************************************************************/ - /** * @fileoverview General Bots server core. */ -'use strict' +'use strict'; -const UrlJoin = require("url-join") -import Fs = require("fs") -import Path = require("path") -import { IGBCoreService, IGBInstance } from "botlib" -import { SecService } from "../../security.gblib/services/SecService" -import { GuaribasInstance } from "../models/GBModel" +const UrlJoin = require('url-join'); +import { IGBCoreService, IGBInstance } from 'botlib'; +import fs = require('fs'); +import path = require('path'); +import { SecService } from '../../security.gblib/services/SecService'; +import { GuaribasInstance } from '../models/GBModel'; export class GBImporter { - core: IGBCoreService + public core: IGBCoreService; constructor(core: IGBCoreService) { - this.core = core + this.core = core; } - async importIfNotExistsBotPackage( + public async importIfNotExistsBotPackage( packageName: string, localPath: string) { - let packageJson = JSON.parse( - Fs.readFileSync(UrlJoin(localPath, "package.json"), "utf8") - ) + const packageJson = JSON.parse( + Fs.readFileSync(UrlJoin(localPath, 'package.json'), 'utf8') + ); - let botId = packageJson.botId + const botId = packageJson.botId; - let instance = await this.core.loadInstance(botId) + const instance = await this.core.loadInstance(botId); if (instance) { - return Promise.resolve(instance) + return Promise.resolve(instance); } else { - return this.createInstanceInternal(packageName, localPath, packageJson) + return this.createInstanceInternal(packageName, localPath, packageJson); } } @@ -75,20 +74,20 @@ export class GBImporter { packageJson: any ) { const settings = JSON.parse( - Fs.readFileSync(UrlJoin(localPath, "settings.json"), "utf8") - ) + Fs.readFileSync(UrlJoin(localPath, 'settings.json'), 'utf8') + ); const servicesJson = JSON.parse( - Fs.readFileSync(UrlJoin(localPath, "services.json"), "utf8") - ) + Fs.readFileSync(UrlJoin(localPath, 'services.json'), 'utf8') + ); - packageJson = Object.assign(packageJson, settings, servicesJson) + packageJson = {...packageJson, ...settings, ...servicesJson}; GuaribasInstance.create(packageJson).then((instance: IGBInstance) => { - let service = new SecService() + const service = new SecService(); // TODO: service.importSecurityFile(localPath, instance) - Promise.resolve(instance) - }) + Promise.resolve(instance); + }); } -} \ No newline at end of file +} diff --git a/packages/core.gbapp/services/GBMinService.ts b/packages/core.gbapp/services/GBMinService.ts index 92b6701a..5ee94cde 100644 --- a/packages/core.gbapp/services/GBMinService.ts +++ b/packages/core.gbapp/services/GBMinService.ts @@ -36,48 +36,48 @@ 'use strict'; -const { DialogSet, TextPrompt } = require("botbuilder-dialogs"); -const UrlJoin = require("url-join"); -const express = require("express"); -const logger = require("../../../src/logger"); -const request = require("request-promise-native"); -var AuthenticationContext = require("adal-node").AuthenticationContext; +const { DialogSet, TextPrompt } = require('botbuilder-dialogs'); +const UrlJoin = require('url-join'); +const express = require('express'); +const logger = require('../../../src/logger'); +const request = require('request-promise-native'); +const AuthenticationContext = require('adal-node').AuthenticationContext; import { + AutoSaveStateMiddleware, BotFrameworkAdapter, BotStateSet, ConversationState, MemoryStorage, - UserState, - AutoSaveStateMiddleware -} from "botbuilder"; + UserState +} from 'botbuilder'; -import { GBMinInstance, IGBPackage } from "botlib"; -import { GBAnalyticsPackage } from "../../analytics.gblib"; -import { GBCorePackage } from "../../core.gbapp"; -import { GBKBPackage } from "../../kb.gbapp"; -import { GBDeployer } from "./GBDeployer"; -import { GBSecurityPackage } from "../../security.gblib"; -import { GBAdminPackage } from "./../../admin.gbapp/index"; -import { GBCustomerSatisfactionPackage } from "../../customer-satisfaction.gbapp"; -import { GBWhatsappPackage } from "../../whatsapp.gblib"; +import { GBMinInstance, IGBPackage } from 'botlib'; import { IGBAdminService, - IGBCoreService, - IGBConversationalService -} from "botlib"; -import { GuaribasInstance } from "../models/GBModel"; -import { Messages } from "../strings"; + IGBConversationalService, + IGBCoreService +} from 'botlib'; +import { GBAnalyticsPackage } from '../../analytics.gblib'; +import { GBCorePackage } from '../../core.gbapp'; +import { GBCustomerSatisfactionPackage } from '../../customer-satisfaction.gbapp'; +import { GBKBPackage } from '../../kb.gbapp'; +import { GBSecurityPackage } from '../../security.gblib'; +import { GBWhatsappPackage } from '../../whatsapp.gblib'; +import { GuaribasInstance } from '../models/GBModel'; +import { Messages } from '../strings'; +import { GBAdminPackage } from './../../admin.gbapp/index'; +import { GBDeployer } from './GBDeployer'; /** Minimal service layer for a bot. */ export class GBMinService { - core: IGBCoreService; - conversationalService: IGBConversationalService; - adminService: IGBAdminService; - deployer: GBDeployer; + public core: IGBCoreService; + public conversationalService: IGBConversationalService; + public adminService: IGBAdminService; + public deployer: GBDeployer; - corePackage = "core.gbai"; + public corePackage = 'core.gbai'; /** * Static initialization of minimal instance. @@ -107,40 +107,40 @@ export class GBMinService { * * */ - async buildMin( + public async buildMin( server: any, - appPackages: Array, + appPackages: IGBPackage[], instances: GuaribasInstance[] ): Promise { // Serves default UI on root address '/'. - let uiPackage = "default.gbui"; + const uiPackage = 'default.gbui'; server.use( - "/", - express.static(UrlJoin(GBDeployer.deployFolder, uiPackage, "build")) + '/', + express.static(UrlJoin(GBDeployer.deployFolder, uiPackage, 'build')) ); Promise.all( instances.map(async instance => { // Gets the authorization key for each instance from Bot Service. - let webchatToken = await this.getWebchatToken(instance); + const webchatToken = await this.getWebchatToken(instance); // Serves the bot information object via HTTP so clients can get // instance information stored on server. - server.get("/instances/:botId", (req, res) => { + server.get('/instances/:botId', (req, res) => { (async () => { // Returns the instance object to clients requesting bot info. - let botId = req.params.botId; - let instance = await this.core.loadInstance(botId); + const botId = req.params.botId; + const instance = await this.core.loadInstance(botId); if (instance) { - let speechToken = await this.getSTSToken(instance); + const speechToken = await this.getSTSToken(instance); let theme = instance.theme; if (!theme) { - theme = "default.gbtheme"; + theme = 'default.gbtheme'; } res.send( @@ -156,7 +156,7 @@ export class GBMinService { }) ); } else { - let error = `Instance not found: ${botId}.`; + const error = `Instance not found: ${botId}.`; res.sendStatus(error); logger.error(error); } @@ -165,7 +165,7 @@ export class GBMinService { // Build bot adapter. - var { min, adapter, conversationState } = await this.buildBotAdapter( + const { min, adapter, conversationState } = await this.buildBotAdapter( instance ); @@ -175,7 +175,7 @@ export class GBMinService { // Serves individual URL for each bot conversational interface... - let url = `/api/messages/${instance.botId}`; + const url = `/api/messages/${instance.botId}`; server.post(url, async (req, res) => { return this.receiver( adapter, @@ -193,14 +193,14 @@ export class GBMinService { // Serves individual URL for each bot user interface. - let uiUrl = `/${instance.botId}`; + const uiUrl = `/${instance.botId}`; server.use( uiUrl, - express.static(UrlJoin(GBDeployer.deployFolder, uiPackage, "build")) + express.static(UrlJoin(GBDeployer.deployFolder, uiPackage, 'build')) ); logger.info(`Bot UI ${uiPackage} accessible at: ${uiUrl}.`); - let state = `${instance.instanceId}${Math.floor( + const state = `${instance.instanceId}${Math.floor( Math.random() * 1000000000 )}`; @@ -211,7 +211,7 @@ export class GBMinService { let authorizationUrl = UrlJoin( min.instance.authenticatorAuthorityHostUrl, min.instance.authenticatorTenant, - "/oauth2/authorize" + '/oauth2/authorize' ); authorizationUrl = `${authorizationUrl}?response_type=code&client_id=${ min.instance.authenticatorClientId @@ -227,57 +227,57 @@ export class GBMinService { // access token that can be used to access the user owned resource. server.get(`/${min.instance.botId}/token`, async (req, res) => { - let state = await min.adminService.getValue( + const state = await min.adminService.getValue( min.instance.instanceId, - "AntiCSRFAttackState" + 'AntiCSRFAttackState' ); if (req.query.state != state) { - let msg = - "WARNING: state field was not provided as anti-CSRF token"; + const msg = + 'WARNING: state field was not provided as anti-CSRF token'; logger.error(msg); throw new Error(msg); } - var authenticationContext = new AuthenticationContext( + const authenticationContext = new AuthenticationContext( UrlJoin( min.instance.authenticatorAuthorityHostUrl, min.instance.authenticatorTenant ) ); - let resource = "https://graph.microsoft.com"; + const resource = 'https://graph.microsoft.com'; authenticationContext.acquireTokenWithAuthorizationCode( req.query.code, - UrlJoin(instance.botEndpoint, min.instance.botId, "/token"), + UrlJoin(instance.botEndpoint, min.instance.botId, '/token'), resource, instance.authenticatorClientId, instance.authenticatorClientSecret, async (err, token) => { if (err) { - let msg = `Error acquiring token: ${err}`; + const msg = `Error acquiring token: ${err}`; logger.error(msg); res.send(msg); } else { await this.adminService.setValue( instance.instanceId, - "refreshToken", + 'refreshToken', token.refreshToken ); await this.adminService.setValue( instance.instanceId, - "accessToken", + 'accessToken', token.accessToken ); await this.adminService.setValue( instance.instanceId, - "expiresOn", + 'expiresOn', token.expiresOn.toString() ); await this.adminService.setValue( instance.instanceId, - "AntiCSRFAttackState", + 'AntiCSRFAttackState', null ); @@ -305,8 +305,57 @@ export class GBMinService { ); } + /** + * Get Webchat key from Bot Service. + * + * @param instance The Bot instance. + * + */ + public async getWebchatToken(instance: any) { + const options = { + url: 'https://directline.botframework.com/v3/directline/tokens/generate', + method: 'POST', + headers: { + Authorization: `Bearer ${instance.webchatKey}` + } + }; + + try { + const json = await request(options); + return Promise.resolve(JSON.parse(json)); + } catch (error) { + const msg = `[botId:${instance.botId}] Error calling Direct Line client, verify Bot endpoint on the cloud. Error is: ${error}.`; + return Promise.reject(new Error(msg)); + } + } + + /** + * Gets a Speech to Text / Text to Speech token from the provider. + * + * @param instance The general bot instance. + * + */ + public async getSTSToken(instance: any) { + // TODO: Make dynamic: https://CHANGE.api.cognitive.microsoft.com/sts/v1.0 + + const options = { + url: 'https://westus.api.cognitive.microsoft.com/sts/v1.0/issueToken', + method: 'POST', + headers: { + 'Ocp-Apim-Subscription-Key': instance.speechKey + } + }; + + try { + return await request(options); + } catch (error) { + const msg = `Error calling Speech to Text client. Error is: ${error}.`; + return Promise.reject(new Error(msg)); + } + } + private async buildBotAdapter(instance: any) { - let adapter = new BotFrameworkAdapter({ + const adapter = new BotFrameworkAdapter({ appId: instance.marketplaceId, appPassword: instance.marketplacePassword }); @@ -318,7 +367,7 @@ export class GBMinService { // The minimal bot is built here. - let min = new GBMinInstance(); + const min = new GBMinInstance(); min.botId = instance.botId; min.bot = adapter; min.userState = userState; @@ -326,16 +375,16 @@ export class GBMinService { min.conversationalService = this.conversationalService; min.adminService = this.adminService; min.instance = await this.core.loadInstance(min.botId); - min.userProfile = conversationState.createProperty("userProfile"); - const dialogState = conversationState.createProperty("dialogState"); + min.userProfile = conversationState.createProperty('userProfile'); + const dialogState = conversationState.createProperty('dialogState'); min.dialogs = new DialogSet(dialogState); - min.dialogs.add(new TextPrompt("textPrompt")); + min.dialogs.add(new TextPrompt('textPrompt')); return { min, adapter, conversationState }; } private invokeLoadBot(appPackages: any[], min: any, server: any) { - let sysPackages = new Array(); + const sysPackages = new Array(); // NOTE: A semicolon is necessary before this line. [ GBCorePackage, @@ -346,21 +395,21 @@ export class GBMinService { GBCustomerSatisfactionPackage, GBWhatsappPackage ].forEach(sysPackage => { - let p = Object.create(sysPackage.prototype) as IGBPackage; + const p = Object.create(sysPackage.prototype) as IGBPackage; p.loadBot(min); sysPackages.push(p); - if (sysPackage.name === "GBWhatsappPackage") { - let url = "/instances/:botId/whatsapp"; + if (sysPackage.name === 'GBWhatsappPackage') { + const url = '/instances/:botId/whatsapp'; server.post(url, (req, res) => { - p["channel"].received(req, res); + p.channel.received(req, res); }); } - }, this); + }, this); appPackages.forEach(e => { e.sysPackages = sysPackages; e.loadBot(min); - }, this); + }, this); } /** @@ -378,16 +427,16 @@ export class GBMinService { return adapter.processActivity(req, res, async context => { const state = conversationState.get(context); const step = await min.dialogs.createContext(context, state); - step.context.activity.locale = "en-US"; // TODO: Make dynamic. + step.context.activity.locale = 'en-US'; // TODO: Make dynamic. try { const user = await min.userProfile.get(context, {}); if (!user.loaded) { - await min.conversationalService.sendEvent(step, "loadInstance", { + await min.conversationalService.sendEvent(step, 'loadInstance', { instanceId: instance.instanceId, botId: instance.botId, - theme: instance.theme?instance.theme:"default.gbtheme" , + theme: instance.theme ? instance.theme : 'default.gbtheme' , secret: instance.webchatKey }); user.loaded = true; @@ -401,32 +450,32 @@ export class GBMinService { }, ${context.activity.channelId}, {context.activity.value})` ); if ( - context.activity.type === "conversationUpdate" && + context.activity.type === 'conversationUpdate' && context.activity.membersAdded.length > 0 ) { - let member = context.activity.membersAdded[0]; - if (member.name === "GeneralBots") { + const member = context.activity.membersAdded[0]; + if (member.name === 'GeneralBots') { logger.info(`Bot added to conversation, starting chat...`); appPackages.forEach(e => { e.onNewSession(min, step); }); // Processes the root dialog. - await step.beginDialog("/"); + await step.beginDialog('/'); } else { logger.info(`Member added to conversation: ${member.name}`); } // Processes messages. - } else if (context.activity.type === "message") { + } else if (context.activity.type === 'message') { // Checks for /admin request. - if (context.activity.text === "admin") { - await step.beginDialog("/admin"); + if (context.activity.text === 'admin') { + await step.beginDialog('/admin'); // Checks for /menu JSON signature. } else if (context.activity.text.startsWith('{"title"')) { - await step.beginDialog("/menu", { + await step.beginDialog('/menu', { data: JSON.parse(context.activity.text) }); @@ -435,102 +484,53 @@ export class GBMinService { if (step.activeDialog) { await step.continueDialog(); } else { - await step.beginDialog("/answer", { + await step.beginDialog('/answer', { query: context.activity.text }); } } // Processes events. - } else if (context.activity.type === "event") { + } else if (context.activity.type === 'event') { // Empties dialog stack before going to the target. await step.endAll(); - if (context.activity.name === "whoAmI") { - await step.beginDialog("/whoAmI"); - } else if (context.activity.name === "showSubjects") { - await step.beginDialog("/menu"); - } else if (context.activity.name === "giveFeedback") { - await step.beginDialog("/feedback", { + if (context.activity.name === 'whoAmI') { + await step.beginDialog('/whoAmI'); + } else if (context.activity.name === 'showSubjects') { + await step.beginDialog('/menu'); + } else if (context.activity.name === 'giveFeedback') { + await step.beginDialog('/feedback', { fromMenu: true }); - } else if (context.activity.name === "showFAQ") { - await step.beginDialog("/faq"); - } else if (context.activity.name === "answerEvent") { - await step.beginDialog("/answerEvent", { + } else if (context.activity.name === 'showFAQ') { + await step.beginDialog('/faq'); + } else if (context.activity.name === 'answerEvent') { + await step.beginDialog('/answerEvent', { questionId: (context.activity as any).data, fromFaq: true }); - } else if (context.activity.name === "quality") { - await step.beginDialog("/quality", { + } else if (context.activity.name === 'quality') { + await step.beginDialog('/quality', { score: (context.activity as any).data }); - } else if (context.activity.name === "updateToken") { - let token = (context.activity as any).data; - await step.beginDialog("/adminUpdateToken", { token: token }); + } else if (context.activity.name === 'updateToken') { + const token = (context.activity as any).data; + await step.beginDialog('/adminUpdateToken', { token: token }); } else { await step.continueDialog(); } } } catch (error) { - let msg = `ERROR: ${error.message} ${error.stack ? error.stack : ""}`; + const msg = `ERROR: ${error.message} ${error.stack ? error.stack : ''}`; logger.error(msg); await step.context.sendActivity( Messages[step.context.activity.locale].very_sorry_about_error ); - await step.beginDialog("/ask", { isReturning: true }); + await step.beginDialog('/ask', { isReturning: true }); } }); } - - /** - * Get Webchat key from Bot Service. - * - * @param instance The Bot instance. - * - */ - async getWebchatToken(instance: any) { - let options = { - url: "https://directline.botframework.com/v3/directline/tokens/generate", - method: "POST", - headers: { - Authorization: `Bearer ${instance.webchatKey}` - } - }; - - try { - let json = await request(options); - return Promise.resolve(JSON.parse(json)); - } catch (error) { - let msg = `[botId:${instance.botId}] Error calling Direct Line client, verify Bot endpoint on the cloud. Error is: ${error}.`; - return Promise.reject(new Error(msg)); - } - } - - /** - * Gets a Speech to Text / Text to Speech token from the provider. - * - * @param instance The general bot instance. - * - */ - async getSTSToken(instance: any) { - // TODO: Make dynamic: https://CHANGE.api.cognitive.microsoft.com/sts/v1.0 - - let options = { - url: "https://westus.api.cognitive.microsoft.com/sts/v1.0/issueToken", - method: "POST", - headers: { - "Ocp-Apim-Subscription-Key": instance.speechKey - } - }; - - try { - return await request(options); - } catch (error) { - let msg = `Error calling Speech to Text client. Error is: ${error}.`; - return Promise.reject(new Error(msg)); - } - } } diff --git a/packages/core.gbapp/strings.ts b/packages/core.gbapp/strings.ts index 1a68c2fe..244d457b 100644 --- a/packages/core.gbapp/strings.ts +++ b/packages/core.gbapp/strings.ts @@ -1,20 +1,20 @@ export const Messages = { - "en-US": { - show_video: "I will show you a video, please wait...", - good_morning: "good morning", - good_evening: "good evening", - good_night: "good night", - hi: (msg ) => `Hello, ${msg}.`, + 'en-US': { + show_video: 'I will show you a video, please wait...', + good_morning: 'good morning', + good_evening: 'good evening', + good_night: 'good night', + hi: (msg) => `Hello, ${msg}.`, very_sorry_about_error: `I'm sorry to inform that there was an error which was recorded to be solved.` }, - "pt-BR": { - show_video: "Vou te mostrar um vídeo. Por favor, aguarde...", - good_morning: "bom dia", - good_evening: "boa tarde", - good_night: "boa noite", - hi: (msg ) => `Oi, ${msg}.`, + 'pt-BR': { + show_video: 'Vou te mostrar um vídeo. Por favor, aguarde...', + good_morning: 'bom dia', + good_evening: 'boa tarde', + good_night: 'boa noite', + hi: (msg) => `Oi, ${msg}.`, very_sorry_about_error: `Lamento, ocorreu um erro que já foi registrado para ser tratado.` } }; diff --git a/packages/core.gbapp/tests/core.test.ts b/packages/core.gbapp/tests/core.test.ts index 8c0195c2..9ec963d8 100644 --- a/packages/core.gbapp/tests/core.test.ts +++ b/packages/core.gbapp/tests/core.test.ts @@ -1,12 +1,12 @@ -import { expect } from 'chai' -import 'mocha' -import {GBImporter} from '../services/GBImporter' +import { expect } from 'chai'; +import 'mocha'; +import {GBImporter} from '../services/GBImporter'; describe('Hello function', () => { - + it('should return empty test', () => { - let service = new GBImporter(null); + const service = new GBImporter(null); //service.importIfNotExistsBotPackage(null, null); const result = 0; expect(result).to.equal(0); diff --git a/packages/customer-satisfaction.gbapp/dialogs/FeedbackDialog.ts b/packages/customer-satisfaction.gbapp/dialogs/FeedbackDialog.ts index e0722dd2..ca62c7fc 100644 --- a/packages/customer-satisfaction.gbapp/dialogs/FeedbackDialog.ts +++ b/packages/customer-satisfaction.gbapp/dialogs/FeedbackDialog.ts @@ -36,13 +36,13 @@ 'use strict'; -import { CSService } from "../services/CSService"; -import { AzureText } from "pragmatismo-io-framework"; -import { GBMinInstance } from "botlib"; -import { IGBDialog } from "botlib"; -import { BotAdapter } from "botbuilder"; -import { Messages } from "../strings"; -import { WaterfallDialog } from "botbuilder-dialogs"; +import { BotAdapter } from 'botbuilder'; +import { WaterfallDialog } from 'botbuilder-dialogs'; +import { GBMinInstance } from 'botlib'; +import { IGBDialog } from 'botlib'; +import { AzureText } from 'pragmatismo-io-framework'; +import { CSService } from '../services/CSService'; +import { Messages } from '../strings'; export class FeedbackDialog extends IGBDialog { /** @@ -51,13 +51,13 @@ export class FeedbackDialog extends IGBDialog { * @param bot The bot adapter. * @param min The minimal bot instance data. */ - static setup(bot: BotAdapter, min: GBMinInstance) { + public static setup(bot: BotAdapter, min: GBMinInstance) { const service = new CSService(); min.dialogs.add( - new WaterfallDialog("/feedbackNumber", [ + new WaterfallDialog('/feedbackNumber', [ async step => { - let locale = step.context.activity.locale; + const locale = step.context.activity.locale; // TODO: Migrate to 4.*+ await step.prompt("choicePrompt", Messages[locale].what_about_me, [ // "1", // "2", @@ -68,8 +68,8 @@ export class FeedbackDialog extends IGBDialog { return await step.next(); }, async step => { - let locale = step.context.activity.locale; - let rate = step.result.entity; + const locale = step.context.activity.locale; + const rate = step.result.entity; const user = await min.userProfile.get(context, {}); await service.updateConversationRate(user.conversation, rate); await step.context.sendActivity(Messages[locale].thanks); @@ -78,19 +78,19 @@ export class FeedbackDialog extends IGBDialog { ]) ); - min.dialogs.add(new WaterfallDialog("/feedback", [ + min.dialogs.add(new WaterfallDialog('/feedback', [ async step => { - let locale = step.context.activity.locale; + const locale = step.context.activity.locale; if (step.result.fromMenu) { await step.context.sendActivity(Messages[locale].about_suggestions); } - await step.prompt("textPrompt", Messages[locale].what_about_service); + await step.prompt('textPrompt', Messages[locale].what_about_service); return await step.next(); }, async step => { - let locale = step.context.activity.locale; - let rate = await AzureText.getSentiment( + const locale = step.context.activity.locale; + const rate = await AzureText.getSentiment( min.instance.textAnalyticsKey, min.instance.textAnalyticsEndpoint, min.conversationalService.getCurrentLanguage(step), @@ -104,7 +104,7 @@ export class FeedbackDialog extends IGBDialog { // TODO: Record. } - await step.replaceDialog("/ask", { isReturning: true }); + await step.replaceDialog('/ask', { isReturning: true }); return await step.next(); } ])); diff --git a/packages/customer-satisfaction.gbapp/dialogs/QualityDialog.ts b/packages/customer-satisfaction.gbapp/dialogs/QualityDialog.ts index 5fce580f..dbfaf596 100644 --- a/packages/customer-satisfaction.gbapp/dialogs/QualityDialog.ts +++ b/packages/customer-satisfaction.gbapp/dialogs/QualityDialog.ts @@ -36,14 +36,14 @@ 'use strict'; -import { IGBDialog } from "botlib"; +import { IGBDialog } from 'botlib'; -import { GBMinInstance } from "botlib"; -import { CSService } from "../services/CSService"; -import { BotAdapter } from "botbuilder"; -import { Messages } from "../strings"; -import { WaterfallDialog } from "botbuilder-dialogs"; -const logger = require("../../../src/logger"); +import { BotAdapter } from 'botbuilder'; +import { WaterfallDialog } from 'botbuilder-dialogs'; +import { GBMinInstance } from 'botlib'; +import { CSService } from '../services/CSService'; +import { Messages } from '../strings'; +const logger = require('../../../src/logger'); export class QualityDialog extends IGBDialog { /** @@ -52,18 +52,18 @@ export class QualityDialog extends IGBDialog { * @param bot The bot adapter. * @param min The minimal bot instance data. */ - static setup(bot: BotAdapter, min: GBMinInstance) { + public static setup(bot: BotAdapter, min: GBMinInstance) { const service = new CSService(); - min.dialogs.add( new WaterfallDialog("/quality", [ + min.dialogs.add(new WaterfallDialog('/quality', [ async step => { const locale = step.context.activity.locale; const user = await min.userProfile.get(context, {}); - - var score = step.result; + + const score = step.result; setTimeout( - () => min.conversationalService.sendEvent(step, "stop", null), + () => min.conversationalService.sendEvent(step, 'stop', null), 400 ); @@ -77,7 +77,7 @@ export class QualityDialog extends IGBDialog { user.lastQuestion, user.lastQuestionId ); - await step.replaceDialog("/ask", { isReturning: true }); + await step.replaceDialog('/ask', { isReturning: true }); } return await step.next(); } diff --git a/packages/customer-satisfaction.gbapp/index.ts b/packages/customer-satisfaction.gbapp/index.ts index f4714b72..5324b258 100644 --- a/packages/customer-satisfaction.gbapp/index.ts +++ b/packages/customer-satisfaction.gbapp/index.ts @@ -34,34 +34,34 @@ * @fileoverview General Bots server core. */ -'use strict' +'use strict'; -const UrlJoin = require("url-join") -import { GuaribasQuestionAlternate } from './models/index' -import { QualityDialog } from './dialogs/QualityDialog' -import { FeedbackDialog } from './dialogs/FeedbackDialog' -import { GBMinInstance, IGBPackage, IGBCoreService } from "botlib" +const UrlJoin = require('url-join'); +import { GBMinInstance, IGBCoreService, IGBPackage } from 'botlib'; +import { FeedbackDialog } from './dialogs/FeedbackDialog'; +import { QualityDialog } from './dialogs/QualityDialog'; +import { GuaribasQuestionAlternate } from './models/index'; -import { Sequelize } from 'sequelize-typescript' +import { Sequelize } from 'sequelize-typescript'; export class GBCustomerSatisfactionPackage implements IGBPackage { - sysPackages: IGBPackage[] = null - loadPackage(core: IGBCoreService, sequelize: Sequelize): void { + public sysPackages: IGBPackage[] = null; + public loadPackage(core: IGBCoreService, sequelize: Sequelize): void { core.sequelize.addModels([ GuaribasQuestionAlternate - ]) + ]); } - unloadPackage(core: IGBCoreService): void { - + public unloadPackage(core: IGBCoreService): void { + } - loadBot(min: GBMinInstance): void { - FeedbackDialog.setup(min.bot, min) - QualityDialog.setup(min.bot, min) + public loadBot(min: GBMinInstance): void { + FeedbackDialog.setup(min.bot, min); + QualityDialog.setup(min.bot, min); } - unloadBot(min: GBMinInstance): void { - + public unloadBot(min: GBMinInstance): void { + } - onNewSession(min: GBMinInstance, step: any): void { - + public onNewSession(min: GBMinInstance, step: any): void { + } } diff --git a/packages/customer-satisfaction.gbapp/models/index.ts b/packages/customer-satisfaction.gbapp/models/index.ts index 2dc1ab34..afcd21e8 100644 --- a/packages/customer-satisfaction.gbapp/models/index.ts +++ b/packages/customer-satisfaction.gbapp/models/index.ts @@ -34,34 +34,34 @@ * @fileoverview General Bots server core. */ -'use strict' +'use strict'; import { - DataTypes, - DataTypeUUIDv4, DataTypeDate, - DataTypeDecimal -} from "sequelize" + DataTypeDecimal, + DataTypes, + DataTypeUUIDv4 +} from 'sequelize'; import { - Sequelize, - Table, - Column, - Model, - HasMany, + AutoIncrement, BelongsTo, BelongsToMany, - Length, - ForeignKey, + Column, CreatedAt, - UpdatedAt, DataType, + ForeignKey, + HasMany, IsUUID, + Length, + Model, PrimaryKey, - AutoIncrement -} from "sequelize-typescript" + Sequelize, + Table, + UpdatedAt +} from 'sequelize-typescript'; -import { GuaribasInstance } from "../../core.gbapp/models/GBModel" +import { GuaribasInstance } from '../../core.gbapp/models/GBModel'; @Table export class GuaribasQuestionAlternate extends Model { @@ -69,16 +69,16 @@ export class GuaribasQuestionAlternate extends Model @PrimaryKey @AutoIncrement @Column - quickAnswerId: number + public quickAnswerId: number; - @Column questionTyped: string + @Column public questionTyped: string; - @Column questionText: string + @Column public questionText: string; @ForeignKey(() => GuaribasInstance) @Column - instanceId: number + public instanceId: number; @BelongsTo(() => GuaribasInstance) - instance: GuaribasInstance + public instance: GuaribasInstance; } diff --git a/packages/customer-satisfaction.gbapp/services/CSService.ts b/packages/customer-satisfaction.gbapp/services/CSService.ts index 71dcec63..959843e6 100644 --- a/packages/customer-satisfaction.gbapp/services/CSService.ts +++ b/packages/customer-satisfaction.gbapp/services/CSService.ts @@ -30,12 +30,12 @@ | | \*****************************************************************************/ -import { GuaribasQuestionAlternate } from '../models' -import { GuaribasConversation } from '../../analytics.gblib/models' +import { GuaribasConversation } from '../../analytics.gblib/models'; +import { GuaribasQuestionAlternate } from '../models'; export class CSService { - async resolveQuestionAlternate( + public async resolveQuestionAlternate( instanceId: number, questionTyped: string): Promise { @@ -44,24 +44,24 @@ export class CSService { instanceId: instanceId, questionTyped: questionTyped } - }) + }); } - async insertQuestionAlternate( + public async insertQuestionAlternate( instanceId: number, questionTyped: string, questionText: string): Promise { return GuaribasQuestionAlternate.create({ questionTyped: questionTyped, questionText: questionText - }) + }); } - async updateConversationRate( + public async updateConversationRate( conversation: GuaribasConversation, rate: number ): Promise { - conversation.rate = rate - return conversation.save() + conversation.rate = rate; + return conversation.save(); } } diff --git a/packages/customer-satisfaction.gbapp/strings.ts b/packages/customer-satisfaction.gbapp/strings.ts index 35481519..1cc74dc7 100644 --- a/packages/customer-satisfaction.gbapp/strings.ts +++ b/packages/customer-satisfaction.gbapp/strings.ts @@ -1,22 +1,22 @@ export const Messages = { - "en-US": { - about_suggestions: "Suggestions are welcomed and improve my quality...", - what_about_service: "What about my service?", - glad_you_liked: "I'm glad you liked. I'm here for you.", - we_will_improve: "Let's take note of that, thanks for sharing.", - what_about_me: "What about the service, please rate between 1 and 5.", - thanks: "Thanks!", - im_sorry_lets_try: "I'm sorry. Let's try again...", - great_thanks: "Great, thanks for sharing your thoughts." + 'en-US': { + about_suggestions: 'Suggestions are welcomed and improve my quality...', + what_about_service: 'What about my service?', + glad_you_liked: 'I\'m glad you liked. I\'m here for you.', + we_will_improve: 'Let\'s take note of that, thanks for sharing.', + what_about_me: 'What about the service, please rate between 1 and 5.', + thanks: 'Thanks!', + im_sorry_lets_try: 'I\'m sorry. Let\'s try again...', + great_thanks: 'Great, thanks for sharing your thoughts.' }, - "pt-BR": { - about_suggestions: "Sugestões melhoram muito minha qualidade...", - what_about_service:"O que achou do meu atendimento?", - glad_you_liked: "Bom saber que você gostou. Conte comigo.", - we_will_improve: "Vamos registrar sua questão, obrigado pela sinceridade.", - what_about_me: "O que achou do meu atendimento, de 1 a 5?", - thanks: "Obrigado!", - im_sorry_lets_try: "Desculpe-me, vamos tentar novamente.", - great_thanks: "Ótimo, obrigado por contribuir com sua resposta." + 'pt-BR': { + about_suggestions: 'Sugestões melhoram muito minha qualidade...', + what_about_service: 'O que achou do meu atendimento?', + glad_you_liked: 'Bom saber que você gostou. Conte comigo.', + we_will_improve: 'Vamos registrar sua questão, obrigado pela sinceridade.', + what_about_me: 'O que achou do meu atendimento, de 1 a 5?', + thanks: 'Obrigado!', + im_sorry_lets_try: 'Desculpe-me, vamos tentar novamente.', + great_thanks: 'Ótimo, obrigado por contribuir com sua resposta.' } }; diff --git a/packages/kb.gbapp/dialogs/AskDialog.ts b/packages/kb.gbapp/dialogs/AskDialog.ts index 415d5d43..bdf4edd9 100644 --- a/packages/kb.gbapp/dialogs/AskDialog.ts +++ b/packages/kb.gbapp/dialogs/AskDialog.ts @@ -36,15 +36,15 @@ 'use strict'; -import { IGBDialog } from "botlib"; -import { AzureText } from "pragmatismo-io-framework"; -import { GBMinInstance } from "botlib"; -import { KBService } from "./../services/KBService"; -import { BotAdapter } from "botbuilder"; -import { Messages } from "../strings"; -import { WaterfallDialog } from "botbuilder-dialogs"; +import { BotAdapter } from 'botbuilder'; +import { WaterfallDialog } from 'botbuilder-dialogs'; +import { IGBDialog } from 'botlib'; +import { GBMinInstance } from 'botlib'; +import { AzureText } from 'pragmatismo-io-framework'; +import { Messages } from '../strings'; +import { KBService } from './../services/KBService'; -const logger = require("../../../src/logger"); +const logger = require('../../../src/logger'); export class AskDialog extends IGBDialog { /** @@ -53,18 +53,18 @@ export class AskDialog extends IGBDialog { * @param bot The bot adapter. * @param min The minimal bot instance data. */ - static setup(bot: BotAdapter, min: GBMinInstance) { + public static setup(bot: BotAdapter, min: GBMinInstance) { const service = new KBService(min.core.sequelize); min.dialogs.add( - new WaterfallDialog("/answerEvent", [ + new WaterfallDialog('/answerEvent', [ async step => { - if (step.options && step.options["questionId"]) { - let question = await service.getQuestionById( + if (step.options && step.options.questionId) { + const question = await service.getQuestionById( min.instance.instanceId, - step.options["questionId"] + step.options.questionId ); - let answer = await service.getAnswerById( + const answer = await service.getAnswerById( min.instance.instanceId, question.answerId ); @@ -73,7 +73,7 @@ export class AskDialog extends IGBDialog { await service.sendAnswer(min.conversationalService, step, answer); - await step.replaceDialog("/ask", { isReturning: true }); + await step.replaceDialog('/ask', { isReturning: true }); } return await step.next(); } @@ -81,32 +81,32 @@ export class AskDialog extends IGBDialog { ); min.dialogs.add( - new WaterfallDialog("/answer", [ + new WaterfallDialog('/answer', [ async step => { const user = await min.userProfile.get(step.context, {}); - let text = step.options["query"]; + let text = step.options.query; if (!text) { throw new Error(`/answer being called with no args.query text.`); } - let locale = step.context.activity.locale; + const locale = step.context.activity.locale; // Stops any content on projector. - await min.conversationalService.sendEvent(step, "stop", null); + await min.conversationalService.sendEvent(step, 'stop', null); // Handle extra text from FAQ. - if (step.options && step.options["query"]) { - text = step.options["query"]; - } else if (step.options && step.options["fromFaq"]) { + if (step.options && step.options.query) { + text = step.options.query; + } else if (step.options && step.options.fromFaq) { await step.context.sendActivity(Messages[locale].going_answer); } // Spells check the input text before sending Search or NLP. if (min.instance.spellcheckerKey) { - let data = await AzureText.getSpelledText( + const data = await AzureText.getSpelledText( min.instance.spellcheckerKey, text ); @@ -121,7 +121,7 @@ export class AskDialog extends IGBDialog { user.lastQuestion = text; await min.userProfile.set(step.context, user); - let resultsA = await service.ask( + const resultsA = await service.ask( min.instance, text, min.instance.searchScore, @@ -147,11 +147,11 @@ export class AskDialog extends IGBDialog { // Goes to ask loop, again. - return await step.replaceDialog("/ask", { isReturning: true }); + return await step.replaceDialog('/ask', { isReturning: true }); } else { // Second time running Search, now with no filter. - let resultsB = await service.ask( + const resultsB = await service.ask( min.instance, text, min.instance.searchScore, @@ -172,7 +172,7 @@ export class AskDialog extends IGBDialog { // Informs user that a broader search will be used. if (user.subjects.length > 0) { - let subjectText = `${KBService.getSubjectItemsSeparatedBySpaces( + const subjectText = `${KBService.getSubjectItemsSeparatedBySpaces( user.subjects )}`; await step.context.sendActivity(Messages[locale].wider_answer); @@ -185,13 +185,13 @@ export class AskDialog extends IGBDialog { step, resultsB.answer ); - return await step.replaceDialog("/ask", { isReturning: true }); + return await step.replaceDialog('/ask', { isReturning: true }); } else { if ( !(await min.conversationalService.routeNLP(step, min, text)) ) { await step.context.sendActivity(Messages[locale].did_not_find); - return await step.replaceDialog("/ask", { isReturning: true }); + return await step.replaceDialog('/ask', { isReturning: true }); } } } @@ -200,7 +200,7 @@ export class AskDialog extends IGBDialog { ); min.dialogs.add( - new WaterfallDialog("/ask", [ + new WaterfallDialog('/ask', [ async step => { const locale = step.context.activity.locale; const user = await min.userProfile.get(step.context, {}); @@ -212,23 +212,23 @@ export class AskDialog extends IGBDialog { // Three forms of asking. - if (step.options && step.options["firstTime"]) { + if (step.options && step.options.firstTime) { text = Messages[locale].ask_first_time; - } else if (step.options && step.options["isReturning"]) { + } else if (step.options && step.options.isReturning) { text = Messages[locale].anything_else; } else if (user.subjects.length > 0) { text = Messages[locale].which_question; } else { - throw new Error("Invalid use of /ask"); + throw new Error('Invalid use of /ask'); } if (text.length > 0) { - return await step.prompt("textPrompt", text); + return await step.prompt('textPrompt', text); } return await step.next(); }, async step => { - return await step.replaceDialog("/answer", { query: step.result }); + return await step.replaceDialog('/answer', { query: step.result }); } ]) ); diff --git a/packages/kb.gbapp/dialogs/FaqDialog.ts b/packages/kb.gbapp/dialogs/FaqDialog.ts index 4f999176..745ed814 100644 --- a/packages/kb.gbapp/dialogs/FaqDialog.ts +++ b/packages/kb.gbapp/dialogs/FaqDialog.ts @@ -34,41 +34,41 @@ * @fileoverview General Bots server core. */ -'use strict' +'use strict'; -import { KBService } from './../services/KBService' -import { IGBDialog } from "botlib" -import { BotAdapter } from "botbuilder" -import { Messages } from "../strings"; -import { GBMinInstance } from "botlib" +import { BotAdapter } from 'botbuilder'; import { WaterfallDialog } from 'botbuilder-dialogs'; +import { IGBDialog } from 'botlib'; +import { GBMinInstance } from 'botlib'; +import { Messages } from '../strings'; +import { KBService } from './../services/KBService'; export class FaqDialog extends IGBDialog { /** * Setup dialogs flows and define services call. - * + * * @param bot The bot adapter. * @param min The minimal bot instance data. */ - static setup(bot: BotAdapter, min: GBMinInstance) { + public static setup(bot: BotAdapter, min: GBMinInstance) { - const service = new KBService(min.core.sequelize) + const service = new KBService(min.core.sequelize); - min.dialogs.add(new WaterfallDialog("/faq", [ + min.dialogs.add(new WaterfallDialog('/faq', [ async step => { - let data = await service.getFaqBySubjectArray("faq", null) + const data = await service.getFaqBySubjectArray('faq', null); const locale = step.context.activity.locale; if (data) { - await min.conversationalService.sendEvent(step, "play", { - playerType: "bullet", + await min.conversationalService.sendEvent(step, 'play', { + playerType: 'bullet', data: data.slice(0, 10) - }) - - await step.context.sendActivity(Messages[locale].see_faq) // TODO: RND messages. - await step.endDialog() + }); + + await step.context.sendActivity(Messages[locale].see_faq); // TODO: RND messages. + await step.endDialog(); return await step.next(); } } - ])) + ])); } } diff --git a/packages/kb.gbapp/dialogs/MenuDialog.ts b/packages/kb.gbapp/dialogs/MenuDialog.ts index fece9fc0..5ae6441f 100644 --- a/packages/kb.gbapp/dialogs/MenuDialog.ts +++ b/packages/kb.gbapp/dialogs/MenuDialog.ts @@ -63,7 +63,7 @@ export class MenuDialog extends IGBDialog { const locale = step.context.activity.locale; let rootSubjectId = null; - if (step.options && step.options['data']) { + if (step.options && step.options.data) { const subject = step.result.data; // If there is a shortcut specified as subject destination, go there. diff --git a/packages/kb.gbapp/index.ts b/packages/kb.gbapp/index.ts index 1bf4fa4e..da3628c0 100644 --- a/packages/kb.gbapp/index.ts +++ b/packages/kb.gbapp/index.ts @@ -34,45 +34,45 @@ * @fileoverview General Bots server core. */ -'use strict' +'use strict'; -const UrlJoin = require("url-join") +const UrlJoin = require('url-join'); -import { GuaribasAnswer, GuaribasQuestion, GuaribasSubject } from './models/index' -import { GBMinInstance, IGBPackage } from "botlib" +import { GBMinInstance, IGBPackage } from 'botlib'; +import { GuaribasAnswer, GuaribasQuestion, GuaribasSubject } from './models/index'; -import { AskDialog } from "./dialogs/AskDialog" -import { FaqDialog } from "./dialogs/FaqDialog" -import { MenuDialog } from "./dialogs/MenuDialog" -import { Sequelize } from 'sequelize-typescript' -import { IGBCoreService } from 'botlib' +import { IGBCoreService } from 'botlib'; +import { Sequelize } from 'sequelize-typescript'; +import { AskDialog } from './dialogs/AskDialog'; +import { FaqDialog } from './dialogs/FaqDialog'; +import { MenuDialog } from './dialogs/MenuDialog'; export class GBKBPackage implements IGBPackage { - sysPackages: IGBPackage[] = null - - loadPackage(core: IGBCoreService, sequelize: Sequelize): void { + public sysPackages: IGBPackage[] = null; + + public loadPackage(core: IGBCoreService, sequelize: Sequelize): void { core.sequelize.addModels([ GuaribasAnswer, GuaribasQuestion, GuaribasSubject - ]) - - } - unloadPackage(core: IGBCoreService): void { - - } - loadBot(min: GBMinInstance): void { + ]); - AskDialog.setup(min.bot, min) - FaqDialog.setup(min.bot, min) - MenuDialog.setup(min.bot, min) - } - unloadBot(min: GBMinInstance): void { - + public unloadPackage(core: IGBCoreService): void { + } - onNewSession(min: GBMinInstance, step: any): void { - + public loadBot(min: GBMinInstance): void { + + AskDialog.setup(min.bot, min); + FaqDialog.setup(min.bot, min); + MenuDialog.setup(min.bot, min); + + } + public unloadBot(min: GBMinInstance): void { + + } + public onNewSession(min: GBMinInstance, step: any): void { + } } diff --git a/packages/kb.gbapp/services/KBService.ts b/packages/kb.gbapp/services/KBService.ts index 19b19bbb..a9b71a1e 100644 --- a/packages/kb.gbapp/services/KBService.ts +++ b/packages/kb.gbapp/services/KBService.ts @@ -30,40 +30,57 @@ | | \*****************************************************************************/ -const logger = require("../../../src/logger") -const Path = require("path") -const Fs = require("fs") -const promise = require('bluebird') -const parse = promise.promisify(require('csv-parse')) -const UrlJoin = require("url-join") -const marked = require("marked") -const path = require("path") -const asyncPromise = require('async-promises') -const walkPromise = require('walk-promise') -import { Messages } from "../strings"; +const logger = require('../../../src/logger'); +const Path = require('path'); +const Fs = require('fs'); +const promise = require('bluebird'); +const parse = promise.promisify(require('csv-parse')); +const UrlJoin = require('url-join'); +const marked = require('marked'); +const path = require('path'); +const asyncPromise = require('async-promises'); +const walkPromise = require('walk-promise'); +import { Messages } from '../strings'; -import { Sequelize } from 'sequelize-typescript' -import { GBConfigService } from './../../core.gbapp/services/GBConfigService' -import { GuaribasQuestion, GuaribasAnswer, GuaribasSubject } from "../models" -import { IGBCoreService, IGBConversationalService, IGBInstance } from "botlib" -import { AzureSearch } from "pragmatismo-io-framework" -import { GBDeployer } from "../../core.gbapp/services/GBDeployer" -import { GuaribasPackage } from "../../core.gbapp/models/GBModel" +import { IGBConversationalService, IGBCoreService, IGBInstance } from 'botlib'; +import { AzureSearch } from 'pragmatismo-io-framework'; +import { Sequelize } from 'sequelize-typescript'; +import { GuaribasPackage } from '../../core.gbapp/models/GBModel'; +import { GBDeployer } from '../../core.gbapp/services/GBDeployer'; +import { GuaribasAnswer, GuaribasQuestion, GuaribasSubject } from '../models'; +import { GBConfigService } from './../../core.gbapp/services/GBConfigService'; export class KBServiceSearchResults { - answer: GuaribasAnswer - questionId: number + public answer: GuaribasAnswer; + public questionId: number; } export class KBService { - sequelize: Sequelize + public sequelize: Sequelize; constructor(sequelize: Sequelize) { - this.sequelize = sequelize + this.sequelize = sequelize; } - async getQuestionById( + public static getFormattedSubjectItems(subjects: GuaribasSubject[]) { + if (!subjects) { return ''; } + const out = []; + subjects.forEach(subject => { + out.push(subject.title); + }); + return out.join(', '); + } + + public static getSubjectItemsSeparatedBySpaces(subjects: GuaribasSubject[]) { + const out = []; + subjects.forEach(subject => { + out.push(subject.internalId); + }); + return out.join(' '); + } + + public async getQuestionById( instanceId: number, questionId: number ): Promise { @@ -72,10 +89,10 @@ export class KBService { instanceId: instanceId, questionId: questionId } - }) + }); } - async getAnswerById( + public async getAnswerById( instanceId: number, answerId: number ): Promise { @@ -84,47 +101,47 @@ export class KBService { instanceId: instanceId, answerId: answerId } - }) + }); } - async getAnswerByText( + public async getAnswerByText( instanceId: number, text: string ): Promise { - const Op = Sequelize.Op + const Op = Sequelize.Op; - let question = await GuaribasQuestion.findOne({ + const question = await GuaribasQuestion.findOne({ where: { instanceId: instanceId, content: { [Op.like]: `%${text.trim()}%` } } - }) + }); if (question) { - let answer = await GuaribasAnswer.findOne({ + const answer = await GuaribasAnswer.findOne({ where: { instanceId: instanceId, answerId: question.answerId } - }) - return Promise.resolve({ question: question, answer: answer }) + }); + return Promise.resolve({ question: question, answer: answer }); } - return Promise.resolve(null) + return Promise.resolve(null); } - async addAnswer(obj: GuaribasAnswer): Promise { + public async addAnswer(obj: GuaribasAnswer): Promise { return new Promise( (resolve, reject) => { GuaribasAnswer.create(obj).then(item => { - resolve(item) + resolve(item); }).error((reason) => { - reject(reason) - }) - }) + reject(reason); + }); + }); } - async ask( + public async ask( instance: IGBInstance, query: string, searchScore: number, @@ -133,185 +150,165 @@ export class KBService { // Builds search query. - query = query.toLowerCase() - query = query.replace("?", " ") - query = query.replace("!", " ") - query = query.replace(".", " ") - query = query.replace("/", " ") - query = query.replace("\\", " ") + query = query.toLowerCase(); + query = query.replace('?', ' '); + query = query.replace('!', ' '); + query = query.replace('.', ' '); + query = query.replace('/', ' '); + query = query.replace('\\', ' '); if (subjects) { - let text = KBService.getSubjectItemsSeparatedBySpaces(subjects) + const text = KBService.getSubjectItemsSeparatedBySpaces(subjects); if (text) { - query = `${query} ${text}` + query = `${query} ${text}`; } } // TODO: Filter by instance. what = `${what}&$filter=instanceId eq ${instanceId}` try { - if (instance.searchKey && GBConfigService.get("STORAGE_DIALECT") == "mssql") { - let service = new AzureSearch( + if (instance.searchKey && GBConfigService.get('STORAGE_DIALECT') == 'mssql') { + const service = new AzureSearch( instance.searchKey, instance.searchHost, instance.searchIndex, instance.searchIndexer - ) - let results = await service.search(query) + ); + const results = await service.search(query); if (results && results.length > 0 && - results[0]["@search.score"] >= searchScore) { - let value = await this.getAnswerById( + results[0]['@search.score'] >= searchScore) { + const value = await this.getAnswerById( instance.instanceId, - results[0].answerId) + results[0].answerId); if (value) { - return Promise.resolve({ answer: value, questionId: results[0].questionId }) - } - else { - return Promise.resolve({ answer: null, questionId: 0 }) + return Promise.resolve({ answer: value, questionId: results[0].questionId }); + } else { + return Promise.resolve({ answer: null, questionId: 0 }); } } } else { - let data = await this.getAnswerByText(instance.instanceId, query) + const data = await this.getAnswerByText(instance.instanceId, query); if (data) { return Promise.resolve( - { answer: data.answer, questionId: data.question.questionId }) + { answer: data.answer, questionId: data.question.questionId }); } else { - return Promise.resolve({ answer: null, questionId: 0 }) + return Promise.resolve({ answer: null, questionId: 0 }); } } - } - catch (reason) { + } catch (reason) { return Promise.reject(new Error(reason)); } } - - static getFormattedSubjectItems(subjects: GuaribasSubject[]) { - if (!subjects) return "" - let out = [] - subjects.forEach(subject => { - out.push(subject.title) - }) - return out.join(", ") - } - - static getSubjectItemsSeparatedBySpaces(subjects: GuaribasSubject[]) { - let out = [] - subjects.forEach(subject => { - out.push(subject.internalId) - }) - return out.join(" ") - } - - async getSubjectItems( + public async getSubjectItems( instanceId: number, parentId: number ): Promise { - var where = { parentSubjectId: parentId, instanceId: instanceId } + const where = { parentSubjectId: parentId, instanceId: instanceId }; return GuaribasSubject.findAll({ where: where - }) + }); } - async getFaqBySubjectArray(from: string, subjects: any): Promise { - let where = { + public async getFaqBySubjectArray(from: string, subjects: any): Promise { + const where = { from: from - } + }; if (subjects) { if (subjects[0]) { - where["subject1"] = subjects[0].internalId + where.subject1 = subjects[0].internalId; } if (subjects[1]) { - where["subject2"] = subjects[1].internalId + where.subject2 = subjects[1].internalId; } if (subjects[2]) { - where["subject3"] = subjects[2].internalId + where.subject3 = subjects[2].internalId; } if (subjects[3]) { - where["subject4"] = subjects[3].internalId + where.subject4 = subjects[3].internalId; } } return await GuaribasQuestion.findAll({ where: where - }) + }); } - async importKbTabularFile( + public async importKbTabularFile( filePath: string, instanceId: number, packageId: number ): Promise { - let file = Fs.readFileSync(filePath, "UCS-2") - let opts = { - delimiter: "\t" - } + const file = Fs.readFileSync(filePath, 'UCS-2'); + const opts = { + delimiter: '\t' + }; let lastQuestion: GuaribasQuestion; let lastAnswer: GuaribasAnswer; - let data = await parse(file, opts) + const data = await parse(file, opts); return asyncPromise.eachSeries(data, async line => { // Extracts values from columns in the current line. - let subjectsText = line[0] - var from = line[1] - var to = line[2] - var question = line[3] - var answer = line[4] + const subjectsText = line[0]; + const from = line[1]; + const to = line[2]; + const question = line[3]; + let answer = line[4]; // Skips the first line. - if (!(subjectsText === "subjects" && from == "from")) { - let format = ".txt" + if (!(subjectsText === 'subjects' && from == 'from')) { + let format = '.txt'; // Extracts answer from external media if any. - if (answer.indexOf(".md") > -1) { - let mediaFilename = UrlJoin(path.dirname(filePath), "..", "articles", answer) + if (answer.indexOf('.md') > -1) { + const mediaFilename = UrlJoin(path.dirname(filePath), '..', 'articles', answer); if (Fs.existsSync(mediaFilename)) { - answer = Fs.readFileSync(mediaFilename, "utf8") - format = ".md" + answer = Fs.readFileSync(mediaFilename, 'utf8'); + format = '.md'; } else { - logger.info(`[GBImporter] File not found: ${mediaFilename}.`) - answer = "" + logger.info(`[GBImporter] File not found: ${mediaFilename}.`); + answer = ''; } } // Processes subjects hierarchy splitting by dots. - let subjectArray = subjectsText.split(".") + const subjectArray = subjectsText.split('.'); let subject1: string, subject2: string, subject3: string, - subject4: string - var indexer = 0 + subject4: string; + let indexer = 0; subjectArray.forEach(element => { if (indexer == 0) { - subject1 = subjectArray[indexer].substring(0, 63) + subject1 = subjectArray[indexer].substring(0, 63); } else if (indexer == 1) { - subject2 = subjectArray[indexer].substring(0, 63) + subject2 = subjectArray[indexer].substring(0, 63); } else if (indexer == 2) { - subject3 = subjectArray[indexer].substring(0, 63) + subject3 = subjectArray[indexer].substring(0, 63); } else if (indexer == 3) { - subject4 = subjectArray[indexer].substring(0, 63) + subject4 = subjectArray[indexer].substring(0, 63); } - indexer++ - }) + indexer++; + }); // Now with all the data ready, creates entities in the store. - let answer1 = await GuaribasAnswer.create({ + const answer1 = await GuaribasAnswer.create({ instanceId: instanceId, content: answer, format: format, packageId: packageId, - prevId: lastQuestion ? lastQuestion.questionId : 0, - }) + prevId: lastQuestion ? lastQuestion.questionId : 0 + }); - let question1 = await GuaribasQuestion.create({ + const question1 = await GuaribasQuestion.create({ from: from, to: to, subject1: subject1, @@ -322,41 +319,41 @@ export class KBService { instanceId: instanceId, answerId: answer1.answerId, packageId: packageId - }) + }); if (lastAnswer && lastQuestion) { - await lastAnswer.updateAttributes({ nextId: lastQuestion.questionId }) + await lastAnswer.updateAttributes({ nextId: lastQuestion.questionId }); } - lastAnswer = answer1 - lastQuestion = question1 + lastAnswer = answer1; + lastQuestion = question1; - return Promise.resolve(lastQuestion) + return Promise.resolve(lastQuestion); } else { // Skips the header. - return Promise.resolve(null) + return Promise.resolve(null); } - }) + }); } - async sendAnswer(conversationalService: IGBConversationalService, - step: any, answer: GuaribasAnswer) { + public async sendAnswer(conversationalService: IGBConversationalService, + step: any, answer: GuaribasAnswer) { if (answer.content.endsWith('.mp4')) { - await conversationalService.sendEvent(step, "play", { - playerType: "video", + await conversationalService.sendEvent(step, 'play', { + playerType: 'video', data: answer.content - }) + }); } else if (answer.content.length > 140 && - step.context._activity.channelId === "webchat") { + step.context._activity.channelId === 'webchat') { const locale = step.context.activity.locale; - await step.context.sendActivity(Messages[locale].will_answer_projector) // TODO: Handle rnd. - var html = answer.content + await step.context.sendActivity(Messages[locale].will_answer_projector); // TODO: Handle rnd. + let html = answer.content; - if (answer.format === ".md") { + if (answer.format === '.md') { marked.setOptions({ renderer: new marked.Renderer(), gfm: true, @@ -367,23 +364,23 @@ export class KBService { smartLists: true, smartypants: false, xhtml: false - }) - html = marked(answer.content) + }); + html = marked(answer.content); } - await conversationalService.sendEvent(step, "play", - { - playerType: "markdown", data: { + await conversationalService.sendEvent(step, 'play', + { + playerType: 'markdown', data: { content: html, answer: answer, prevId: answer.prevId, nextId: answer.nextId } - }) + }); } else { - await step.context.sendActivity(answer.content) - await conversationalService.sendEvent(step, "stop", null) + await step.context.sendActivity(answer.content); + await conversationalService.sendEvent(step, 'stop', null); } } - async importKbPackage( + public async importKbPackage( localPath: string, packageStorage: GuaribasPackage, instance: IGBInstance @@ -393,8 +390,8 @@ export class KBService { await this.importSubjectFile( packageStorage.packageId, - UrlJoin(localPath, "subjects.json"), - instance) + UrlJoin(localPath, 'subjects.json'), + instance); // Import all .tsv files in the tabular directory. @@ -402,41 +399,40 @@ export class KBService { localPath, instance, packageStorage.packageId - ) + ); } - - async importKbTabularDirectory( + public async importKbTabularDirectory( localPath: string, instance: IGBInstance, packageId: number ): Promise { - let files = await walkPromise(UrlJoin(localPath, "tabular")) + const files = await walkPromise(UrlJoin(localPath, 'tabular')); return Promise.all(files.map(async file => { - if (file.name.endsWith(".tsv")) { + if (file.name.endsWith('.tsv')) { return this.importKbTabularFile( UrlJoin(file.root, file.name), instance.instanceId, - packageId) + packageId); } - })) + })); } - async importSubjectFile( + public async importSubjectFile( packageId: number, filename: string, instance: IGBInstance ): Promise { - var subjects = JSON.parse(Fs.readFileSync(filename, "utf8")) + const subjects = JSON.parse(Fs.readFileSync(filename, 'utf8')); const doIt = async (subjects: GuaribasSubject[], parentSubjectId: number) => { return asyncPromise.eachSeries(subjects, async item => { - let mediaFilename = item.id + ".png" + const mediaFilename = item.id + '.png'; - let value = await GuaribasSubject.create({ + const value = await GuaribasSubject.create({ internalId: item.id, parentSubjectId: parentSubjectId, instanceId: instance.instanceId, @@ -445,20 +441,19 @@ export class KBService { title: item.title, description: item.description, packageId: packageId - }) + }); if (item.children) { - return Promise.resolve(doIt(item.children, value.subjectId)) + return Promise.resolve(doIt(item.children, value.subjectId)); + } else { + return Promise.resolve(item); } - else { - return Promise.resolve(item) - } - }) - } - return doIt(subjects.children, null) + }); + }; + return doIt(subjects.children, null); } - async undeployKbFromStorage( + public async undeployKbFromStorage( instance: IGBInstance, deployer: GBDeployer, packageId: number @@ -466,41 +461,41 @@ export class KBService { await GuaribasQuestion.destroy({ where: { instanceId: instance.instanceId, packageId: packageId } - }) + }); await GuaribasAnswer.destroy({ where: { instanceId: instance.instanceId, packageId: packageId } - }) + }); await GuaribasSubject.destroy({ where: { instanceId: instance.instanceId, packageId: packageId } - }) + }); await GuaribasPackage.destroy({ where: { instanceId: instance.instanceId, packageId: packageId } - }) + }); - await deployer.rebuildIndex(instance) + await deployer.rebuildIndex(instance); } /** * Deploys a knowledge base to the storage using the .gbkb format. - * + * * @param localPath Path to the .gbkb folder. */ - async deployKb(core: IGBCoreService, deployer: GBDeployer, localPath: string) { - let packageType = Path.extname(localPath) - let packageName = Path.basename(localPath) - logger.info(`[GBDeployer] Opening package: ${localPath}`) - let packageObject = JSON.parse( - Fs.readFileSync(UrlJoin(localPath, "package.json"), "utf8") - ) + public async deployKb(core: IGBCoreService, deployer: GBDeployer, localPath: string) { + const packageType = Path.extname(localPath); + const packageName = Path.basename(localPath); + logger.info(`[GBDeployer] Opening package: ${localPath}`); + const packageObject = JSON.parse( + Fs.readFileSync(UrlJoin(localPath, 'package.json'), 'utf8') + ); - let instance = await core.loadInstance(packageObject.botId) - logger.info(`[GBDeployer] Importing: ${localPath}`) - let p = await deployer.deployPackageToStorage( + const instance = await core.loadInstance(packageObject.botId); + logger.info(`[GBDeployer] Importing: ${localPath}`); + const p = await deployer.deployPackageToStorage( instance.instanceId, - packageName) - await this.importKbPackage(localPath, p, instance) + packageName); + await this.importKbPackage(localPath, p, instance); - deployer.rebuildIndex(instance) - logger.info(`[GBDeployer] Finished import of ${localPath}`) + deployer.rebuildIndex(instance); + logger.info(`[GBDeployer] Finished import of ${localPath}`); } } diff --git a/packages/kb.gbapp/strings.ts b/packages/kb.gbapp/strings.ts index aa0a29d2..787d1305 100644 --- a/packages/kb.gbapp/strings.ts +++ b/packages/kb.gbapp/strings.ts @@ -1,38 +1,38 @@ export const Messages = { - "en-US": { - did_not_find: "I'm sorry I didn't find anything.", - changing_language: "OK, changing language to English...", - going_answer: "Great choice, now looking for your answer...", + 'en-US': { + did_not_find: 'I\'m sorry I didn\'t find anything.', + changing_language: 'OK, changing language to English...', + going_answer: 'Great choice, now looking for your answer...', wider_answer: subjectText => `Answering to you in a broader way... Not just about ${subjectText}.`, - which_question: "What's your question?", - anything_else: "So, may I help with anything else?", - here_is_subjects: "Here are some subjects to choose from...", - menu_select: "Select", + which_question: 'What\'s your question?', + anything_else: 'So, may I help with anything else?', + here_is_subjects: 'Here are some subjects to choose from...', + menu_select: 'Select', lets_search: query => `Vamos pesquisar sobre ${query}... O que deseja saber?`, see_faq: - "Please take a look at the FAQ I've prepared for you. You can click on them to get the answer.", + 'Please take a look at the FAQ I\'ve prepared for you. You can click on them to get the answer.', will_answer_projector: - "I'll answer on the projector to a better experience...", - ask_first_time: "What are you looking for?" + 'I\'ll answer on the projector to a better experience...', + ask_first_time: 'What are you looking for?' }, - "pt-BR": { - did_not_find: "Desculpe-me, não encontrei nada a respeito.", - changing_language: "OK, mundando de idioma para o Português...", - going_answer: "Ótima escolha, procurando resposta para sua questão...", + 'pt-BR': { + did_not_find: 'Desculpe-me, não encontrei nada a respeito.', + changing_language: 'OK, mundando de idioma para o Português...', + going_answer: 'Ótima escolha, procurando resposta para sua questão...', wider_answer: subjectText => `Vou te responder de modo mais abrangente... Não apenas sobre ${subjectText}`, - which_question: "Qual a pergunta?", - anything_else: "Então, posso ajudar em algo a mais?", - here_is_subjects: "Aqui estão algumas categorias de assuntos...", - menu_select: "Selecionar", + which_question: 'Qual a pergunta?', + anything_else: 'Então, posso ajudar em algo a mais?', + here_is_subjects: 'Aqui estão algumas categorias de assuntos...', + menu_select: 'Selecionar', lets_search: query => `Let's search about ${query}... What do you want to know?`, see_faq: - "Veja algumas perguntas mais frequentes logo na tela. Clique numa delas para eu responder.", + 'Veja algumas perguntas mais frequentes logo na tela. Clique numa delas para eu responder.', will_answer_projector: - "Vou te responder na tela para melhor visualização...", - ask_first_time: "Sobre como eu poderia ajudar?" + 'Vou te responder na tela para melhor visualização...', + ask_first_time: 'Sobre como eu poderia ajudar?' } }; diff --git a/packages/security.gblib/index.ts b/packages/security.gblib/index.ts index b698262f..90ba69ac 100644 --- a/packages/security.gblib/index.ts +++ b/packages/security.gblib/index.ts @@ -34,40 +34,39 @@ * @fileoverview General Bots server core. */ -'use strict' +'use strict'; -const UrlJoin = require("url-join") +const UrlJoin = require('url-join'); +import { GBMinInstance, IGBCoreService, IGBPackage } from 'botlib'; -import { GBMinInstance, IGBPackage, IGBCoreService } from "botlib" - -import { Sequelize } from "sequelize-typescript" -import { GuaribasUser, GuaribasGroup, GuaribasUserGroup } from "./models" +import { Sequelize } from 'sequelize-typescript'; +import { GuaribasGroup, GuaribasUser, GuaribasUserGroup } from './models'; export class GBSecurityPackage implements IGBPackage { - sysPackages: IGBPackage[] = null - loadPackage(core: IGBCoreService, sequelize: Sequelize): void { + public sysPackages: IGBPackage[] = null; + public loadPackage(core: IGBCoreService, sequelize: Sequelize): void { core.sequelize.addModels([ GuaribasGroup, GuaribasUser, GuaribasUserGroup - ]) + ]); - core + core; } - unloadPackage(core: IGBCoreService): void { + public unloadPackage(core: IGBCoreService): void { } - loadBot(min: GBMinInstance): void { + public loadBot(min: GBMinInstance): void { } - unloadBot(min: GBMinInstance): void { + public unloadBot(min: GBMinInstance): void { } - onNewSession(min: GBMinInstance, step: any): void { + public onNewSession(min: GBMinInstance, step: any): void { } } diff --git a/packages/security.gblib/models/index.ts b/packages/security.gblib/models/index.ts index 22a58d0d..784e8c97 100644 --- a/packages/security.gblib/models/index.ts +++ b/packages/security.gblib/models/index.ts @@ -34,60 +34,60 @@ * @fileoverview General Bots server core. */ -'use strict' +'use strict'; import { - DataTypes, - DataTypeUUIDv4, DataTypeDate, - DataTypeDecimal -} from "sequelize" + DataTypeDecimal, + DataTypes, + DataTypeUUIDv4 +} from 'sequelize'; import { - Sequelize, - Table, - Column, - Model, - HasMany, + AutoIncrement, BelongsTo, BelongsToMany, - Length, - ForeignKey, + Column, CreatedAt, - UpdatedAt, DataType, + ForeignKey, + HasMany, IsUUID, + Length, + Model, PrimaryKey, - AutoIncrement -} from "sequelize-typescript" + Sequelize, + Table, + UpdatedAt +} from 'sequelize-typescript'; -import { GuaribasInstance } from "../../core.gbapp/models/GBModel" +import { GuaribasInstance } from '../../core.gbapp/models/GBModel'; @Table export class GuaribasUser extends Model { @PrimaryKey @AutoIncrement @Column - userId: number + public userId: number; - @Column displayName: string + @Column public displayName: string; - @Column userSystemId: string - @Column userName: string + @Column public userSystemId: string; + @Column public userName: string; - @Column defaultChannel: string + @Column public defaultChannel: string; - @Column email: string + @Column public email: string; @Column(DataType.STRING(512)) - internalAddress: string + public internalAddress: string; @ForeignKey(() => GuaribasInstance) @Column - instanceId: number + public instanceId: number; @BelongsTo(() => GuaribasInstance) - instance: GuaribasInstance + public instance: GuaribasInstance; } @Table @@ -95,40 +95,40 @@ export class GuaribasGroup extends Model { @PrimaryKey @AutoIncrement @Column - groupId: number + public groupId: number; @Length({ min: 0, max: 512 }) @Column - displayName: string + public displayName: string; @ForeignKey(() => GuaribasInstance) @Column - instanceId: number + public instanceId: number; @BelongsTo(() => GuaribasInstance) - instance: GuaribasInstance + public instance: GuaribasInstance; } @Table export class GuaribasUserGroup extends Model { @ForeignKey(() => GuaribasUser) @Column - userId: number + public userId: number; @ForeignKey(() => GuaribasGroup) @Column - groupId: number + public groupId: number; @ForeignKey(() => GuaribasInstance) @Column - instanceId: number + public instanceId: number; @BelongsTo(() => GuaribasInstance) - instance: GuaribasInstance + public instance: GuaribasInstance; @BelongsTo(() => GuaribasGroup) - group: GuaribasGroup + public group: GuaribasGroup; @BelongsTo(() => GuaribasUser) - user: GuaribasUser + public user: GuaribasUser; } diff --git a/packages/security.gblib/services/SecService.ts b/packages/security.gblib/services/SecService.ts index a3faacf4..c4d7d675 100644 --- a/packages/security.gblib/services/SecService.ts +++ b/packages/security.gblib/services/SecService.ts @@ -30,48 +30,48 @@ | | \*****************************************************************************/ -const Path = require("path") -const Fs = require("fs") -const _ = require("lodash") -const Parse = require("csv-parse") -const Async = require("async") -const UrlJoin = require("url-join") -const Walk = require("fs-walk") -const logger = require("../../../src/logger") +const Path = require('path'); +const Fs = require('fs'); +const _ = require('lodash'); +const Parse = require('csv-parse'); +const Async = require('async'); +const UrlJoin = require('url-join'); +const Walk = require('fs-walk'); +const logger = require('../../../src/logger'); -import { GBServiceCallback, GBService, IGBInstance } from "botlib" -import { GuaribasGroup, GuaribasUser, GuaribasUserGroup } from "../models" +import { GBService, GBServiceCallback, IGBInstance } from 'botlib'; +import { GuaribasGroup, GuaribasUser, GuaribasUserGroup } from '../models'; export class SecService extends GBService { - async importSecurityFile(localPath: string, instance: IGBInstance) { - let security = JSON.parse( - Fs.readFileSync(UrlJoin(localPath, "security.json"), "utf8") - ) + public async importSecurityFile(localPath: string, instance: IGBInstance) { + const security = JSON.parse( + Fs.readFileSync(UrlJoin(localPath, 'security.json'), 'utf8') + ); security.groups.forEach(group => { - let groupDb = GuaribasGroup.build({ + const groupDb = GuaribasGroup.build({ instanceId: instance.instanceId, displayName: group.displayName - }) + }); groupDb.save().then(groupDb => { group.users.forEach(user => { - let userDb = GuaribasUser.build({ + const userDb = GuaribasUser.build({ instanceId: instance.instanceId, groupId: groupDb.groupId, userName: user.userName - }) + }); userDb.save().then(userDb => { - let userGroup = GuaribasUserGroup.build() - userGroup.groupId = groupDb.groupId - userGroup.userId = userDb.userId - userGroup.save() - }) - }) - }) - }) + const userGroup = GuaribasUserGroup.build(); + userGroup.groupId = groupDb.groupId; + userGroup.userId = userDb.userId; + userGroup.save(); + }); + }); + }); + }); } - async ensureUser( + public async ensureUser( instanceId: number, userSystemId: string, userName: string, @@ -83,24 +83,24 @@ export class SecService extends GBService { (resolve, reject) => { GuaribasUser.findOne({ - attributes: ["instanceId", "internalAddress"], + attributes: ['instanceId', 'internalAddress'], where: { instanceId: instanceId, userSystemId: userSystemId } }).then(user => { if (!user) { - user = GuaribasUser.build() + user = GuaribasUser.build(); } - user.userSystemId = userSystemId - user.userName = userName - user.displayName = displayName - user.internalAddress = address - user.email = userName - user.defaultChannel = channelName - user.save() - resolve(user) - }).error(reason => reject(reason)) - }) + user.userSystemId = userSystemId; + user.userName = userName; + user.displayName = displayName; + user.internalAddress = address; + user.email = userName; + user.defaultChannel = channelName; + user.save(); + resolve(user); + }).error(reject); + }); } } diff --git a/packages/whatsapp.gblib/index.ts b/packages/whatsapp.gblib/index.ts index 5d100d9c..41829f90 100644 --- a/packages/whatsapp.gblib/index.ts +++ b/packages/whatsapp.gblib/index.ts @@ -34,43 +34,41 @@ * @fileoverview General Bots server core. */ -'use strict' +'use strict'; -const UrlJoin = require("url-join") +const UrlJoin = require('url-join'); +import { GBMinInstance, IGBCoreService, IGBPackage } from 'botlib'; -import { GBMinInstance, IGBPackage, IGBCoreService } from "botlib" - -import { Sequelize } from "sequelize-typescript" -import { WhatsappDirectLine } from "./services/WhatsappDirectLine" - +import { Sequelize } from 'sequelize-typescript'; +import { WhatsappDirectLine } from './services/WhatsappDirectLine'; export class GBWhatsappPackage implements IGBPackage { - sysPackages: IGBPackage[] = null - channel: WhatsappDirectLine + public sysPackages: IGBPackage[] = null; + public channel: WhatsappDirectLine; - loadPackage(core: IGBCoreService, sequelize: Sequelize): void { + public loadPackage(core: IGBCoreService, sequelize: Sequelize): void { } - unloadPackage(core: IGBCoreService): void { + public unloadPackage(core: IGBCoreService): void { } - loadBot(min: GBMinInstance): void { - + public loadBot(min: GBMinInstance): void { + // Only loads engine if it is defined on services.json. - if (min.instance.whatsappBotKey != "") { + if (min.instance.whatsappBotKey != '') { this.channel = new WhatsappDirectLine(min.botId, min.instance.whatsappBotKey, min.instance.whatsappServiceKey, - min.instance.whatsappServiceNumber, min.instance.whatsappServiceUrl, min.instance.whatsappServiceWebhookUrl) + min.instance.whatsappServiceNumber, min.instance.whatsappServiceUrl, min.instance.whatsappServiceWebhookUrl); } } - unloadBot(min: GBMinInstance): void { + public unloadBot(min: GBMinInstance): void { } - onNewSession(min: GBMinInstance, step: any): void { + public onNewSession(min: GBMinInstance, step: any): void { } } diff --git a/packages/whatsapp.gblib/services/WhatsappDirectLine.ts b/packages/whatsapp.gblib/services/WhatsappDirectLine.ts index f27a24be..97d806bf 100644 --- a/packages/whatsapp.gblib/services/WhatsappDirectLine.ts +++ b/packages/whatsapp.gblib/services/WhatsappDirectLine.ts @@ -30,45 +30,45 @@ | | \*****************************************************************************/ -const Path = require("path") -const Fs = require("fs") -const _ = require("lodash") -const Parse = require("csv-parse") -const Async = require("async") -const UrlJoin = require("url-join") -const Walk = require("fs-walk") -const logger = require("../../../src/logger") -const Swagger = require('swagger-client') -const rp = require('request-promise') -import * as request from "request-promise-native" +const Path = require('path'); +const Fs = require('fs'); +const _ = require('lodash'); +const Parse = require('csv-parse'); +const Async = require('async'); +const UrlJoin = require('url-join'); +const Walk = require('fs-walk'); +const logger = require('../../../src/logger'); +const Swagger = require('swagger-client'); +const rp = require('request-promise'); +import * as request from 'request-promise-native'; -import { GBServiceCallback, GBService, IGBInstance } from "botlib" +import { GBService, GBServiceCallback, IGBInstance } from 'botlib'; export class WhatsappDirectLine extends GBService { - pollInterval = 1000 - directLineClientName = 'DirectLineClient' - directLineSpecUrl = 'https://docs.botframework.com/en-us/restapi/directline3/swagger.json' + public pollInterval = 1000; + public directLineClientName = 'DirectLineClient'; + public directLineSpecUrl = 'https://docs.botframework.com/en-us/restapi/directline3/swagger.json'; - directLineClient: any - whatsappServiceKey: string - whatsappServiceNumber: string - whatsappServiceUrl: string - whatsappServiceWebhookUrl: string - botId: string - watermark: string = null + public directLineClient: any; + public whatsappServiceKey: string; + public whatsappServiceNumber: string; + public whatsappServiceUrl: string; + public whatsappServiceWebhookUrl: string; + public botId: string; + public watermark: string = null; - conversationIds = {} + public conversationIds = {}; constructor(botId, directLineSecret, whatsappServiceKey, whatsappServiceNumber, whatsappServiceUrl, whatsappServiceWebhookUrl) { - super() + super(); - this.botId = botId - this.whatsappServiceKey = whatsappServiceKey - this.whatsappServiceNumber = whatsappServiceNumber - this.whatsappServiceUrl = whatsappServiceUrl - this.whatsappServiceWebhookUrl = whatsappServiceWebhookUrl + this.botId = botId; + this.whatsappServiceKey = whatsappServiceKey; + this.whatsappServiceNumber = whatsappServiceNumber; + this.whatsappServiceUrl = whatsappServiceUrl; + this.whatsappServiceWebhookUrl = whatsappServiceWebhookUrl; // TODO: Migrate to Swagger 3. this.directLineClient = rp(this.directLineSpecUrl) @@ -76,16 +76,16 @@ export class WhatsappDirectLine extends GBService { return new Swagger({ spec: JSON.parse(spec.trim()), usePromise: true - }) + }); }) .then(async (client) => { client.clientAuthorizations.add('AuthorizationBotConnector', - new Swagger.ApiKeyAuthorization('Authorization', 'Bearer ' + - directLineSecret, 'header')) + new Swagger.ApiKeyAuthorization('Authorization', 'Bearer ' + + directLineSecret, 'header')); - var options = { + const options = { method: 'POST', - url: UrlJoin(this.whatsappServiceUrl, "webhook"), + url: UrlJoin(this.whatsappServiceUrl, 'webhook'), qs: { token: this.whatsappServiceKey, @@ -96,67 +96,66 @@ export class WhatsappDirectLine extends GBService { { 'cache-control': 'no-cache' } - } + }; try { - const result = await request.post(options) - logger.info(result) + const result = await request.post(options); + logger.info(result); } catch (error) { - logger.error('Error initializing 3rd party Whatsapp provider.', error) + logger.error('Error initializing 3rd party Whatsapp provider.', error); } - return client + return client; }) .catch((err) => { - logger.error('Error initializing DirectLine client', err) - }) + logger.error('Error initializing DirectLine client', err); + }); } - received(req, res) { - let text = req.body.messages[0].body - let from = req.body.messages[0].author.split('@')[0] - let fromName = req.body.messages[0].senderName + public received(req, res) { + const text = req.body.messages[0].body; + const from = req.body.messages[0].author.split('@')[0]; + const fromName = req.body.messages[0].senderName; if (req.body.messages[0].fromMe) { - return // Exit here. + return; // Exit here. } - logger.info(`GBWhatsapp: Hook called. from: ${from}(${fromName}), text: ${text})`) + logger.info(`GBWhatsapp: Hook called. from: ${from}(${fromName}), text: ${text})`); - let conversationId = this.conversationIds[from] + const conversationId = this.conversationIds[from]; this.directLineClient.then((client) => { if (this.conversationIds[from] == null) { - logger.info(`GBWhatsapp: Starting new conversation on Bot.`) + logger.info(`GBWhatsapp: Starting new conversation on Bot.`); client.Conversations.Conversations_StartConversation() .then((response) => { - return response.obj.conversationId + return response.obj.conversationId; }) .then((conversationId) => { - this.conversationIds[from] = conversationId + this.conversationIds[from] = conversationId; this.inputMessage(client, conversationId, text, - from, fromName) + from, fromName); - this.pollMessages(client, conversationId, from, fromName) + this.pollMessages(client, conversationId, from, fromName); }) .catch((err) => { - console.error('Error starting conversation', err) - }) + console.error('Error starting conversation', err); + }); } else { this.inputMessage(client, conversationId, text, - from, fromName) + from, fromName); } - res.end() - }) + res.end(); + }); } - - inputMessage(client, conversationId, text, from, fromName) { + public inputMessage(client, conversationId, text, from, fromName) { client.Conversations.Conversations_PostActivity( { @@ -172,15 +171,15 @@ export class WhatsappDirectLine extends GBService { replyToId: from } }).catch((err) => { - logger.error(`GBWhatsapp: Error receiving message: ${err}.`) - }) + logger.error(`GBWhatsapp: Error receiving message: ${err}.`); + }); } - pollMessages(client, conversationId, from, fromName) { + public pollMessages(client, conversationId, from, fromName) { - logger.info(`GBWhatsapp: Starting polling message for conversationId: - ${conversationId}.`) + logger.info(`GBWhatsapp: Starting polling message for conversationId: + ${conversationId}.`); setInterval(() => { client.Conversations.Conversations_GetActivities({ @@ -188,67 +187,67 @@ export class WhatsappDirectLine extends GBService { conversationId, watermark: this.watermark }) .then((response) => { - this.watermark = response.obj.watermark - return response.obj.activities + this.watermark = response.obj.watermark; + return response.obj.activities; }) .then((activities) => { - this.printMessages(activities, conversationId, from, fromName) - }) - }, this.pollInterval) + this.printMessages(activities, conversationId, from, fromName); + }); + }, this.pollInterval); } - printMessages(activities, conversationId, from, fromName) { + public printMessages(activities, conversationId, from, fromName) { if (activities && activities.length) { // Ignore own messages. - activities = activities.filter((m) => { return (m.from.id === "GeneralBots") && m.type === "message" }) - - if (activities.length) { + activities = activities.filter((m) => (m.from.id === 'GeneralBots') && m.type === 'message'); + + if (activities.length) { // Print other messages. activities.forEach(activity => { - this.printMessage(activity, conversationId, from, fromName) - }) + this.printMessage(activity, conversationId, from, fromName); + }); } } } - printMessage(activity, conversationId, from, fromName) { + public printMessage(activity, conversationId, from, fromName) { - let output = "" + let output = ''; if (activity.text) { - logger.info(`GBWhatsapp: MSG: ${activity.text}`) - output = activity.text + logger.info(`GBWhatsapp: MSG: ${activity.text}`); + output = activity.text; } if (activity.attachments) { activity.attachments.forEach((attachment) => { switch (attachment.contentType) { - case "application/vnd.microsoft.card.hero": - output += `\n${this.renderHeroCard(attachment)}` - break + case 'application/vnd.microsoft.card.hero': + output += `\n${this.renderHeroCard(attachment)}`; + break; - case "image/png": - logger.info('Opening the requested image ' + attachment.contentUrl) - output += `\n${attachment.contentUrl}` - break + case 'image/png': + logger.info('Opening the requested image ' + attachment.contentUrl); + output += `\n${attachment.contentUrl}`; + break; } - }) + }); } - this.sendToDevice(conversationId, from, fromName, output) + this.sendToDevice(conversationId, from, fromName, output); } - renderHeroCard(attachment) { - return `${attachment.content.title} - ${attachment.content.text}` + public renderHeroCard(attachment) { + return `${attachment.content.title} - ${attachment.content.text}`; } - async sendToDevice(conversationId, to, toName, msg) { - var options = { + public async sendToDevice(conversationId, to, toName, msg) { + const options = { method: 'POST', url: UrlJoin(this.whatsappServiceUrl, 'message'), qs: @@ -261,8 +260,8 @@ export class WhatsappDirectLine extends GBService { { 'cache-control': 'no-cache' } - } + }; - const result = await request.get(options) + const result = await request.get(options); } } diff --git a/src/app.ts b/src/app.ts index 73f13646..1726d160 100644 --- a/src/app.ts +++ b/src/app.ts @@ -37,30 +37,30 @@ 'use strict'; -const logger = require("./logger"); -const express = require("express"); -const bodyParser = require("body-parser"); +const logger = require('./logger'); +const express = require('express'); +const bodyParser = require('body-parser'); const opn = require('opn'); -import { GBConfigService } from "../packages/core.gbapp/services/GBConfigService"; -import { GBConversationalService } from "../packages/core.gbapp/services/GBConversationalService"; -import { GBMinService } from "../packages/core.gbapp/services/GBMinService"; -import { GBDeployer } from "../packages/core.gbapp/services/GBDeployer"; -import { GBWhatsappPackage } from "./../packages/whatsapp.gblib/index"; -import { GBCoreService } from "../packages/core.gbapp/services/GBCoreService"; -import { GBImporter } from "../packages/core.gbapp/services/GBImporter"; -import { GBAnalyticsPackage } from "../packages/analytics.gblib"; -import { GBCorePackage } from "../packages/core.gbapp"; -import { GBKBPackage } from "../packages/kb.gbapp"; -import { GBSecurityPackage } from "../packages/security.gblib"; -import { GBAdminPackage } from "../packages/admin.gbapp/index"; -import { GBCustomerSatisfactionPackage } from "../packages/customer-satisfaction.gbapp"; -import { GBAdminService } from "../packages/admin.gbapp/services/GBAdminService"; -import { GuaribasInstance } from "../packages/core.gbapp/models/GBModel"; -import { AzureDeployerService } from "../packages/azuredeployer.gbapp/services/AzureDeployerService"; -import { IGBPackage, IGBInstance } from "botlib"; +import { IGBInstance, IGBPackage } from 'botlib'; +import { GBAdminPackage } from '../packages/admin.gbapp/index'; +import { GBAdminService } from '../packages/admin.gbapp/services/GBAdminService'; +import { GBAnalyticsPackage } from '../packages/analytics.gblib'; +import { AzureDeployerService } from '../packages/azuredeployer.gbapp/services/AzureDeployerService'; +import { GBCorePackage } from '../packages/core.gbapp'; +import { GuaribasInstance } from '../packages/core.gbapp/models/GBModel'; +import { GBConfigService } from '../packages/core.gbapp/services/GBConfigService'; +import { GBConversationalService } from '../packages/core.gbapp/services/GBConversationalService'; +import { GBCoreService } from '../packages/core.gbapp/services/GBCoreService'; +import { GBDeployer } from '../packages/core.gbapp/services/GBDeployer'; +import { GBImporter } from '../packages/core.gbapp/services/GBImporter'; +import { GBMinService } from '../packages/core.gbapp/services/GBMinService'; +import { GBCustomerSatisfactionPackage } from '../packages/customer-satisfaction.gbapp'; +import { GBKBPackage } from '../packages/kb.gbapp'; +import { GBSecurityPackage } from '../packages/security.gblib'; +import { GBWhatsappPackage } from './../packages/whatsapp.gblib/index'; -let appPackages = new Array(); +const appPackages = new Array(); /** * General Bots open-core entry point. @@ -71,7 +71,7 @@ export class GBServer { * Program entry-point. */ - static run() { + public static run() { logger.info(`The Bot Server is in STARTING mode...`); @@ -79,8 +79,8 @@ export class GBServer { // bot instance. This allows the same server to attend multiple Bot on // the Marketplace until GB get serverless. - let port = process.env.port || process.env.PORT || 4242; - let server = express(); + const port = process.env.port || process.env.PORT || 4242; + const server = express(); server.use(bodyParser.json()); // to support JSON-encoded bodies server.use( @@ -99,15 +99,15 @@ export class GBServer { // Reads basic configuration, initialize minimal services. GBConfigService.init(); - let core = new GBCoreService(); + const core = new GBCoreService(); // Ensures cloud / on-premises infrastructure is setup. logger.info(`Establishing a development local proxy (ngrok)...`); - let proxyAddress = await core.ensureProxy(port); + const proxyAddress = await core.ensureProxy(port); - let deployer = new GBDeployer(core, new GBImporter(core)); - let azureDeployer = new AzureDeployerService(deployer); + const deployer = new GBDeployer(core, new GBImporter(core)); + const azureDeployer = new AzureDeployerService(deployer); try { await core.initDatabase(); @@ -117,7 +117,7 @@ export class GBServer { bootInstance = await azureDeployer.deployFarm(proxyAddress); } catch (error) { logger.warn( - "In case of error, please cleanup any infrastructure objects created during this procedure and .env before running again." + 'In case of error, please cleanup any infrastructure objects created during this procedure and .env before running again.' ); throw error; } @@ -132,13 +132,13 @@ export class GBServer { // Check admin password. - let conversationalService = new GBConversationalService(core); - let adminService = new GBAdminService(core); - let password = GBConfigService.get("ADMIN_PASS"); + const conversationalService = new GBConversationalService(core); + const adminService = new GBAdminService(core); + const password = GBConfigService.get('ADMIN_PASS'); if (!GBAdminService.StrongRegex.test(password)) { throw new Error( - "Please, define a really strong password in ADMIN_PASS environment variable before running the server." + 'Please, define a really strong password in ADMIN_PASS environment variable before running the server.' ); } @@ -155,7 +155,7 @@ export class GBServer { GBWhatsappPackage ].forEach(e => { logger.info(`Loading sys package: ${e.name}...`); - let p = Object.create(e.prototype) as IGBPackage; + const p = Object.create(e.prototype) as IGBPackage; p.loadPackage(core, core.sequelize); }); @@ -165,9 +165,9 @@ export class GBServer { let instances: GuaribasInstance[]; try { instances = await core.loadInstances(); - let instance = instances[0]; - - if (process.env.NODE_ENV === "development") { + const instance = instances[0]; + + if (process.env.NODE_ENV === 'development') { logger.info(`Updating bot endpoint to local reverse proxy (ngrok)...`); await azureDeployer.updateBotProxy( @@ -177,30 +177,30 @@ export class GBServer { ); } } catch (error) { - if (error.parent.code === "ELOGIN") { - let group = GBConfigService.get("CLOUD_GROUP"); - let serverName = GBConfigService.get("STORAGE_SERVER").split( - ".database.windows.net" + if (error.parent.code === 'ELOGIN') { + const group = GBConfigService.get('CLOUD_GROUP'); + const serverName = GBConfigService.get('STORAGE_SERVER').split( + '.database.windows.net' )[0]; await azureDeployer.openStorageFirewall(group, serverName); } else { // Check if storage is empty and needs formatting. - let isInvalidObject = + const isInvalidObject = error.parent.number == 208 || error.parent.errno == 1; // MSSQL or SQLITE. if (isInvalidObject) { - if (GBConfigService.get("STORAGE_SYNC") != "true") { - throw `Operating storage is out of sync or there is a storage connection error. Try setting STORAGE_SYNC to true in .env file. Error: ${ + if (GBConfigService.get('STORAGE_SYNC') != 'true') { + throw new Error(`Operating storage is out of sync or there is a storage connection error. Try setting STORAGE_SYNC to true in .env file. Error: ${ error.message - }.`; + }.`); } else { logger.info( `Storage is empty. After collecting storage structure from all .gbapps it will get synced.` ); } } else { - throw `Cannot connect to operating storage: ${error.message}.`; + throw new Error(`Cannot connect to operating storage: ${error.message}.`); } } } @@ -213,7 +213,7 @@ export class GBServer { // If instances is undefined here it's because storage has been formatted. // Load all instances from .gbot found on deploy package directory. if (!instances) { - let saveInstance = new GuaribasInstance(bootInstance); + const saveInstance = new GuaribasInstance(bootInstance); await saveInstance.save(); instances = await core.loadInstances(); } @@ -221,7 +221,7 @@ export class GBServer { // Setup server dynamic (per bot instance) resources and listeners. logger.info(`Publishing instances...`); - let minService = new GBMinService( + const minService = new GBMinService( core, conversationalService, adminService, @@ -230,13 +230,13 @@ export class GBServer { await minService.buildMin(server, appPackages, instances); logger.info(`The Bot Server is in RUNNING mode...`); - if (process.env.NODE_ENV === "development") { + if (process.env.NODE_ENV === 'development') { opn('http://localhost:4242'); } return core; } catch (err) { - logger.error(`STOP: ${err} ${err.stack ? err.stack : ""}`); + logger.error(`STOP: ${err} ${err.stack ? err.stack : ''}`); process.exit(1); } })(); diff --git a/src/logger.ts b/src/logger.ts index b934b918..6a77c89a 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -30,7 +30,7 @@ | | \*****************************************************************************/ -const { createLogger, format, transports } = require('winston') +const { createLogger, format, transports } = require('winston'); const config = { levels: { @@ -53,7 +53,7 @@ const config = { silly: 'magenta', custom: 'yellow' } -} +}; const logger = createLogger({ format: format.combine( @@ -62,11 +62,11 @@ const logger = createLogger({ format.label({ label: 'GeneralBots' }), format.timestamp(), format.printf(nfo => { - return `${nfo.timestamp} [${nfo.label}] ${nfo.level}: ${nfo.message}` + return `${nfo.timestamp} [${nfo.label}] ${nfo.level}: ${nfo.message}`; }) ), levels: config.levels, - transports: [new transports.Console()] -}) + transports: [new transports.Console()] +}); -module.exports=logger \ No newline at end of file +module.exports = logger;