From 956db3e5d7b90478b8246aef0abd85c2a2636f70 Mon Sep 17 00:00:00 2001 From: Cody Swartz Date: Sun, 7 Oct 2018 03:08:20 -0700 Subject: [PATCH 01/20] Readme Update changes badge table Adds maintainability and test coverage --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 03dc51f..d4524e8 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ # hackbot -|branch|build status|bots| -|---|---|---| -|master|[![Build Status](https://travis-ci.org/osu-cascades/hackbot.svg?branch=master)](https://travis-ci.org/osu-cascades/hackbot)| [![Greenkeeper badge](https://badges.greenkeeper.io/osu-cascades/hackbot.svg)](https://greenkeeper.io/) | -|staging|[![Build Status](https://travis-ci.org/osu-cascades/hackbot.svg?branch=staging)](https://travis-ci.org/osu-cascades/hackbot)| - +|What|Badge| +|---|---| +|Master Build|[![Build Status](https://travis-ci.org/osu-cascades/hackbot.svg?branch=master)](https://travis-ci.org/osu-cascades/hackbot)| +|Staging Build|[![Build Status](https://travis-ci.org/osu-cascades/hackbot.svg?branch=dev)](https://travis-ci.org/osu-cascades/hackbot)| +|Maintainability|[![Maintainability](https://api.codeclimate.com/v1/badges/96320fe592c30381915f/maintainability)](https://codeclimate.com/github/osu-cascades/hackbot)| +|Test Coverage|[![Test Coverage](https://api.codeclimate.com/v1/badges/96320fe592c30381915f/test_coverage)](https://codeclimate.com/github/osu-cascades/hackbot)| +|GreenKeeper|[![Greenkeeper badge](https://badges.greenkeeper.io/osu-cascades/hackbot.svg)](https://greenkeeper.io/)| A Discord bot for the Cascades Tech Club [Discord](http://discordapp.com) server. To add a command, see the [Commands](#commands) section below. From b97cb50f366d61a8f9b95a64fc426c20b56ae7dc Mon Sep 17 00:00:00 2001 From: Cody Swartz Date: Sun, 7 Oct 2018 03:19:12 -0700 Subject: [PATCH 02/20] Add part about Jest extension in README --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 03dc51f..6109d01 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ |master|[![Build Status](https://travis-ci.org/osu-cascades/hackbot.svg?branch=master)](https://travis-ci.org/osu-cascades/hackbot)| [![Greenkeeper badge](https://badges.greenkeeper.io/osu-cascades/hackbot.svg)](https://greenkeeper.io/) | |staging|[![Build Status](https://travis-ci.org/osu-cascades/hackbot.svg?branch=staging)](https://travis-ci.org/osu-cascades/hackbot)| - A Discord bot for the Cascades Tech Club [Discord](http://discordapp.com) server. To add a command, see the [Commands](#commands) section below. ## Setup @@ -36,7 +35,7 @@ In a nutshell, work in the [dev](https://github.com/osu-cascades/hackbot/tree/de In all cases, be sure to run the test suite to make sure all tests pass. _All tests should be passing before you merge dev to master_. -You should embrace testing. _hackbot_ uses the [Jest](https://facebook.github.io/jest/) test framework. Have two console panes open: one for running and watching the test suite, and the other for everything else you need to do. You can run the test suite once with `npm test`. Once you get tired of running `npm test` manually, use the watcher by running `npm run test:watch`. It is sweet and people will think you are a super hacker. Look at `__tests__/commands/add.test.ts` for an example of how to test commands and their channel messages. +You should embrace testing. _hackbot_ uses the [Jest](https://facebook.github.io/jest/) test framework. Have two console panes open: one for running and watching the test suite, and the other for everything else you need to do. You can run the test suite once with `npm test`. Once you get tired of running `npm test` manually, use the watcher by running `npm run test:watch`. It is sweet and people will think you are a super hacker. Look at `__tests__/commands/add.test.ts` for an example of how to test commands and their channel messages. If you use VSCode for your IDE there's a Jest extension that will run a watcher and give you inline updates on your tests, as well as a few other awesome features! Please refer to [airbnb's style guide](https://github.com/airbnb/javascript) while coding. From 8fd6973c52e07b07e3675e000bd74f83c089086c Mon Sep 17 00:00:00 2001 From: Cody Swartz Date: Tue, 6 Nov 2018 00:02:39 -0800 Subject: [PATCH 03/20] Update packages --- package-lock.json | 1108 +++++++++++++++++++++++---------------------- package.json | 14 +- 2 files changed, 584 insertions(+), 538 deletions(-) diff --git a/package-lock.json b/package-lock.json index ca79c34..d610f75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,14 +44,14 @@ }, "@types/events": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==", "dev": true }, "@types/glob": { - "version": "5.0.35", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz", - "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", "dev": true, "requires": { "@types/events": "*", @@ -60,9 +60,9 @@ } }, "@types/jest": { - "version": "23.3.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-23.3.1.tgz", - "integrity": "sha512-/UMY+2GkOZ27Vrc51pqC5J8SPd39FKt7kkoGAtWJ8s4msj0b15KehDWIiJpWY3/7tLxBQLLzJhIBhnEsXdzpgw==", + "version": "23.3.9", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-23.3.9.tgz", + "integrity": "sha512-wNMwXSUcwyYajtbayfPp55tSayuDVU6PfY5gzvRSj80UvxdXEJOVPnUVajaOp7NgXLm+1e2ZDLULmpsU9vDvQw==", "dev": true }, "@types/lodash": { @@ -87,9 +87,9 @@ "dev": true }, "@types/node": { - "version": "10.9.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.9.4.tgz", - "integrity": "sha512-fCHV45gS+m3hH17zgkgADUSi2RR1Vht6wOZ0jyHP8rjiQra9f+mIcgwPQHllmDocYOstIEbKlxbFDYlgrTPYqw==", + "version": "10.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.2.tgz", + "integrity": "sha512-53ElVDSnZeFUUFIYzI8WLQ25IhWzb6vbddNp8UHlXQyU0ET2RhV5zg0NfubzU7iNMh5bBXb0htCzfvrSVNgzaQ==", "dev": true }, "abab": { @@ -115,17 +115,17 @@ }, "dependencies": { "acorn": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.1.tgz", - "integrity": "sha512-SiwgrRuRD2D1R6qjwwoopKcCTkmmIWjy1M15Wv+Nk/7VUsBad4P8GOPft2t6coDZG0TuR5dq9o1v0g8wo7F6+A==", + "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.0.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.0.1.tgz", - "integrity": "sha512-PqVQ8c6a3kyqdsUZlC7nljp3FFuxipBRHKu+7C1h8QygBFlzTaDX5HD383jej3Peed+1aDG8HwkfB1Z1HMNPkw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.0.tgz", + "integrity": "sha512-ugTb7Lq7u4GfWSqqpwE0bGyoBZNMTok/zDBXxfEG0QM50jNlGhIWjRC1pPN7bvV1anhF+bs+/gNcRw+o55Evbg==", "dev": true }, "ajv": { @@ -138,20 +138,6 @@ "fast-deep-equal": "^1.0.0", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.3.0" - }, - "dependencies": { - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - } } }, "ansi-escapes": { @@ -468,17 +454,6 @@ "dev": true, "requires": { "default-require-extensions": "^1.0.0" - }, - "dependencies": { - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", - "dev": true, - "requires": { - "strip-bom": "^2.0.0" - } - } } }, "argparse": { @@ -703,14 +678,6 @@ "lodash": "^4.17.4", "source-map": "^0.5.7", "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - } } }, "babel-helpers": { @@ -724,13 +691,13 @@ } }, "babel-jest": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.4.tgz", - "integrity": "sha512-A9NB6/lZhYyypR9ATryOSDcqBaqNdzq4U+CN+/wcMsLcmKkPxQEoTKLajGfd3IkxNyVBT8NewUK2nWyGbSzHEQ==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz", + "integrity": "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==", "dev": true, "requires": { - "babel-plugin-istanbul": "^4.1.5", - "babel-preset-jest": "^22.4.4" + "babel-plugin-istanbul": "^4.1.6", + "babel-preset-jest": "^23.2.0" } }, "babel-messages": { @@ -755,9 +722,9 @@ } }, "babel-plugin-jest-hoist": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz", - "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==", + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", + "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", "dev": true }, "babel-plugin-syntax-object-rest-spread": { @@ -767,12 +734,12 @@ "dev": true }, "babel-preset-jest": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz", - "integrity": "sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==", + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", + "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^22.4.4", + "babel-plugin-jest-hoist": "^23.2.0", "babel-plugin-syntax-object-rest-spread": "^6.13.0" } }, @@ -840,14 +807,6 @@ "globals": "^9.18.0", "invariant": "^2.2.2", "lodash": "^4.17.4" - }, - "dependencies": { - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - } } }, "babel-types": { @@ -860,14 +819,6 @@ "esutils": "^2.0.2", "lodash": "^4.17.4", "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } } }, "babylon": { @@ -953,7 +904,6 @@ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, - "optional": true, "requires": { "tweetnacl": "^0.14.3" } @@ -979,9 +929,9 @@ } }, "browser-process-hrtime": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz", - "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", "dev": true }, "browser-resolve": { @@ -1001,6 +951,15 @@ } } }, + "bs-logger": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.5.tgz", + "integrity": "sha512-uFLE0LFMxrH8Z5Hd9QgivvRbrl/NFkOTHzGhlqQxsnmx5JBLrp4bc249afLL+GccyY/8hkcGi2LpVaOzaEY0nQ==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "^2.0.0" + } + }, "bser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", @@ -1047,6 +1006,12 @@ } } }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", @@ -1077,23 +1042,12 @@ "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "ci-info": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.5.1.tgz", - "integrity": "sha512-fKFIKXaYiL1exImwJ0AhR/6jxFPSKQBk2ayV5NiNoruUs2+rxC2kNw0EG+1Z9dugZRdCrppskQ8DN2cyaUM1Hw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", "dev": true }, "class-utils": { @@ -1136,12 +1090,6 @@ "wrap-ansi": "^2.0.0" } }, - "closest-file-data": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/closest-file-data/-/closest-file-data-0.1.4.tgz", - "integrity": "sha1-l1+HwTLymdJKA3W59jyj+4j3Kzo=", - "dev": true - }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -1180,9 +1128,9 @@ "dev": true }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "dev": true, "requires": { "delayed-stream": "~1.0.0" @@ -1232,6 +1180,17 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "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" + } + }, "cssom": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", @@ -1257,13 +1216,13 @@ } }, "data-urls": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.1.tgz", - "integrity": "sha512-0HdcMZzK6ubMUnsMmQmG0AcLQPvbvb47R0+7CCZQCYgcd8OUWG91CG7sM6GoXgjz+WLl4ArFzHtBMy/QqSF4eg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", "dev": true, "requires": { "abab": "^2.0.0", - "whatwg-mimetype": "^2.1.0", + "whatwg-mimetype": "^2.2.0", "whatwg-url": "^7.0.0" }, "dependencies": { @@ -1307,6 +1266,15 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + } + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -1434,16 +1402,15 @@ } }, "dotenv": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", - "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.1.0.tgz", + "integrity": "sha512-/veDn2ztgRlB7gKmE3i9f6CmDIyXAy6d5nBq+whO9SLX+Zs1sXEgFLPi+aSuWqUuusMfbi84fT8j34fs1HaYUw==" }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, - "optional": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -1472,14 +1439,14 @@ } }, "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "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.1", + "is-callable": "^1.1.4", "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" + "is-symbol": "^1.0.2" } }, "escape-string-regexp": { @@ -1556,19 +1523,6 @@ "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" - }, - "dependencies": { - "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" - } - } } }, "exit": { @@ -1596,17 +1550,17 @@ } }, "expect": { - "version": "22.4.3", - "resolved": "http://registry.npmjs.org/expect/-/expect-22.4.3.tgz", - "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", + "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", "dev": true, "requires": { "ansi-styles": "^3.2.0", - "jest-diff": "^22.4.3", - "jest-get-type": "^22.4.3", - "jest-matcher-utils": "^22.4.3", - "jest-message-util": "^22.4.3", - "jest-regex-util": "^22.4.3" + "jest-diff": "^23.6.0", + "jest-get-type": "^22.1.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0" } }, "extend": { @@ -1651,6 +1605,12 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -1750,13 +1710,13 @@ "dev": true }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, @@ -1769,17 +1729,6 @@ "map-cache": "^0.2.2" } }, - "fs-extra": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", - "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1826,14 +1775,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1848,20 +1795,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -1978,8 +1922,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -1991,7 +1934,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2006,7 +1948,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2014,14 +1955,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -2040,7 +1979,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -2121,8 +2059,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -2134,7 +2071,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -2256,7 +2192,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2393,10 +2328,16 @@ "is-glob": "^2.0.0" } }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, "growly": { @@ -2473,6 +2414,12 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -2569,6 +2516,15 @@ "sshpk": "^1.7.0" } }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "import-local": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", @@ -2803,10 +2759,13 @@ "dev": true }, "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } }, "is-typedarray": { "version": "1.0.0", @@ -2945,9 +2904,9 @@ }, "dependencies": { "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "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" @@ -2971,19 +2930,19 @@ } }, "jest": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.4.tgz", - "integrity": "sha512-eBhhW8OS/UuX3HxgzNBSVEVhSuRDh39Z1kdYkQVWna+scpgsrD7vSeBI7tmEvsguPDMnfJodW28YBnhv/BzSew==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-23.6.0.tgz", + "integrity": "sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==", "dev": true, "requires": { "import-local": "^1.0.0", - "jest-cli": "^22.4.4" + "jest-cli": "^23.6.0" }, "dependencies": { "jest-cli": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.4.tgz", - "integrity": "sha512-I9dsgkeyjVEEZj9wrGrqlH+8OlNob9Iptyl+6L5+ToOLJmHm4JwOPatin1b2Bzp5R5YRQJ+oiedx7o1H7wJzhA==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz", + "integrity": "sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==", "dev": true, "requires": { "ansi-escapes": "^3.0.0", @@ -2993,105 +2952,120 @@ "graceful-fs": "^4.1.11", "import-local": "^1.0.0", "is-ci": "^1.0.10", - "istanbul-api": "^1.1.14", - "istanbul-lib-coverage": "^1.1.1", - "istanbul-lib-instrument": "^1.8.0", - "istanbul-lib-source-maps": "^1.2.1", - "jest-changed-files": "^22.2.0", - "jest-config": "^22.4.4", - "jest-environment-jsdom": "^22.4.1", + "istanbul-api": "^1.3.1", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-source-maps": "^1.2.4", + "jest-changed-files": "^23.4.2", + "jest-config": "^23.6.0", + "jest-environment-jsdom": "^23.4.0", "jest-get-type": "^22.1.0", - "jest-haste-map": "^22.4.2", - "jest-message-util": "^22.4.0", - "jest-regex-util": "^22.1.0", - "jest-resolve-dependencies": "^22.1.0", - "jest-runner": "^22.4.4", - "jest-runtime": "^22.4.4", - "jest-snapshot": "^22.4.0", - "jest-util": "^22.4.1", - "jest-validate": "^22.4.4", - "jest-worker": "^22.2.2", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve-dependencies": "^23.6.0", + "jest-runner": "^23.6.0", + "jest-runtime": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "jest-watcher": "^23.4.0", + "jest-worker": "^23.2.0", "micromatch": "^2.3.11", "node-notifier": "^5.2.1", + "prompts": "^0.1.9", "realpath-native": "^1.0.0", "rimraf": "^2.5.4", "slash": "^1.0.0", "string-length": "^2.0.0", "strip-ansi": "^4.0.0", "which": "^1.2.12", - "yargs": "^10.0.3" + "yargs": "^11.0.0" } } } }, "jest-changed-files": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", - "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", + "version": "23.4.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz", + "integrity": "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==", "dev": true, "requires": { "throat": "^4.0.0" } }, "jest-config": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.4.tgz", - "integrity": "sha512-9CKfo1GC4zrXSoMLcNeDvQBfgtqGTB1uP8iDIZ97oB26RCUb886KkKWhVcpyxVDOUxbhN+uzcBCeFe7w+Iem4A==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz", + "integrity": "sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==", "dev": true, "requires": { + "babel-core": "^6.0.0", + "babel-jest": "^23.6.0", "chalk": "^2.0.1", "glob": "^7.1.1", - "jest-environment-jsdom": "^22.4.1", - "jest-environment-node": "^22.4.1", + "jest-environment-jsdom": "^23.4.0", + "jest-environment-node": "^23.4.0", "jest-get-type": "^22.1.0", - "jest-jasmine2": "^22.4.4", - "jest-regex-util": "^22.1.0", - "jest-resolve": "^22.4.2", - "jest-util": "^22.4.1", - "jest-validate": "^22.4.4", - "pretty-format": "^22.4.0" + "jest-jasmine2": "^23.6.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "pretty-format": "^23.6.0" } }, "jest-diff": { - "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", - "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", + "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", "dev": true, "requires": { "chalk": "^2.0.1", "diff": "^3.2.0", - "jest-get-type": "^22.4.3", - "pretty-format": "^22.4.3" + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" } }, "jest-docblock": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", - "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", + "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", "dev": true, "requires": { "detect-newline": "^2.1.0" } }, + "jest-each": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz", + "integrity": "sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "pretty-format": "^23.6.0" + } + }, "jest-environment-jsdom": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", - "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", + "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", "dev": true, "requires": { - "jest-mock": "^22.4.3", - "jest-util": "^22.4.3", + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0", "jsdom": "^11.5.1" } }, "jest-environment-node": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", - "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", + "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", "dev": true, "requires": { - "jest-mock": "^22.4.3", - "jest-util": "^22.4.3" + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0" } }, "jest-get-type": { @@ -3101,63 +3075,65 @@ "dev": true }, "jest-haste-map": { - "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", - "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz", + "integrity": "sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==", "dev": true, "requires": { "fb-watchman": "^2.0.0", "graceful-fs": "^4.1.11", - "jest-docblock": "^22.4.3", - "jest-serializer": "^22.4.3", - "jest-worker": "^22.4.3", + "invariant": "^2.2.4", + "jest-docblock": "^23.2.0", + "jest-serializer": "^23.0.1", + "jest-worker": "^23.2.0", "micromatch": "^2.3.11", "sane": "^2.0.0" } }, "jest-jasmine2": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz", - "integrity": "sha512-nK3vdUl50MuH7vj/8at7EQVjPGWCi3d5+6aCi7Gxy/XMWdOdbH1qtO/LjKbqD8+8dUAEH+BVVh7HkjpCWC1CSw==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz", + "integrity": "sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==", "dev": true, "requires": { + "babel-traverse": "^6.0.0", "chalk": "^2.0.1", "co": "^4.6.0", - "expect": "^22.4.0", - "graceful-fs": "^4.1.11", + "expect": "^23.6.0", "is-generator-fn": "^1.0.0", - "jest-diff": "^22.4.0", - "jest-matcher-utils": "^22.4.0", - "jest-message-util": "^22.4.0", - "jest-snapshot": "^22.4.0", - "jest-util": "^22.4.1", - "source-map-support": "^0.5.0" + "jest-diff": "^23.6.0", + "jest-each": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "pretty-format": "^23.6.0" } }, "jest-leak-detector": { - "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", - "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz", + "integrity": "sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==", "dev": true, "requires": { - "pretty-format": "^22.4.3" + "pretty-format": "^23.6.0" } }, "jest-matcher-utils": { - "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", - "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", + "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", "dev": true, "requires": { "chalk": "^2.0.1", - "jest-get-type": "^22.4.3", - "pretty-format": "^22.4.3" + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" } }, "jest-message-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", - "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", + "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", "dev": true, "requires": { "@babel/code-frame": "^7.0.0-beta.35", @@ -3168,81 +3144,86 @@ } }, "jest-mock": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", - "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", + "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", "dev": true }, "jest-regex-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", - "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", + "version": "23.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", + "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=", "dev": true }, "jest-resolve": { - "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", - "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz", + "integrity": "sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==", "dev": true, "requires": { - "browser-resolve": "^1.11.2", - "chalk": "^2.0.1" + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "realpath-native": "^1.0.0" } }, "jest-resolve-dependencies": { - "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", - "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz", + "integrity": "sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==", "dev": true, "requires": { - "jest-regex-util": "^22.4.3" + "jest-regex-util": "^23.3.0", + "jest-snapshot": "^23.6.0" } }, "jest-runner": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.4.tgz", - "integrity": "sha512-5S/OpB51igQW9xnkM5Tgd/7ZjiAuIoiJAVtvVTBcEBiXBIFzWM3BAMPBM19FX68gRV0KWyFuGKj0EY3M3aceeQ==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz", + "integrity": "sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==", "dev": true, "requires": { "exit": "^0.1.2", - "jest-config": "^22.4.4", - "jest-docblock": "^22.4.0", - "jest-haste-map": "^22.4.2", - "jest-jasmine2": "^22.4.4", - "jest-leak-detector": "^22.4.0", - "jest-message-util": "^22.4.0", - "jest-runtime": "^22.4.4", - "jest-util": "^22.4.1", - "jest-worker": "^22.2.2", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-docblock": "^23.2.0", + "jest-haste-map": "^23.6.0", + "jest-jasmine2": "^23.6.0", + "jest-leak-detector": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-runtime": "^23.6.0", + "jest-util": "^23.4.0", + "jest-worker": "^23.2.0", + "source-map-support": "^0.5.6", "throat": "^4.0.0" } }, "jest-runtime": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.4.tgz", - "integrity": "sha512-WRTj9m///npte1YjuphCYX7GRY/c2YvJImU9t7qOwFcqHr4YMzmX6evP/3Sehz5DKW2Vi8ONYPCFWe36JVXxfw==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz", + "integrity": "sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==", "dev": true, "requires": { "babel-core": "^6.0.0", - "babel-jest": "^22.4.4", - "babel-plugin-istanbul": "^4.1.5", + "babel-plugin-istanbul": "^4.1.6", "chalk": "^2.0.1", "convert-source-map": "^1.4.0", "exit": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.1.11", - "jest-config": "^22.4.4", - "jest-haste-map": "^22.4.2", - "jest-regex-util": "^22.1.0", - "jest-resolve": "^22.4.2", - "jest-util": "^22.4.1", - "jest-validate": "^22.4.4", - "json-stable-stringify": "^1.0.1", + "jest-config": "^23.6.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", "micromatch": "^2.3.11", "realpath-native": "^1.0.0", "slash": "^1.0.0", "strip-bom": "3.0.0", "write-file-atomic": "^2.1.0", - "yargs": "^10.0.3" + "yargs": "^11.0.0" }, "dependencies": { "strip-bom": { @@ -3254,46 +3235,53 @@ } }, "jest-serializer": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", - "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", + "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", "dev": true }, "jest-snapshot": { - "version": "22.4.3", - "resolved": "http://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", - "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz", + "integrity": "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==", "dev": true, "requires": { + "babel-types": "^6.0.0", "chalk": "^2.0.1", - "jest-diff": "^22.4.3", - "jest-matcher-utils": "^22.4.3", + "jest-diff": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-resolve": "^23.6.0", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^22.4.3" + "pretty-format": "^23.6.0", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + } } }, "jest-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", - "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", + "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", "dev": true, "requires": { "callsites": "^2.0.0", "chalk": "^2.0.1", "graceful-fs": "^4.1.11", "is-ci": "^1.0.10", - "jest-message-util": "^22.4.3", + "jest-message-util": "^23.4.0", "mkdirp": "^0.5.1", + "slash": "^1.0.0", "source-map": "^0.6.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 - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3303,22 +3291,32 @@ } }, "jest-validate": { - "version": "22.4.4", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.4.tgz", - "integrity": "sha512-dmlf4CIZRGvkaVg3fa0uetepcua44DHtktHm6rcoNVtYlpwe6fEJRkMFsaUVcFHLzbuBJ2cPw9Gl9TKfnzMVwg==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", + "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", "dev": true, "requires": { "chalk": "^2.0.1", - "jest-config": "^22.4.4", "jest-get-type": "^22.1.0", "leven": "^2.1.0", - "pretty-format": "^22.4.0" + "pretty-format": "^23.6.0" + } + }, + "jest-watcher": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", + "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "string-length": "^2.0.0" } }, "jest-worker": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", - "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", + "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", "dev": true, "requires": { "merge-stream": "^1.0.1" @@ -3344,8 +3342,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true + "dev": true }, "jsdom": { "version": "11.12.0", @@ -3381,20 +3378,23 @@ "xml-name-validator": "^3.0.0" } }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", @@ -3408,21 +3408,6 @@ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -3444,6 +3429,12 @@ "is-buffer": "^1.1.5" } }, + "kleur": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", + "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", + "dev": true + }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -3475,6 +3466,19 @@ "type-check": "~0.3.2" } }, + "load-json-file": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -3572,9 +3576,9 @@ } }, "merge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", - "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", "dev": true }, "merge-stream": { @@ -3608,18 +3612,18 @@ } }, "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", "dev": true }, "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", "dev": true, "requires": { - "mime-db": "~1.36.0" + "mime-db": "~1.37.0" } }, "mimic-fn": { @@ -3683,9 +3687,9 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "nan": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz", - "integrity": "sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", + "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", "dev": true, "optional": true }, @@ -3741,15 +3745,23 @@ "dev": true }, "node-notifier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", - "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.3.0.tgz", + "integrity": "sha512-AhENzCSGZnZJgBARsUjnQ7DnZbzyP+HxlVXuD0xqAnvL8q+OqtSX7lGg9e8nHzwXkMMXNdVeqq4E2M3EUAqX6Q==", "dev": true, "requires": { "growly": "^1.3.0", - "semver": "^5.4.1", + "semver": "^5.5.0", "shellwords": "^0.1.1", "which": "^1.3.0" + }, + "dependencies": { + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + } } }, "normalize-package-data": { @@ -3993,6 +4005,15 @@ "is-glob": "^2.0.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" + } + }, "parse5": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", @@ -4028,12 +4049,29 @@ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", @@ -4083,9 +4121,9 @@ "dev": true }, "pretty-format": { - "version": "22.4.3", - "resolved": "http://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", - "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "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", @@ -4109,6 +4147,16 @@ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, + "prompts": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz", + "integrity": "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==", + "dev": true, + "requires": { + "kleur": "^2.0.1", + "sisteransi": "^0.1.1" + } + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -4134,9 +4182,9 @@ "dev": true }, "randomatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", - "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", "dev": true, "requires": { "is-number": "^4.0.0", @@ -4158,6 +4206,48 @@ } } }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^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" + } + } + } + }, "readable-stream": { "version": "2.3.6", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", @@ -4171,17 +4261,6 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" - }, - "dependencies": { - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "realpath-native": { @@ -4751,6 +4830,12 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "sisteransi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz", + "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==", + "dev": true + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -4914,9 +4999,9 @@ "dev": true }, "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "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", @@ -4924,9 +5009,9 @@ } }, "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "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": { @@ -4940,9 +5025,9 @@ } }, "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "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 }, "split-string": { @@ -4961,9 +5046,9 @@ "dev": true }, "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", + "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -5030,6 +5115,15 @@ "strip-ansi": "^4.0.0" } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -5054,6 +5148,15 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, "symbol-tree": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", @@ -5071,87 +5174,6 @@ "object-assign": "^4.1.0", "read-pkg-up": "^1.0.1", "require-main-filename": "^1.0.1" - }, - "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" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.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" - } - }, - "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" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - } } }, "throat": { @@ -5166,6 +5188,12 @@ "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", "dev": true }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -5242,15 +5270,51 @@ "dev": true }, "ts-jest": { - "version": "23.1.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-23.1.4.tgz", - "integrity": "sha512-9rCSxbWfoZxxeXnSoEIzRNr9hDIQ8iEJAWmSRsWhDHDT8OeuGfURhJQUE8jtJlkyEygs6rngH8RYtHz9cfjmEA==", - "dev": true, - "requires": { - "closest-file-data": "^0.1.4", - "fs-extra": "6.0.1", - "json5": "^0.5.0", - "lodash": "^4.17.10" + "version": "23.10.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-23.10.4.tgz", + "integrity": "sha512-oV/wBwGUS7olSk/9yWMiSIJWbz5xO4zhftnY3gwv6s4SMg6WHF1m8XZNBvQOKQRiTAexZ9754Z13dxBq3Zgssw==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "json5": "2.x", + "make-error": "1.x", + "mkdirp": "0.x", + "semver": "^5.5", + "yargs-parser": "10.x" + }, + "dependencies": { + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "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" + } + } } }, "ts-node": { @@ -5356,8 +5420,7 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true + "dev": true }, "type-check": { "version": "0.3.2", @@ -5369,9 +5432,9 @@ } }, "typescript": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.0.3.tgz", - "integrity": "sha512-kk80vLW9iGtjMnIv11qyxLqZm20UklzuR2tL0QAnDIygIUIemcZMxlMWudl9OOt76H3ntVzcTiddQ1/pAAJMYg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.6.tgz", + "integrity": "sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==", "dev": true }, "uglify-js": { @@ -5429,12 +5492,6 @@ } } }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -5579,23 +5636,12 @@ "dev": true }, "whatwg-encoding": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.4.tgz", - "integrity": "sha512-vM9KWN6MP2mIHZ86ytcyIv7e8Cj3KTfO2nd2c8PFDqcI4bxFmQp83ibq4wadq7rL9l9sZV6o9B0LTt8ygGAAXg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, "requires": { - "iconv-lite": "0.4.23" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } + "iconv-lite": "0.4.24" } }, "whatwg-mimetype": { @@ -5727,9 +5773,9 @@ "dev": true }, "yargs": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", - "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "version": "11.1.0", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", "dev": true, "requires": { "cliui": "^4.0.0", @@ -5743,13 +5789,13 @@ "string-width": "^2.0.0", "which-module": "^2.0.0", "y18n": "^3.2.1", - "yargs-parser": "^8.1.0" + "yargs-parser": "^9.0.2" } }, "yargs-parser": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", - "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "dev": true, "requires": { "camelcase": "^4.1.0" diff --git a/package.json b/package.json index de9a7e6..4e4ba92 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "dependencies": { "axios": "^0.18.0", "discord.js": "^11.4.2", - "dotenv": "^4.0.0", + "dotenv": "^6.1.0", "glob": "^7.1.3", "lodash.camelcase": "^4.3.0", "moment": "^2.22.2" @@ -32,14 +32,14 @@ "devDependencies": { "@types/axios": "^0.14.0", "@types/dotenv": "^4.0.3", - "@types/glob": "^5.0.35", - "@types/jest": "^23.3.1", + "@types/glob": "^7.1.1", + "@types/jest": "^23.3.9", "@types/lodash.camelcase": "^4.3.4", - "@types/node": "^10.9.4", - "jest": "^22.4.4", - "ts-jest": "^23.1.4", + "@types/node": "^10.12.2", + "jest": "^23.6.0", + "ts-jest": "^23.10.4", "ts-node": "^7.0.1", "tslint": "^5.11.0", - "typescript": "^3.0.3" + "typescript": "^3.1.6" } } From a86c613e11cecb41dfaf43ca8413e27fc3f1b3c6 Mon Sep 17 00:00:00 2001 From: Cody Swartz Date: Tue, 6 Nov 2018 00:50:51 -0800 Subject: [PATCH 04/20] Fix broken tests after update --- __tests__/commands/add.test.ts | 4 ++-- __tests__/commands/gitProfile.test.ts | 6 ++--- __tests__/commands/lmgtfy.test.ts | 4 ++-- __tests__/commands/magic8ball.test.ts | 4 ++-- __tests__/commands/rules.test.ts | 4 ++-- __tests__/commands/say.test.ts | 4 ++-- __tests__/commands/source.test.ts | 4 ++-- __tests__/commands/version.test.ts | 5 ++-- __tests__/commands/xmas.test.ts | 4 ++-- __tests__/mockData/githubProfile.ts | 2 +- __tests__/mocks/discord.ts | 4 +++- typings/IGithubProfile.ts | 34 +++++++++++++++++++++++++++ 12 files changed, 58 insertions(+), 21 deletions(-) create mode 100644 typings/IGithubProfile.ts diff --git a/__tests__/commands/add.test.ts b/__tests__/commands/add.test.ts index 33fa745..19886d9 100644 --- a/__tests__/commands/add.test.ts +++ b/__tests__/commands/add.test.ts @@ -1,7 +1,7 @@ import Add from '../../src/commands/add'; -import { message as mockMessage } from '../mocks/discord'; +import { message as mockMessage, MockedMessage } from '../mocks/discord'; -let sendMock; +let sendMock: MockedMessage; beforeEach(() => { sendMock = jest.fn(); mockMessage.channel.send = sendMock; diff --git a/__tests__/commands/gitProfile.test.ts b/__tests__/commands/gitProfile.test.ts index 2c34f4c..a791558 100644 --- a/__tests__/commands/gitProfile.test.ts +++ b/__tests__/commands/gitProfile.test.ts @@ -2,15 +2,15 @@ import axios from 'axios'; import GitProfile from '../../src/commands/gitProfile'; import mocked from '../helpers/mocked'; import mockGithubProfile from '../mockData/githubProfile'; -import { message as mockMessage } from '../mocks/discord'; +import { message as mockMessage, MockedMessage } from '../mocks/discord'; jest.mock('axios'); -let sendMock; +let sendMock: MockedMessage; beforeEach(() => { jest.resetModules(); sendMock = jest.fn(); - mockMessage.channel.send = sendMock; + mockMessage.channel.send = sendMock as any; }); describe('GitProfile Command', () => { diff --git a/__tests__/commands/lmgtfy.test.ts b/__tests__/commands/lmgtfy.test.ts index 6b303c7..34e5d9e 100644 --- a/__tests__/commands/lmgtfy.test.ts +++ b/__tests__/commands/lmgtfy.test.ts @@ -1,7 +1,7 @@ import Lmgtfy from '../../src/commands/lmgtfy'; -import { message as mockMessage } from '../mocks/discord'; +import { message as mockMessage, MockedMessage } from '../mocks/discord'; -let sendMock; +let sendMock: MockedMessage; beforeEach(() => { sendMock = jest.fn(); mockMessage.channel.send = sendMock; diff --git a/__tests__/commands/magic8ball.test.ts b/__tests__/commands/magic8ball.test.ts index eee5e1b..866ff4e 100644 --- a/__tests__/commands/magic8ball.test.ts +++ b/__tests__/commands/magic8ball.test.ts @@ -1,7 +1,7 @@ import Magic8Ball from '../../src/commands/magic8ball'; -import { message as mockMessage } from '../mocks/discord'; +import { message as mockMessage, MockedMessage } from '../mocks/discord'; -let sendMock; +let sendMock: MockedMessage; beforeEach(() => { sendMock = jest.fn(); mockMessage.channel.send = sendMock; diff --git a/__tests__/commands/rules.test.ts b/__tests__/commands/rules.test.ts index 4bf9d0e..69ee48c 100644 --- a/__tests__/commands/rules.test.ts +++ b/__tests__/commands/rules.test.ts @@ -1,8 +1,8 @@ import Rules from '../../src/commands/rules'; -import { message as mockMessage } from '../mocks/discord'; +import { message as mockMessage, MockedMessage } from '../mocks/discord'; -let sendMock; +let sendMock: MockedMessage; beforeEach(() => { sendMock = jest.fn(); mockMessage.channel.send = sendMock; diff --git a/__tests__/commands/say.test.ts b/__tests__/commands/say.test.ts index 9f59002..14aa02c 100644 --- a/__tests__/commands/say.test.ts +++ b/__tests__/commands/say.test.ts @@ -1,8 +1,8 @@ import Say from '../../src/commands/say'; -import { message as mockMessage } from '../mocks/discord'; +import { message as mockMessage, MockedMessage } from '../mocks/discord'; -let sendMock; +let sendMock: MockedMessage; beforeEach(() => { sendMock = jest.fn(); mockMessage.channel.send = sendMock; diff --git a/__tests__/commands/source.test.ts b/__tests__/commands/source.test.ts index 1b4eec7..762253b 100644 --- a/__tests__/commands/source.test.ts +++ b/__tests__/commands/source.test.ts @@ -1,7 +1,7 @@ -import { message as mockMessage } from '../mocks/discord'; +import { message as mockMessage, MockedMessage } from '../mocks/discord'; import Source from './../../src/commands/source'; -let sendMock; +let sendMock: MockedMessage; beforeEach(() => { sendMock = jest.fn(); mockMessage.channel.send = sendMock; diff --git a/__tests__/commands/version.test.ts b/__tests__/commands/version.test.ts index 9532137..7f8dbc1 100644 --- a/__tests__/commands/version.test.ts +++ b/__tests__/commands/version.test.ts @@ -1,7 +1,8 @@ -import { message as mockMessage } from '../mocks/discord'; +import { Message } from 'discord.js'; +import { message as mockMessage, MockedMessage } from '../mocks/discord'; import Version from './../../src/commands/version'; -let sendMock; +let sendMock: MockedMessage; beforeEach(() => { sendMock = jest.fn(); mockMessage.channel.send = sendMock; diff --git a/__tests__/commands/xmas.test.ts b/__tests__/commands/xmas.test.ts index d42955d..106400e 100644 --- a/__tests__/commands/xmas.test.ts +++ b/__tests__/commands/xmas.test.ts @@ -1,7 +1,7 @@ import Xmas from '../../src/commands/xmas'; -import { message as mockMessage } from '../mocks/discord'; +import { message as mockMessage, MockedMessage } from '../mocks/discord'; -let sendMock; +let sendMock: MockedMessage; beforeEach(() => { sendMock = jest.fn(); mockMessage.channel.send = sendMock; diff --git a/__tests__/mockData/githubProfile.ts b/__tests__/mockData/githubProfile.ts index cee2c04..8466f16 100644 --- a/__tests__/mockData/githubProfile.ts +++ b/__tests__/mockData/githubProfile.ts @@ -31,4 +31,4 @@ export default { following: 131, created_at: "2010-09-26T21:31:50Z", updated_at: "2018-09-05T16:21:19Z" -}; +} as IGithubProfile; diff --git a/__tests__/mocks/discord.ts b/__tests__/mocks/discord.ts index 81bff1c..185627b 100644 --- a/__tests__/mocks/discord.ts +++ b/__tests__/mocks/discord.ts @@ -1,10 +1,12 @@ import { Client, Guild, Message, TextChannel } from 'discord.js'; +import { type } from 'os'; jest.mock('discord.js'); export const client = new Client(); export const guild = new Guild(client, {}); export const textChannel = new TextChannel(guild, {}); -export const message = new Message(textChannel, false, client); +export const message = new Message(textChannel, false as any, client); +export type MockedMessage = jest.MockInstance>; message.channel = textChannel; diff --git a/typings/IGithubProfile.ts b/typings/IGithubProfile.ts new file mode 100644 index 0000000..273d446 --- /dev/null +++ b/typings/IGithubProfile.ts @@ -0,0 +1,34 @@ + +interface IGithubProfile { + login: string; + id: number; + node_id: string; + avatar_url: string; + gravatar_id: string; + url: string; + html_url: string; + followers_url: string; + following_url: string; + gists_url: string; + starred_url: string; + subscriptions_url: string; + organizations_url: string; + repos_url: string; + events_url: string; + received_events_url: string; + type: string; + site_admin: boolean; + name: string|null; + company: string|null; + blog: string; + location: string|null; + email: string|null; + hireable: boolean; + bio: string|null; + public_repos: number; + public_gists: number; + followers: number; + following: number; + created_at: string; + updated_at: string; +} From 45d8bd25566efd6f2a4fd6b1055fc10cded243f7 Mon Sep 17 00:00:00 2001 From: Cody Swartz Date: Tue, 6 Nov 2018 00:56:37 -0800 Subject: [PATCH 05/20] The easy way out... --- __tests__/mocks/discord.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__tests__/mocks/discord.ts b/__tests__/mocks/discord.ts index 185627b..6c36f1a 100644 --- a/__tests__/mocks/discord.ts +++ b/__tests__/mocks/discord.ts @@ -7,6 +7,6 @@ export const client = new Client(); export const guild = new Guild(client, {}); export const textChannel = new TextChannel(guild, {}); export const message = new Message(textChannel, false as any, client); -export type MockedMessage = jest.MockInstance>; +export type MockedMessage = jest.MockInstance> | any; message.channel = textChannel; From b2efc7adadffadc9b538f50c4954be62f68c4e90 Mon Sep 17 00:00:00 2001 From: Cody Swartz Date: Tue, 20 Nov 2018 00:00:38 -0800 Subject: [PATCH 06/20] Remove unused import --- __tests__/mocks/discord.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/__tests__/mocks/discord.ts b/__tests__/mocks/discord.ts index 6c36f1a..f887add 100644 --- a/__tests__/mocks/discord.ts +++ b/__tests__/mocks/discord.ts @@ -1,5 +1,4 @@ import { Client, Guild, Message, TextChannel } from 'discord.js'; -import { type } from 'os'; jest.mock('discord.js'); From 3163875527ec3983f42ca8f1bfcf6151abd83f1a Mon Sep 17 00:00:00 2001 From: Cody Swartz Date: Tue, 20 Nov 2018 00:02:51 -0800 Subject: [PATCH 07/20] Typing cleanup on git profile test --- __tests__/commands/gitProfile.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__tests__/commands/gitProfile.test.ts b/__tests__/commands/gitProfile.test.ts index a791558..47404bf 100644 --- a/__tests__/commands/gitProfile.test.ts +++ b/__tests__/commands/gitProfile.test.ts @@ -10,7 +10,7 @@ let sendMock: MockedMessage; beforeEach(() => { jest.resetModules(); sendMock = jest.fn(); - mockMessage.channel.send = sendMock as any; + mockMessage.channel.send = sendMock; }); describe('GitProfile Command', () => { From a1e6ea1b4919717fd69c725d864d6de3262217c5 Mon Sep 17 00:00:00 2001 From: Cody Swartz Date: Tue, 20 Nov 2018 00:03:37 -0800 Subject: [PATCH 08/20] Add welcome channel env var to template --- .env-example | 1 + 1 file changed, 1 insertion(+) diff --git a/.env-example b/.env-example index ad2236c..36552a2 100644 --- a/.env-example +++ b/.env-example @@ -1,4 +1,5 @@ #DEFAULT_CHANNEL=CHANGEME +#WELCOME_CHANNEL=CHANGEME DISCORD_APP_TOKEN=CHANGEME GOOGLE_API_KEY=CHANGEME GOOGLE_SEARCH_ENGINE_ID=CHANGEME From e9cdabbb802d06c1bd7065b82b3ff474d925a619 Mon Sep 17 00:00:00 2001 From: Cody Swartz Date: Tue, 20 Nov 2018 00:44:24 -0800 Subject: [PATCH 09/20] Add Search Tests; Intermission --- __tests__/commands/search.test.ts | 45 +++++++++++++++++++++++++++++++ __tests__/mockData/search.ts | 19 +++++++++++++ src/commands/search.ts | 14 ++++------ 3 files changed, 69 insertions(+), 9 deletions(-) create mode 100644 __tests__/commands/search.test.ts create mode 100644 __tests__/mockData/search.ts diff --git a/__tests__/commands/search.test.ts b/__tests__/commands/search.test.ts new file mode 100644 index 0000000..b09906d --- /dev/null +++ b/__tests__/commands/search.test.ts @@ -0,0 +1,45 @@ +import axios from 'axios'; +import Search from '../../src/commands/search'; +import config from '../../src/config'; +import mocked from '../helpers/mocked'; +import { message as mockMessage, MockedMessage } from '../mocks/discord'; +import { noResults, results } from './../mockData/search'; + +jest.mock('axios'); +jest.mock('../../src/config.ts'); + +let sendMock: MockedMessage; +beforeEach(() => { + sendMock = jest.fn(); + mockMessage.channel.send = sendMock; + mockMessage.reply = sendMock; + config.googleApiKey = 'abc123'; + config.googleSearchEngineId = '12345678910:some-thing'; +}); + +const setupRequiredMessage = 'Setup Required: Configure Google API keys in the environment variables'; + +describe('Search Command', async () => { + describe('Environment Variables', () => { + test('Setup message when missing Google API Key ENV Var', async () => { + config.googleApiKey = undefined; + await Search.execute(['Missing Google API Key'], mockMessage); + expect(sendMock).lastCalledWith(setupRequiredMessage); + }); + test('Setup message when missing Google Search Engine ID ENV Var', async () => { + config.googleSearchEngineId = undefined; + await Search.execute(['Missing Google Search Engine ID'], mockMessage); + expect(sendMock).lastCalledWith(setupRequiredMessage); + }); + }); + test('With no results', async () => { + mocked(axios.get).mockResolvedValue({ data: noResults }); + await Search.execute(['Nothing here'], mockMessage); + expect(sendMock).lastCalledWith('`No results found.`'); + }); + test('With results', async () => { + mocked(axios.get).mockResolvedValue({ data: results }); + await Search.execute(['dingusy'], mockMessage); + expect(sendMock).lastCalledWith(results.items[0].link); + }); +}); diff --git a/__tests__/mockData/search.ts b/__tests__/mockData/search.ts new file mode 100644 index 0000000..75f63a2 --- /dev/null +++ b/__tests__/mockData/search.ts @@ -0,0 +1,19 @@ + +export const noResults = { + queries: { + request: [ + { totalResults: 0 } + ] + } +}; + +export const results = { + queries: { + request: [ + { totalResults: 1 } + ] + }, + items: [ + { link: 'https://www.google.com/'} + ] +}; diff --git a/src/commands/search.ts b/src/commands/search.ts index d94293f..3efd178 100644 --- a/src/commands/search.ts +++ b/src/commands/search.ts @@ -14,23 +14,19 @@ export default Search = class { public static execute(args: string[], msg: Message) { if (!config.googleApiKey || !config.googleSearchEngineId) { - msg.reply('Setup Required: Configure Google API keys in the environment variables'); + return msg.reply('Setup Required: Configure Google API keys in the environment variables'); } const { channel } = msg; const parameters = `key=${config.googleApiKey}&cx=${config.googleSearchEngineId}&safe=off&q=${encodeURI(args[0])}`; const url = `https://www.googleapis.com/customsearch/v1?${parameters}`; - axios.get(url).then((response: AxiosResponse) => { - console.log(response.data); - if (response.data.queries.request[0].totalResults === '0') { - channel.send('`No results found.`'); + return axios.get(url).then((response: AxiosResponse): Promise => { + if (response.data.queries.request[0].totalResults === 0) { + return channel.send('`No results found.`'); } else { - channel.send(response.data.items[0].link).catch(() => { - console.log('response error...'); - // return msg.reply('Sorry, I had a problem getting a response from google.'); - }); + return channel.send(response.data.items[0].link); } }).catch((err: string) => { console.error(err); From 98932fc4bea78a07424080c5627b4d87a34d4f10 Mon Sep 17 00:00:00 2001 From: Cody Swartz Date: Tue, 20 Nov 2018 01:30:29 -0800 Subject: [PATCH 10/20] Get search command up to 100% test coverage --- __tests__/commands/search.test.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/__tests__/commands/search.test.ts b/__tests__/commands/search.test.ts index b09906d..06a88f7 100644 --- a/__tests__/commands/search.test.ts +++ b/__tests__/commands/search.test.ts @@ -42,4 +42,9 @@ describe('Search Command', async () => { await Search.execute(['dingusy'], mockMessage); expect(sendMock).lastCalledWith(results.items[0].link); }); + test('Malformed Response', async () => { + mocked(axios.get).mockResolvedValue({ data: {} }); + await Search.execute(['NOPE'], mockMessage); + expect(sendMock).lastCalledWith("I'm Sorry Dave, I'm afraid I can't do that..."); + }); }); From 1423d25ad9ce9015230775e7765c29ae5233927b Mon Sep 17 00:00:00 2001 From: Cody Swartz Date: Thu, 22 Nov 2018 01:37:07 -0800 Subject: [PATCH 11/20] Refactors index into core This will allow for easier testing (I hope) This also sets the foundation to move to a more modular system/additional plugins besides just commands. Adds logic for ENV var for welcome channel --- src/config.ts | 3 ++- src/index.ts | 61 +++++++------------------------------------ src/library/core.ts | 63 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 52 deletions(-) create mode 100644 src/library/core.ts diff --git a/src/config.ts b/src/config.ts index 93f34b1..79b42f5 100644 --- a/src/config.ts +++ b/src/config.ts @@ -8,7 +8,8 @@ const defaults = { discordAppToken: process.env.DISCORD_APP_TOKEN, env: process.env.NODE_ENV || 'production', messagePrefix: process.env.MESSAGE_PREFIX || '!', - production: process.env.NODE_ENV === 'production' + production: process.env.NODE_ENV === 'production', + get welcomeChannel() { return process.env.WELCOME_CHANNEL || this.defaultChannel; } }; const plugins = { diff --git a/src/index.ts b/src/index.ts index 81f973f..803998e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,61 +1,20 @@ import { Client } from 'discord.js'; import config from './config'; -import CommandParser from './library/commandParser'; -import Commands from './library/commands'; +import Core from './library/core'; -const bot = new Client(); -const cmdParser = new CommandParser(config.messagePrefix); -const commands = new Commands(); +const client = new Client(); +const core = new Core(client); -bot.on('ready', () => { - console.log(`Ready to serve in ${bot.channels.size} channels on ${bot.guilds.size} servers` + - `, for a total of ${bot.users.size} users.`); - console.log(`Servers: ${bot.guilds.map(g => g.name).join(', ')}`); -}); +client.on('ready', () => core.ready); -bot.on('message', msg => { - const parsedCommand = cmdParser.parse(msg.content); - - if (!parsedCommand) { - return; - } - - const { commandName, args } = parsedCommand; - const { channel } = msg; - - try { - const command = commands.get(commandName); - if (command) { - return command.execute(args, msg, bot); - } - else { - return channel.send(`Command not found: ${commandName}`); - } - } - catch ( error ) { - console.error(`Error on command: ${commandName} \n${error}`); - } -}); +client.on('message', core.message); if (config.env === 'production') { - bot.on('guildMemberAdd', (member) => { - const { username, id } = member.user; - console.log(`New User '${username}' has joined '${member.guild.name}'`); - - const defaultChannel = member.guild.defaultChannel - || member.guild.channels.find('name', config.defaultChannel); - - if (defaultChannel) { - defaultChannel.send(`'${username}' has joined this server`); - defaultChannel.send(`Welcome, <@${id}> !`); - } - else { - console.warn('This server has no defaultChannel property. (It might be too new.) ' + - 'If you are running the bot locally, please specify the default channel in .env.'); - } - }); + client.on('guildMemberAdd', core.guildMemberAdd); } -bot.on('error', e => { console.error(e); }); +client.on('error', e => { console.error(e); }); + +client.login(config.discordAppToken); -bot.login(config.discordAppToken); +export default client; diff --git a/src/library/core.ts b/src/library/core.ts new file mode 100644 index 0000000..1468237 --- /dev/null +++ b/src/library/core.ts @@ -0,0 +1,63 @@ + +import { Client, GuildMember, Message, TextChannel } from 'discord.js'; +import config from '../config'; +import CommandParser from './commandParser'; +import Commands from './commands'; + +const cmdParser = new CommandParser(config.messagePrefix); +const commands = new Commands(); + +export default class Core { + + constructor(public client: Client) { } + + public ready() { + console.log( + `Ready to serve in ${this.client.channels.size} channels on ${this.client.guilds.size} servers, ` + + `for a total of ${this.client.users.size} users.\n` + + `Servers: ${this.client.guilds.map(g => g.name).join(', ')}` + ); + } + + public message(msg: Message) { + const parsedCommand = cmdParser.parse(msg.content); + + if (!parsedCommand) { + return; + } + + const { commandName, args } = parsedCommand; + const { channel } = msg; + + try { + const command = commands.get(commandName); + if (command) { + return command.execute(args, msg, this.client); + } + else { + return channel.send(`Command not found: ${commandName}`); + } + } + catch (error) { + console.error(`Error on command: ${commandName} \n${error}`); + } + } + + public guildMemberAdd(member: GuildMember) { + const { username, id } = member.user; + console.log(`New User '${username}' has joined '${member.guild.name}'`); + + const configChannel = config.welcomeChannel ? member.guild.channels.find('name', config.welcomeChannel) : undefined; + const defaultChannel = configChannel || member.guild.defaultChannel; + + if (defaultChannel && defaultChannel instanceof TextChannel) { + defaultChannel.send(`'${username}' has joined this server`); + defaultChannel.send(`Welcome, <@${id}> !`); + } + else { + console.warn('This server has no defaultChannel property. (It might be too new.) ' + + 'If you are running the bot locally, please specify the default channel in .env. ' + + 'Make sure the channel is a text channel.'); + } + } +} From 4eb6d4fd5ab30479dfc7328364850bb858fe0ffe Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Tue, 12 Feb 2019 00:58:29 +0000 Subject: [PATCH 12/20] fix(package): update @types/node to version 11.9.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5e593df..775e5c6 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@types/glob": "^5.0.35", "@types/jest": "^24.0.0", "@types/lodash.camelcase": "^4.3.4", - "@types/node": "^10.12.18", + "@types/node": "^11.9.0", "axios": "^0.18.0", "discord.js": "^11.4.2", "dotenv": "^6.1.0", From d874dd77a6f6f50e0f24ea04fb9fb5b4f453bd05 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Tue, 12 Feb 2019 00:58:33 +0000 Subject: [PATCH 13/20] chore(package): update lockfile package-lock.json --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5fbfba1..c76839d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -79,9 +79,9 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "10.12.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", - "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.9.0.tgz", + "integrity": "sha512-ry4DOrC+xenhQbzk1iIPzCZGhhPGEFv7ia7Iu6XXSLVluiJIe9FfG7Iu3mObH9mpxEXCWLCMU4JWbCCR9Oy1Zg==" }, "abab": { "version": "2.0.0", From 8f3e9a0e7d72af2c980b8cce8ddc01d2ae0318c1 Mon Sep 17 00:00:00 2001 From: Cody Swartz Date: Tue, 12 Feb 2019 01:21:37 -0800 Subject: [PATCH 14/20] Further handle silent package conflicts Based mainly on dev. --- package-lock.json | 76 +++++++++++++++++++++++++++++++++-------------- package.json | 16 +++------- 2 files changed, 58 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index ba69a8c..39a5649 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,7 @@ "version": "0.14.0", "resolved": "https://registry.npmjs.org/@types/axios/-/axios-0.14.0.tgz", "integrity": "sha1-7CMA++fX3d1+udOr+HmZlkyvzkY=", + "dev": true, "requires": { "axios": "*" } @@ -36,14 +37,15 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-6.1.0.tgz", "integrity": "sha512-gmbNb7V1LbJQA4MmH0hVFgqY1cyKsa6RvKC1Xrq0WBnZ0JuuvXKciXx/s8dN0LVXCJd8xO6wIaSFSyUIoGph9g==", + "dev": true, "requires": { "@types/node": "*" } }, "@types/events": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", - "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", "dev": true }, "@types/glob": { @@ -60,17 +62,20 @@ "@types/jest": { "version": "24.0.0", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.0.tgz", - "integrity": "sha512-kOafJnUTnMd7/OfEO/x3I47EHswNjn+dbz9qk3mtonr1RvKT+1FGVxnxAx08I9K8Tl7j9hpoJRE7OCf+t10fng==" + "integrity": "sha512-kOafJnUTnMd7/OfEO/x3I47EHswNjn+dbz9qk3mtonr1RvKT+1FGVxnxAx08I9K8Tl7j9hpoJRE7OCf+t10fng==", + "dev": true }, "@types/lodash": { "version": "4.14.116", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.116.tgz", - "integrity": "sha512-lRnAtKnxMXcYYXqOiotTmJd74uawNWuPnsnPrrO7HiFuE3npE2iQhfABatbYDyxTNqZNuXzcKGhw37R7RjBFLg==" + "integrity": "sha512-lRnAtKnxMXcYYXqOiotTmJd74uawNWuPnsnPrrO7HiFuE3npE2iQhfABatbYDyxTNqZNuXzcKGhw37R7RjBFLg==", + "dev": true }, "@types/lodash.camelcase": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/@types/lodash.camelcase/-/lodash.camelcase-4.3.4.tgz", "integrity": "sha512-yx+TmSP3QnhUGdcxkvwV3O++eI6kXKf5E89yJutHR8ebdr5f7KF5XmTBIWrbXFBLo2JIcaBz2axdpe7/WiOT2g==", + "dev": true, "requires": { "@types/lodash": "*" } @@ -78,12 +83,14 @@ "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true }, "@types/node": { "version": "11.9.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-11.9.0.tgz", - "integrity": "sha512-ry4DOrC+xenhQbzk1iIPzCZGhhPGEFv7ia7Iu6XXSLVluiJIe9FfG7Iu3mObH9mpxEXCWLCMU4JWbCCR9Oy1Zg==" + "integrity": "sha512-ry4DOrC+xenhQbzk1iIPzCZGhhPGEFv7ia7Iu6XXSLVluiJIe9FfG7Iu3mObH9mpxEXCWLCMU4JWbCCR9Oy1Zg==", + "dev": true }, "abab": { "version": "2.0.0", @@ -494,7 +501,8 @@ "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true }, "asn1": { "version": "0.2.4", @@ -964,7 +972,8 @@ "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true }, "builtin-modules": { "version": "1.1.1", @@ -1352,7 +1361,8 @@ "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true }, "discord.js": { "version": "11.4.2", @@ -1766,12 +1776,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1786,17 +1798,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -1913,7 +1928,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -1925,6 +1941,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -1939,6 +1956,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1946,12 +1964,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -1970,6 +1990,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2050,7 +2071,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2062,6 +2084,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2184,6 +2207,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -3528,7 +3552,8 @@ "make-error": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true }, "makeerror": { "version": "1.0.11", @@ -3637,7 +3662,8 @@ "minimist": { "version": "0.0.8", "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true }, "mixin-deep": { "version": "1.3.1", @@ -3664,6 +3690,7 @@ "version": "0.5.1", "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" } @@ -4970,6 +4997,7 @@ "version": "0.5.9", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -4978,7 +5006,8 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -5311,6 +5340,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, "requires": { "arrify": "^1.0.0", "buffer-from": "^1.1.0", @@ -5325,7 +5355,8 @@ "minimist": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, @@ -5792,7 +5823,8 @@ "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true } } } diff --git a/package.json b/package.json index c9a423f..d392f85 100644 --- a/package.json +++ b/package.json @@ -22,28 +22,20 @@ "author": "osu-cascades", "license": "MIT", "dependencies": { - "@types/axios": "^0.14.0", - "@types/dotenv": "^6.1.0", - "@types/glob": "^5.0.35", - "@types/jest": "^24.0.0", - "@types/lodash.camelcase": "^4.3.4", - "@types/node": "^11.9.0", "axios": "^0.18.0", "discord.js": "^11.4.2", "dotenv": "^6.1.0", "glob": "^7.1.3", "lodash.camelcase": "^4.3.0", - "moment": "^2.22.2", - "ts-node": "^7.0.1", - "typescript": "^3.0.3" + "moment": "^2.22.2" }, "devDependencies": { "@types/axios": "^0.14.0", - "@types/dotenv": "^4.0.3", + "@types/dotenv": "^6.1.0", "@types/glob": "^7.1.1", - "@types/jest": "^23.3.9", + "@types/jest": "^24.0.0", "@types/lodash.camelcase": "^4.3.4", - "@types/node": "^10.12.2", + "@types/node": "^11.9.0", "jest": "^23.6.0", "ts-jest": "^23.10.4", "ts-node": "^7.0.1", From 4b17426bfb33cd453eed577d7fcb62141b5f79b5 Mon Sep 17 00:00:00 2001 From: Cody Swartz Date: Wed, 13 Mar 2019 02:10:29 -0700 Subject: [PATCH 15/20] Fix command loader tests --- __tests__/library/commandLoader.test.ts | 4 +++- __tests__/mockData/githubProfile.ts | 2 +- src/commands/gitProfile.ts | 2 +- src/commands/{ => interfaces}/iGithubProfile.ts | 0 src/library/commands.ts | 4 +++- 5 files changed, 8 insertions(+), 4 deletions(-) rename src/commands/{ => interfaces}/iGithubProfile.ts (100%) diff --git a/__tests__/library/commandLoader.test.ts b/__tests__/library/commandLoader.test.ts index d035074..8573a77 100644 --- a/__tests__/library/commandLoader.test.ts +++ b/__tests__/library/commandLoader.test.ts @@ -1,9 +1,10 @@ import glob from 'glob'; import CommandLoader, { ICommandClasses } from '../../src/library/commandLoader'; +import { COMMANDS_PATH_GLOB } from './../../src/library/commands'; describe('CommandLoader', () => { let commandClasses: ICommandClasses; - const files = glob.sync('./src/commands/**/*.ts'); + const files = glob.sync(COMMANDS_PATH_GLOB); beforeEach(() => { commandClasses = CommandLoader.getCommandClasses(files); @@ -23,6 +24,7 @@ describe('CommandLoader', () => { commandName = commandName.replace(/^\w/, (char) => { return char.toUpperCase(); }); + expect(commandClass).toBeDefined(); expect(commandName).toEqual(commandClass.name); } }); diff --git a/__tests__/mockData/githubProfile.ts b/__tests__/mockData/githubProfile.ts index e5fcba6..90e69f8 100644 --- a/__tests__/mockData/githubProfile.ts +++ b/__tests__/mockData/githubProfile.ts @@ -1,4 +1,4 @@ -import IGithubProfile from "../../src/commands/iGithubProfile"; +import IGithubProfile from "../../src/commands/interfaces/iGithubProfile"; export default { login: "ctsstc", diff --git a/src/commands/gitProfile.ts b/src/commands/gitProfile.ts index bf3b98c..c3311c0 100644 --- a/src/commands/gitProfile.ts +++ b/src/commands/gitProfile.ts @@ -2,7 +2,7 @@ import axios from 'axios'; import { Message } from 'discord.js'; import moment from 'moment'; import ICommand from '../library/iCommand'; -import IGithubProfile from './iGithubProfile'; +import IGithubProfile from './interfaces/iGithubProfile'; let GitProfile: ICommand; diff --git a/src/commands/iGithubProfile.ts b/src/commands/interfaces/iGithubProfile.ts similarity index 100% rename from src/commands/iGithubProfile.ts rename to src/commands/interfaces/iGithubProfile.ts diff --git a/src/library/commands.ts b/src/library/commands.ts index 484ec7b..28f3abf 100644 --- a/src/library/commands.ts +++ b/src/library/commands.ts @@ -3,6 +3,8 @@ import config from '../config'; import CommandLoader, { ICommandClasses } from './commandLoader'; import Command from './iCommand'; +export const COMMANDS_PATH_GLOB = './src/commands/*.ts'; + // TODO: debateable whether we even need this wrapper class /** * @class Commands @@ -13,7 +15,7 @@ export default class Commands { private commandFiles: string[]; constructor() { - this.commandFiles = glob.sync('./src/commands/**/*.ts'); + this.commandFiles = glob.sync(COMMANDS_PATH_GLOB); this.all = CommandLoader.getCommandClasses(this.commandFiles); } From b9ffb4b324a2f9267518800becfff925f917e16e Mon Sep 17 00:00:00 2001 From: Cody Swartz Date: Wed, 13 Mar 2019 02:38:02 -0700 Subject: [PATCH 16/20] Fix git profile tests --- __tests__/commands/gitProfile.test.ts | 6 +++--- __tests__/mocks/discord.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/__tests__/commands/gitProfile.test.ts b/__tests__/commands/gitProfile.test.ts index fb3fa63..1fbfa32 100644 --- a/__tests__/commands/gitProfile.test.ts +++ b/__tests__/commands/gitProfile.test.ts @@ -1,6 +1,6 @@ import axios from 'axios'; import GitProfile from '../../src/commands/gitProfile'; -import IGithubProfile from '../../src/commands/iGithubProfile'; +import IGithubProfile from '../../src/commands/interfaces/iGithubProfile'; import mocked from '../helpers/mocked'; import mockGithubProfile from '../mockData/githubProfile'; import { message as mockMessage, MockedMessage } from '../mocks/discord'; @@ -38,14 +38,14 @@ describe('GitProfile Command', () => { mockGithubProfile.name = null; mockGithubProfile.company = null; mockGithubProfile.location = null; - mocked(axios.request).mockResolvedValue({data: mockGithubProfile}); + mocked(axios.request).mockResolvedValue({data: mockGithubProfile}); await GitProfile.execute(['ctsstc'], mockMessage); const sentMessage = sendMock.mock.calls[0][0]; expect(sentMessage.startsWith(`[${mockGithubProfile.type}] with`)); }); test('Requests API using username', async () => { await GitProfile.execute(['ctsstc'], mockMessage); - const requestOptions = mocked(axios.request).mock.calls[0][0]; + const requestOptions = mocked(axios.request).mock.calls[0][0]; expect(requestOptions.url).toContain('api.github.com/users/ctsstc'); }); }); diff --git a/__tests__/mocks/discord.ts b/__tests__/mocks/discord.ts index f887add..dc52079 100644 --- a/__tests__/mocks/discord.ts +++ b/__tests__/mocks/discord.ts @@ -6,6 +6,6 @@ export const client = new Client(); export const guild = new Guild(client, {}); export const textChannel = new TextChannel(guild, {}); export const message = new Message(textChannel, false as any, client); -export type MockedMessage = jest.MockInstance> | any; +export type MockedMessage = jest.MockInstance, any> | any; message.channel = textChannel; From a18eb34a8b9b9ab596af844af19fb53daaf03d7b Mon Sep 17 00:00:00 2001 From: Cody Swartz Date: Thu, 14 Mar 2019 01:58:45 -0700 Subject: [PATCH 17/20] Mock Axios, get tests passing, remove mocked helper --- __tests__/__mocks__/axios.ts | 8 ++++++++ __tests__/commands/gitProfile.test.ts | 11 +++++------ __tests__/commands/search.test.ts | 14 ++++++++------ __tests__/helpers/mocked.ts | 6 ------ 4 files changed, 21 insertions(+), 18 deletions(-) create mode 100644 __tests__/__mocks__/axios.ts delete mode 100644 __tests__/helpers/mocked.ts diff --git a/__tests__/__mocks__/axios.ts b/__tests__/__mocks__/axios.ts new file mode 100644 index 0000000..ac5c2e9 --- /dev/null +++ b/__tests__/__mocks__/axios.ts @@ -0,0 +1,8 @@ +export default { + get: jest.fn().mockResolvedValue({ + data: {} + }), + request: jest.fn().mockResolvedValue({ + data: {} + }) +}; diff --git a/__tests__/commands/gitProfile.test.ts b/__tests__/commands/gitProfile.test.ts index 1fbfa32..55f817b 100644 --- a/__tests__/commands/gitProfile.test.ts +++ b/__tests__/commands/gitProfile.test.ts @@ -1,7 +1,5 @@ -import axios from 'axios'; import GitProfile from '../../src/commands/gitProfile'; -import IGithubProfile from '../../src/commands/interfaces/iGithubProfile'; -import mocked from '../helpers/mocked'; +import axiosMock from '../__mocks__/axios'; import mockGithubProfile from '../mockData/githubProfile'; import { message as mockMessage, MockedMessage } from '../mocks/discord'; @@ -15,12 +13,14 @@ beforeEach(() => { }); describe('GitProfile Command', () => { + beforeEach(() => { + axiosMock.request.mockResolvedValueOnce({data: mockGithubProfile}); + }); test('No username specified', () => { GitProfile.execute([], mockMessage); expect(sendMock).lastCalledWith('Please enter a username.'); }); test('Responds with profile information', async () => { - mocked(axios.request).mockResolvedValue({data: mockGithubProfile}); await GitProfile.execute(['ctsstc'], mockMessage); const sentMessage = sendMock.mock.calls[0][0]; expect(sentMessage).toContain(`[${mockGithubProfile.type}]`); @@ -38,14 +38,13 @@ describe('GitProfile Command', () => { mockGithubProfile.name = null; mockGithubProfile.company = null; mockGithubProfile.location = null; - mocked(axios.request).mockResolvedValue({data: mockGithubProfile}); await GitProfile.execute(['ctsstc'], mockMessage); const sentMessage = sendMock.mock.calls[0][0]; expect(sentMessage.startsWith(`[${mockGithubProfile.type}] with`)); }); test('Requests API using username', async () => { await GitProfile.execute(['ctsstc'], mockMessage); - const requestOptions = mocked(axios.request).mock.calls[0][0]; + const requestOptions = axiosMock.request.mock.calls[0][0]; expect(requestOptions.url).toContain('api.github.com/users/ctsstc'); }); }); diff --git a/__tests__/commands/search.test.ts b/__tests__/commands/search.test.ts index 06a88f7..e66db5b 100644 --- a/__tests__/commands/search.test.ts +++ b/__tests__/commands/search.test.ts @@ -1,7 +1,6 @@ -import axios from 'axios'; import Search from '../../src/commands/search'; import config from '../../src/config'; -import mocked from '../helpers/mocked'; +import axiosMock from '../__mocks__/axios'; import { message as mockMessage, MockedMessage } from '../mocks/discord'; import { noResults, results } from './../mockData/search'; @@ -19,7 +18,7 @@ beforeEach(() => { const setupRequiredMessage = 'Setup Required: Configure Google API keys in the environment variables'; -describe('Search Command', async () => { +describe('Search Command', () => { describe('Environment Variables', () => { test('Setup message when missing Google API Key ENV Var', async () => { config.googleApiKey = undefined; @@ -33,17 +32,20 @@ describe('Search Command', async () => { }); }); test('With no results', async () => { - mocked(axios.get).mockResolvedValue({ data: noResults }); + const mockedData = Promise.resolve({ data: noResults }); + axiosMock.get.mockResolvedValueOnce(mockedData); await Search.execute(['Nothing here'], mockMessage); expect(sendMock).lastCalledWith('`No results found.`'); }); test('With results', async () => { - mocked(axios.get).mockResolvedValue({ data: results }); + const mockedData = Promise.resolve({ data: results }); + axiosMock.get.mockResolvedValueOnce(mockedData); await Search.execute(['dingusy'], mockMessage); expect(sendMock).lastCalledWith(results.items[0].link); }); test('Malformed Response', async () => { - mocked(axios.get).mockResolvedValue({ data: {} }); + const mockedData = Promise.resolve({ data: {} }); + axiosMock.get.mockResolvedValueOnce(mockedData); await Search.execute(['NOPE'], mockMessage); expect(sendMock).lastCalledWith("I'm Sorry Dave, I'm afraid I can't do that..."); }); diff --git a/__tests__/helpers/mocked.ts b/__tests__/helpers/mocked.ts deleted file mode 100644 index e318039..0000000 --- a/__tests__/helpers/mocked.ts +++ /dev/null @@ -1,6 +0,0 @@ - -// Thanks @huafu - https://github.com/kulshekhar/ts-jest/issues/472 -export default function mocked(val: T): - T extends (...args: any[]) => any ? jest.MockInstance : jest.Mocked { - return val as any; -} From 7a5cf28da5c96615360baa74ccb8b61851373324 Mon Sep 17 00:00:00 2001 From: Cody Swartz Date: Thu, 14 Mar 2019 02:16:57 -0700 Subject: [PATCH 18/20] =?UTF-8?q?Jest=20caching=20fails!=20Now=20all=20tes?= =?UTF-8?q?ts=20pass=20=F0=9F=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/commands/search.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/commands/search.ts b/src/commands/search.ts index 3efd178..f8fb7e8 100644 --- a/src/commands/search.ts +++ b/src/commands/search.ts @@ -22,7 +22,14 @@ export default Search = class { const url = `https://www.googleapis.com/customsearch/v1?${parameters}`; return axios.get(url).then((response: AxiosResponse): Promise => { - if (response.data.queries.request[0].totalResults === 0) { + const hasQueries = 'queries' in response.data; + if (!hasQueries) { + const jsonData = JSON.stringify(response.data); + const errorMessage = `Malformed Google Search Response: ${jsonData}`; + channel.send(errorMessage); + return Promise.reject(errorMessage); + } + else if (response.data.queries.request[0].totalResults === 0) { return channel.send('`No results found.`'); } else { From bfe10be3c1e1c7df46c692aba4afd5905ac31fea Mon Sep 17 00:00:00 2001 From: Cody Swartz Date: Thu, 14 Mar 2019 02:21:30 -0700 Subject: [PATCH 19/20] Get git profile tests passing Pesky tests I tell ya! --- __tests__/commands/gitProfile.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/__tests__/commands/gitProfile.test.ts b/__tests__/commands/gitProfile.test.ts index 55f817b..0aa9a8e 100644 --- a/__tests__/commands/gitProfile.test.ts +++ b/__tests__/commands/gitProfile.test.ts @@ -14,7 +14,8 @@ beforeEach(() => { describe('GitProfile Command', () => { beforeEach(() => { - axiosMock.request.mockResolvedValueOnce({data: mockGithubProfile}); + const resolvedData = Promise.resolve({data: mockGithubProfile}); + axiosMock.request.mockResolvedValueOnce(resolvedData); }); test('No username specified', () => { GitProfile.execute([], mockMessage); From c56e9708a6748493aff297d43d5a96894baaa1fb Mon Sep 17 00:00:00 2001 From: Cody Swartz Date: Thu, 14 Mar 2019 02:55:25 -0700 Subject: [PATCH 20/20] Update version to v2.0.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f1464c8..901d0cd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hackbot", - "version": "2.0.0", + "version": "2.0.1", "description": "Discord bot for the Cascades Tech Club Discord server.", "repository": { "type": "git",